Bagikan melalui


Memperluas jendela Output

Jendela Output adalah sekumpulan panel teks baca/tulis. Visual Studio memiliki panel bawaan ini: Build, di mana proyek mengkomunikasikan pesan tentang build, dan Umum, di mana Visual Studio mengkomunikasikan pesan tentang IDE. Proyek mendapatkan referensi ke panel Build secara otomatis melalui IVsBuildableProjectCfg metode antarmuka, dan Visual Studio menawarkan akses langsung ke panel Umum melalui SVsGeneralOutputWindowPane layanan. Selain panel bawaan, Anda bisa membuat dan mengelola panel kustom Anda sendiri.

Anda dapat mengontrol jendela Output langsung melalui IVsOutputWindow antarmuka dan IVsOutputWindowPane . Antarmuka IVsOutputWindow , yang ditawarkan oleh SVsOutputWindow layanan, mendefinisikan metode untuk membuat, mengambil, dan menghancurkan panel jendela Output . Antarmuka IVsOutputWindowPane menentukan metode untuk menampilkan panel, menyembunyikan panel, dan memanipulasi teksnya. Cara alternatif untuk mengontrol jendela Output adalah melalui OutputWindow objek dan OutputWindowPane dalam model objek Visual Studio Automation. Objek-objek ini merangkum hampir semua fungsionalitas IVsOutputWindow antarmuka dan IVsOutputWindowPane . Selain itu, OutputWindow objek dan OutputWindowPane menambahkan beberapa fungsionalitas tingkat yang lebih tinggi untuk mempermudah menghitung panel jendela Output dan untuk mengambil teks dari panel.

Membuat ekstensi yang menggunakan panel Output

Anda dapat membuat ekstensi yang menjalankan berbagai aspek panel Output.

  1. Buat proyek VSIX bernama TestOutput dengan perintah menu bernama TestOutput. Untuk informasi selengkapnya, lihat Membuat ekstensi dengan perintah menu.

  2. Tambahkan referensi berikut:

    1. EnvDTE

    2. EnvDTE80

  3. Di TestOutput.cs, tambahkan pernyataan penggunaan berikut:

    using EnvDTE;
    using EnvDTE80;
    
  4. Di TestOutput.cs, hapus ShowMessageBox metode . Tambahkan stub metode berikut:

    private void OutputCommandHandler(object sender, EventArgs e)
    {
    }
    
  5. Di konstruktor TestOutput, ubah handler perintah menjadi OutputCommandHandler. Berikut adalah bagian yang menambahkan perintah:

    OleMenuCommandService commandService = this.ServiceProvider.GetService(typeof(IMenuCommandService)) as OleMenuCommandService;
    if (commandService != null)
    {
        CommandID menuCommandID = new CommandID(MenuGroup, CommandId);
        EventHandler eventHandler = OutputCommandHandler;
        MenuCommand menuItem = new MenuCommand(eventHandler, menuCommandID);
        commandService.AddCommand(menuItem);
    }
    
  6. Bagian di bawah ini memiliki metode berbeda yang menunjukkan berbagai cara untuk menangani panel Output. Anda dapat memanggil metode ini ke isi OutputCommandHandler() metode . Misalnya, kode berikut menambahkan metode yang CreatePane() diberikan di bagian berikutnya.

    private void OutputCommandHandler(object sender, EventArgs e)
    {
        CreatePane(new Guid(), "Created Pane", true, false);
    }
    

Membuat jendela Output dengan IVsOutputWindow

Contoh ini memperlihatkan cara membuat panel jendela Output baru dengan menggunakan IVsOutputWindow antarmuka .

void CreatePane(Guid paneGuid, string title,
    bool visible, bool clearWithSolution)
{
    IVsOutputWindow output =
        (IVsOutputWindow)GetService(typeof(SVsOutputWindow));
    IVsOutputWindowPane pane;

    // Create a new pane.
    output.CreatePane(
        ref paneGuid,
        title,
        Convert.ToInt32(visible),
        Convert.ToInt32(clearWithSolution));

    // Retrieve the new pane.
    output.GetPane(ref paneGuid, out pane);

     pane.OutputString("This is the Created Pane \n");
}

