명령을 사용 가능하게 지정

여러 VSPackage가 Visual Studio에 추가되면 UI(사용자 인터페이스)가 명령으로 과밀해질 수 있습니다. 다음과 같이 패키지를 프로그래밍하여 이 문제를 줄일 수 있습니다.

  • 사용자가 필요할 때만 로드되도록 패키지를 프로그래밍합니다.

  • 해당 명령이 IDE(통합 개발 환경)의 현재 상태 컨텍스트에서 필요할 수 있는 경우에만 표시되도록 패키지를 프로그래밍합니다.

지연된 로드

지연된 로드를 사용하도록 설정하는 일반적인 방법은 VSPackage를 디자인하여 해당 명령이 UI에 표시되지만 사용자가 명령 중 하나를 클릭할 때까지 패키지 자체가 로드되지 않도록 하는 것입니다. 이 작업을 수행하려면 .vsct 파일에서 명령 플래그가 없는 명령을 만듭니다.

다음 예제에서는 .vsct 파일에서 메뉴 명령의 정의를 보여 줍니다. 템플릿에서 메뉴 명령 옵션을 선택할 때 Visual Studio 패키지 템플릿에서 생성되는 명령입니다.

<Button guid="guidTopLevelMenuCmdSet" id="cmdidTestCommand" priority="0x0100" type="Button">
  <Parent guid="guidTopLevelMenuCmdSet" id="MyMenuGroup" />
  <Icon guid="guidImages" id="bmpPic1" />
  <Strings>
    <CommandName>cmdidTestCommand</CommandName>
    <ButtonText>Test Command</ButtonText>
  </Strings>
</Button>

이 예제에서는 부모 그룹이 MyMenuGroup도구 메뉴와 같은 최상위 메뉴의 자식인 경우 명령은 해당 메뉴에 표시되지만 명령을 실행하는 패키지는 사용자가 명령을 클릭할 때까지 로드되지는 않습니다. 그러나 IOleCommandTarget 인터페이스를 구현하도록 명령을 프로그래밍하면 명령이 포함된 메뉴가 처음 확장될 때 패키지가 로드되도록 사용 설정할 수 있습니다.

로드가 지연되면 시작 성능도 향상될 수 있습니다.

현재 컨텍스트 및 명령 표시 여부

VSPackage 데이터의 현재 상태 또는 현재 관련된 작업에 따라 VSPackage 명령을 표시하거나 숨기도록 프로그래밍할 수 있습니다. 일반적으로 IOleCommandTarget 인터페이스에서 QueryStatus 메서드의 구현을 사용하여 VSPackage가 해당 명령의 상태를 설정하도록 할 수 있지만, 이를 위해서는 코드를 실행하기 전에 VSPackage를 로드해야 합니다. 대신에 IDE를 사용하여 패키지를 로드하지 않고 명령의 표시 유형을 관리하는 것을 권장합니다. 이 작업을 수행하려면 .vsct 파일에서 하나 이상의 특수 UI 컨텍스트와 명령을 연결합니다. 이러한 UI 컨텍스트는 명령 컨텍스트 GUID라고 하는 GUID로 식별됩니다.

Visual Studio는 프로젝트 로드 또는 편집에서 빌드로 이동하는 것과 같은 사용자 작업으로 인해 발생하는 변경 내용을 모니터링합니다. 변경이 발생하면 IDE의 모양이 자동으로 수정됩니다. 다음 표에서는 Visual Studio에서 모니터링하는 IDE 변경의 네 가지 주요 컨텍스트를 보여 줍니다.

컨텍스트 유형 설명
활성 프로젝트 형식 대부분의 프로젝트 형식에서 이 GUID 값은 프로젝트를 구현하는 VSPackage의 GUID와 동일합니다. 그러나 Visual C++ 프로젝트는 프로젝트 형식 GUID를 값으로 사용합니다.
활성 창 일반적으로 키 바인딩에 대한 현재 UI 컨텍스트를 설정하는 마지막 활성 문서 창입니다. 그러나 내부 웹 브라우저와 유사한 키 바인딩 테이블이 있는 도구 창일 수도 있습니다. HTML 편집기와 같은 다중 탭 문서 창의 경우 모든 탭에는 여러 명령 컨텍스트 GUID가 있습니다.
활성 언어 서비스 현재 텍스트 편집기에 표시되는 파일과 연결된 언어 서비스입니다.
활성 도구 창 열려 있고 포커스가 있는 도구 창입니다.

