VSPackage에서 명령을 구현하려면 다음 작업을 수행해야 합니다.
.vsct 파일에서 명령 그룹을 설정한 다음 명령을 추가합니다. 자세한 내용은 Visual Studio 명령 테이블(.vsct) 파일을 참조하세요.
Visual Studio에 명령을 등록합니다.
명령을 구현합니다.
다음 섹션에서는 명령을 등록하고 구현하는 방법을 설명합니다.
Visual Studio를 사용하여 명령 등록
메뉴에 명령을 표시하려면 VSPackage에 추가하고 ProvideMenuResourceAttribute 메뉴 이름 또는 리소스 ID 값으로 사용해야 합니다.
[ProvideMenuResource("Menus.ctmenu", 1)]
public sealed class MyPackage : Package
{
// ...
}
또한 명령을 OleMenuCommandService.에 등록해야 합니다. GetService 메서드를 사용하여, Package에서 파생된 VSPackage인 경우 이 서비스를 받을 수 있습니다.
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);
}
명령 구현
명령을 구현하는 방법에는 여러 가지가 있습니다. 항상 동일한 방식으로 동일한 메뉴에 표시되는 명령인 정적 메뉴 명령을 원하는 경우 이전 섹션의 예제와 같이 명령을 MenuCommand 만듭니다. 정적 명령을 만들려면 명령 실행을 담당하는 이벤트 처리기를 제공해야 합니다. 명령은 항상 사용하도록 설정되고 표시되므로 Visual Studio에 해당 상태를 제공할 필요가 없습니다. 특정 조건에 따라 명령의 상태를 변경하려면 명령을 클래스의 OleMenuCommand 인스턴스로 만들고, 해당 생성자에서 명령을 실행하는 이벤트 처리기와 명령 QueryStatus 상태가 변경될 때 Visual Studio에 알리는 처리기를 제공할 수 있습니다. 명령 클래스의 일부로 구현 IOleCommandTarget 하거나 프로젝트의 일부로 명령을 제공하는 경우 구현 IVsHierarchy 할 수 있습니다. 두 인터페이스와 OleMenuCommand 클래스에는 모두 Visual Studio에 명령 상태 변경을 알리는 메서드와 명령 실행을 제공하는 다른 메서드가 있습니다.
명령 서비스에 명령이 추가되면 명령 체인 중 하나가 됩니다. 명령에 대한 상태 알림 및 실행 메서드를 구현하는 경우 해당 특정 명령에 대해서만 제공하고 다른 모든 경우를 체인의 다른 명령에 전달합니다. 명령을 전달하지 못하는 경우(일반적으로 OLECMDERR_E_NOTSUPPORTED을 반환하여) Visual Studio가 제대로 작동하지 않을 수 있습니다.
QueryStatus 메서드
QueryStatus 메서드 또는 QueryStatusCommand 메서드를 구현하는 경우, 명령이 속한 명령 집합의 GUID와 명령의 ID를 확인하십시오. 다음 지침을 따릅니다.
GUID가 인식되지 않으면 두 메서드 중 어느 한 메서드라도 OLECMDERR_E_UNKNOWNGROUP을(를) 반환해야 합니다.
두 메서드의 구현에서 GUID를 인식하지만 명령을 구현하지 않은 경우 메서드는 반환 OLECMDERR_E_NOTSUPPORTED해야 합니다.
두 메서드의 구현에서 GUID와 명령을 모두 인식하는 경우 메서드는 다음
prgCmds플래그를 사용하여 매개 변수에 있는 OLECMDF 모든 명령의 명령 플래그 필드를 설정해야 합니다.OLECMDF_SUPPORTED: 명령이 지원됩니다.OLECMDF_INVISIBLE: 명령이 표시되지 않아야 합니다.OLECMDF_LATCHED: 명령이 전환되어 활성화되었고, 선택된 것으로 보입니다.OLECMDF_ENABLED: 명령을 사용할 수 있습니다.OLECMDF_DEFHIDEONCTXTMENU: 바로 가기 메뉴에 표시되는 경우 명령을 숨겨야 합니다.OLECMDF_NINCHED: 이 명령은 메뉴 컨트롤러이며 사용하도록 설정되지 않았지만 드롭다운 메뉴 목록이 비어 있지 않고 계속 사용할 수 있습니다. (이 플래그는 거의 사용되지 않습니다.)
플래그가 있는 .vsct 파일에 명령이
TextChanges정의된 경우 다음 매개 변수를 설정합니다.rgwz매개 변수의pCmdText요소를 명령의 새 텍스트로 설정합니다.cwActual매개 변수의pCmdText요소를 명령 문자열의 크기로 설정합니다.
또한 명령이 자동화 함수를 처리하도록 특별히 의도된 경우가 아니면 현재 컨텍스트가 자동화 함수가 아닌지 확인합니다.
특정 명령을 지원함을 나타내려면 .를 반환합니다 S_OK. 다른 모든 명령에 대해서는 OLECMDERR_E_NOTSUPPORTED을(를) 반환합니다.
다음 예제에서 메서드는 QueryStatus 먼저 컨텍스트가 자동화 함수가 아닌지 확인한 다음 올바른 명령 집합 GUID 및 명령 ID를 찾습니다. 명령 자체는 사용하도록 설정되고 지원됩니다. 다른 명령은 지원되지 않습니다.
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;
}
실행 메서드
Exec 메서드의 구현은 QueryStatus 메서드의 구현과 유사합니다. 먼저 컨텍스트가 자동화 함수가 아닌지 확인합니다. 그런 다음 GUID와 명령 ID를 모두 테스트합니다. GUID 또는 명령 ID가 인식되지 않으면 OLECMDERR_E_NOTSUPPORTED를 반환합니다.
명령을 처리하려면 명령을 실행하고 실행이 성공하면 반환 S_OK 합니다. 명령은 오류 검색 및 알림을 담당합니다. 따라서 실행이 실패하면 오류 코드를 반환합니다. 다음 예제에서는 실행 메서드를 구현 하는 방법을 보여 줍니다.
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;
}