Jika Anda menambahkan metode ini ke ekstensi yang diberikan di bagian sebelumnya, saat Anda mengklik perintah Panggil TestOutput , Anda akan melihat jendela Output dengan header yang bertuliskan Tampilkan output dari: CreatedPane dan kata-kata Ini adalah Panel Yang Dibuat di panel itu sendiri.

Membuat jendela Output dengan OutputWindow

Contoh ini memperlihatkan cara membuat panel jendela Output dengan menggunakan OutputWindow objek .

void CreatePane(string title)
{
    DTE2 dte = (DTE2)GetService(typeof(DTE));
    OutputWindowPanes panes =
        dte.ToolWindows.OutputWindow.OutputWindowPanes;

    try
    {
        // If the pane exists already, write to it.
        panes.Item(title);
    }
    catch (ArgumentException)
    {
        // Create a new pane and write to it.
        panes.Add(title);
    }
}

OutputWindowPanes Meskipun koleksi memungkinkan Anda mengambil panel jendela Output berdasarkan judulnya, judul panel tidak dijamin unik. Saat Anda meragukan keunikan judul, gunakan GetPane metode untuk mengambil panel yang benar dengan GUID-nya.

Jika Anda menambahkan metode ini ke ekstensi yang diberikan di bagian sebelumnya, saat Anda mengklik perintah Panggil TestOutput , Anda akan melihat jendela Output dengan header yang bertuliskan Tampilkan output dari: DTEPane dan kata-kata Menambahkan Panel DTE di panel itu sendiri.

Menghapus jendela Output

Contoh ini memperlihatkan cara menghapus panel jendela Output .

void DeletePane(Guid paneGuid)
{
    IVsOutputWindow output =
    (IVsOutputWindow)ServiceProvider.GetService(typeof(SVsOutputWindow));

    IVsOutputWindowPane pane;
    output.GetPane(ref paneGuid, out pane);

    if (pane == null)
    {
        CreatePane(paneGuid, "New Pane\n", true, true);
    }
     else
    {
        output.DeletePane(ref paneGuid);
    }
}

Jika Anda menambahkan metode ini ke ekstensi yang diberikan di bagian sebelumnya, saat Anda mengklik perintah Panggil TestOutput , Anda akan melihat jendela Output dengan header yang bertuliskan Tampilkan output dari: Panel Baru dan kata Panel Yang Dibuat Ditambahkan di panel itu sendiri. Jika Anda mengklik perintah Panggil TestOutput lagi, panel akan dihapus.

Mendapatkan panel Umum dari jendela Output

Contoh ini memperlihatkan cara mendapatkan panel Umum bawaan dari jendela Output .

IVsOutputWindowPane GetGeneralPane()
{
    return (IVsOutputWindowPane)GetService(
        typeof(SVsGeneralOutputWindowPane));
}

Jika Anda menambahkan metode ini ke ekstensi yang diberikan di bagian sebelumnya, saat Anda mengklik perintah Panggil TestOutput , Anda akan melihat bahwa jendela Output memperlihatkan kata panel Umum Ditemukan di panel.

Mendapatkan panel Build dari jendela Output

Contoh ini memperlihatkan cara menemukan panel Build dan menulisnya. Karena panel Build tidak diaktifkan secara default, panel tersebut juga mengaktifkannya.

void OutputTaskItemStringExExample(string buildMessage)
{
    EnvDTE80.DTE2 dte = (EnvDTE80.DTE2)ServiceProvider.GetService(typeof(EnvDTE.DTE));

    EnvDTE.OutputWindowPanes panes =
        dte.ToolWindows.OutputWindow.OutputWindowPanes;
    foreach (EnvDTE.OutputWindowPane pane in panes)
        {
            if (pane.Name.Contains("Build"))
            {
                pane.OutputString(buildMessage + "\n");
                pane.Activate();
                return;
             }
        }
}