Catatan
Akses ke halaman ini memerlukan otorisasi. Anda dapat mencoba masuk atau mengubah direktori.
Akses ke halaman ini memerlukan otorisasi. Anda dapat mencoba mengubah direktori.
Untuk menerapkan perintah dalam VSPackage, Anda harus melakukan tugas berikut:
Dalam file .vsct , siapkan grup perintah lalu tambahkan perintah ke dalamnya. Untuk informasi selengkapnya, lihat File tabel perintah Visual Studio (.vsct).
Daftarkan perintah dengan Visual Studio.
Terapkan perintah .
Bagian berikut menjelaskan cara mendaftarkan dan mengimplementasikan perintah.
Mendaftarkan perintah dengan Visual Studio
Jika perintah Anda muncul di menu, Anda harus menambahkan ProvideMenuResourceAttribute ke VSPackage Anda, dan menggunakan sebagai nilai baik nama menu atau ID sumber dayanya.
[ProvideMenuResource("Menus.ctmenu", 1)]
public sealed class MyPackage : Package
{
// ...
}
Selain itu, Anda harus mendaftarkan perintah dengan OleMenuCommandService. Anda bisa mendapatkan layanan ini dengan menggunakan GetService metode jika VSPackage Anda berasal dari Package.
OleMenuCommandService mcs = GetService(typeof(IMenuCommandService)) as OleMenuCommandService;
if (mcs is not null)
{
// Create the command for the menu item.
CommandID menuCommandID = new CommandID(guidCommandGroup, myCommandID);
MenuCommand menuItem = new MenuCommand(MenuItemCallback, menuCommandID);
mcs.AddCommand(menuItem);
}
Menerapkan perintah
Ada sejumlah cara untuk menerapkan perintah. Jika Anda menginginkan perintah menu statis, yang merupakan perintah yang selalu muncul dengan cara yang sama dan pada menu yang sama, buat perintah dengan menggunakan MenuCommand seperti yang ditunjukkan pada contoh di bagian sebelumnya. Untuk membuat perintah statis, Anda harus menyediakan penanganan aktivitas yang bertanggung jawab untuk menjalankan perintah. Karena perintah selalu diaktifkan dan terlihat, Anda tidak perlu memberikan statusnya ke Visual Studio. Jika Anda ingin mengubah status perintah tergantung pada kondisi tertentu, Anda dapat membuat perintah sebagai instans OleMenuCommand kelas dan, di konstruktornya, menyediakan penanganan aktivitas untuk menjalankan perintah dan QueryStatus handler untuk memberi tahu Visual Studio saat status perintah berubah. Anda juga dapat menerapkan IOleCommandTarget sebagai bagian dari kelas perintah atau, Anda dapat menerapkan IVsHierarchy jika Anda menyediakan perintah sebagai bagian dari proyek. Kedua antarmuka dan OleMenuCommand kelas semuanya memiliki metode yang memberi tahu Visual Studio tentang perubahan status perintah, dan metode lain yang menyediakan eksekusi perintah.
Ketika perintah ditambahkan ke layanan perintah, perintah tersebut menjadi salah satu rantai perintah. Ketika Anda menerapkan pemberitahuan status dan metode eksekusi untuk perintah, berhati-hatilah untuk menyediakan hanya untuk perintah tersebut dan meneruskan semua kasus lain ke perintah-perintah lain dalam rantai. Jika Anda gagal meneruskan perintah (biasanya dengan mengembalikan OLECMDERR_E_NOTSUPPORTED), Visual Studio mungkin berhenti berfungsi dengan baik.
Metode QueryStatus
Jika Anda menerapkan QueryStatus metode atau QueryStatusCommand metode , periksa GUID dari set perintah tempat perintah berada dan ID perintah. Ikuti panduan berikut:
Jika GUID tidak dikenali, implementasi Anda dari salah satu metode harus mengembalikan OLECMDERR_E_UNKNOWNGROUP.
Jika implementasi salah satu metode Anda mengenali GUID tetapi belum menerapkan perintah, maka metode harus mengembalikan OLECMDERR_E_NOTSUPPORTED.
Jika implementasi Anda dari salah satu metode mengenali baik GUID maupun perintah, maka metode tersebut harus mengatur bidang flag perintah untuk setiap perintah (dalam
prgCmdsparameter) dengan menggunakan flag berikut OLECMDF :OLECMDF_SUPPORTED: Perintah didukung.OLECMDF_INVISIBLE: Perintah tidak boleh terlihat.OLECMDF_LATCHED: Perintah diaktifkan dan tampaknya telah diperiksa.OLECMDF_ENABLED: Perintah diaktifkan.OLECMDF_DEFHIDEONCTXTMENU: Perintah harus disembunyikan jika muncul di menu pintasan.OLECMDF_NINCHED: Perintah adalah pengontrol menu dan tidak diaktifkan, tetapi daftar menu drop-down-nya tidak kosong dan masih tersedia. (Bendera ini jarang digunakan.)
Jika perintah ditentukan dalam file .vsct dengan
TextChangesbendera , atur parameter berikut:Atur elemen
rgwzdari parameterpCmdTextke teks baru dari perintah.Atur
cwActualelemenpCmdTextparameter ke ukuran string perintah.
Selain itu, pastikan bahwa konteks saat ini bukan fungsi otomatisasi, kecuali perintah Anda secara khusus dimaksudkan untuk menangani fungsi otomatisasi.
Untuk menunjukkan bahwa Anda mendukung perintah tertentu, kembalikan S_OK. Untuk semua perintah lainnya, kembalikan OLECMDERR_E_NOTSUPPORTED.
Dalam contoh berikut, metode QueryStatus pertama-tama memastikan bahwa konteks bukan fungsi otomatisasi, lalu menemukan GUID sekumpulan perintah dan ID perintah yang benar. Perintah itu sendiri diatur untuk diaktifkan dan didukung. Tidak ada perintah lain yang didukung.
public int QueryStatus(ref Guid pguidCmdGroup, uint cCmds, OLECMD[] prgCmds, IntPtr pCmdText)
{
if (!VsShellUtilities.IsInAutomationFunction(m_provider.ServiceProvider))
{
if (pguidCmdGroup == VSConstants.VSStd2K && cCmds > 0)
{
// make the Right command visible
if ((uint)prgCmds[0].cmdID == (uint)VSConstants.VSStd2KCmdID.RIGHT)
{
prgCmds[0].cmdf = (int)Microsoft.VisualStudio.OLE.Interop.Constants.MSOCMDF_ENABLED | (int)Microsoft.VisualStudio.OLE.Interop.Constants.MSOCMDF_SUPPORTED;
return VSConstants.S_OK;
}
}
}
return Constants.OLECMDERR_E_NOTSUPPORTED;
}
Metode eksekusi
Implementasi metode Exec menyerupai implementasi metode QueryStatus. Pertama, pastikan bahwa konteksnya bukan fungsi otomatisasi. Kemudian, uji untuk kedua GUID dan ID perintah. Jika GUID atau ID perintah tidak dikenali, kembalikan OLECMDERR_E_NOTSUPPORTED.
Untuk menangani perintah, jalankan dan kembalikan S_OK jika eksekusi berhasil. Perintah Anda bertanggung jawab atas deteksi kesalahan dan pemberitahuan; oleh karena itu, kembalikan kode kesalahan jika eksekusi gagal. Contoh berikut menunjukkan bagaimana metode eksekusi harus diimplementasikan.
public int Exec(ref Guid pguidCmdGroup, uint nCmdID, uint nCmdexecopt, IntPtr pvaIn, IntPtr pvaOut)
{
if (!VsShellUtilities.IsInAutomationFunction(m_provider.ServiceProvider))
{
if (pguidCmdGroup == VSConstants.GUID_VSStandardCommandSet97)
{
if (nCmdID == (uint)VSConstants.VSStd2KCmdID.RIGHT)
{
// execute the command
return VSConstants.S_OK;
}
}
}
return Constants.OLECMDERR_E_NOTSUPPORTED;
}