다섯 번째 주요 컨텍스트 영역은 IDE의 UI 상태입니다. UI 컨텍스트는 다음과 같이 활성 명령 컨텍스트 GUID로 식별됩니다.

이러한 GUID는 IDE의 현재 상태에 따라 활성 또는 비활성으로 표시됩니다. 여러 UI 컨텍스트를 동시에 활성화할 수 있습니다.

컨텍스트에 따라 명령 숨기기 및 표시

패키지 자체를 로드하지 않고 IDE에서 패키지 명령을 표시하거나 숨길 수 있습니다. 이 작업을 수행하려면 DefaultDisabled, DefaultInvisibleDynamicVisibility 명령 플래그를 사용하고 VisibilityConstraints 섹션에 하나 이상의 VisibilityItem 요소를 추가하여 패키지의 .vsct 파일에서 명령을 정의합니다. 지정된 명령 컨텍스트 GUID가 활성화되면 패키지를 로드하지 않고 명령이 표시됩니다.

사용자 지정 컨텍스트 GUID

적절한 명령 컨텍스트 GUID가 아직 정의되지 않은 경우 VSPackage에서 하나를 정의한 다음, 명령의 표시 여부를 제어하는 데 필요한 경우 활성 또는 비활성으로 프로그래밍할 수 있습니다. SVsShellMonitorSelection 서비스를 사용하여 다음을 수행합니다.

  • GetCmdUIContextCookie 메서드를 호출하여 컨텍스트 GUID를 등록합니다.

  • IsCmdUIContextActive 메서드를 호출하여 컨텍스트 GUID의 상태를 가져옵니다.

  • SetCmdUIContext 메서드를 호출하여 컨텍스트 GUID를 켜고 끕니다.

    주의

    다른 VSPackage가 종속될 수 있으므로 VSPackage가 기존 컨텍스트 GUID의 상태에 영향을 주지 않아야 합니다.

예시

다음 VSPackage 명령 예제는 VSPackage를 로드하지 않고 명령 컨텍스트에서 관리하는 명령의 동적 표시 유형을 보여 줍니다.

이 명령은 솔루션이 있을 때마다 사용하도록 설정되고 표시됩니다. 즉, 다음 명령 컨텍스트 GUID 중 하나가 활성화될 때마다 표시됩니다.

이 예제에서는 모든 명령 플래그가 별도의 명령 플래그 요소임을 확인합니다.

<Button guid="guidDynamicVisibilityCmdSet" id="cmdidMyCommand"
        priority="0x0100" type="Button">
  <Parent guid="guidDynamicVisibilityCmdSet" id="MyMenuGroup" />
  <Icon guid="guidImages" id="bmpPic1" />
  <CommandFlag>DefaultDisabled</CommandFlag>
  <CommandFlag>DefaultInvisible</CommandFlag>
  <CommandFlag>DynamicVisibility</CommandFlag>
  <Strings>
    <CommandName>cmdidMyCommand</CommandName>
    <ButtonText>My Command name</ButtonText>
  </Strings>
</Button>

또한 모든 UI 컨텍스트는 다음과 같이 별도의 VisibilityItem 요소에 지정되어야 합니다.

<VisibilityConstraints>
  <VisibilityItem guid="guidDynamicVisibilityCmdSet"
                  id="cmdidMyCommand" context="UICONTEXT_EmptySolution" />
  <VisibilityItem guid="guidDynamicVisibilityCmdSet"
                      id="cmdidMyCommand" context="UICONTEXT_SolutionHasSingleProject" />
  <VisibilityItem guid="guidDynamicVisibilityCmdSet"
                  id="cmdidMyCommand" context="UICONTEXT_SolutionHasMultipleProjects" />
</VisibilityConstraints>