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