다음을 통해 공유


명령을 사용할 수 있도록 만들기

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

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

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

지연 로딩

지연된 로드를 사용하도록 설정하는 일반적인 방법은 해당 명령이 UI에 표시되도록 VSPackage를 디자인하는 것이지만 사용자가 명령 중 하나를 클릭할 때까지 패키지 자체가 로드되지 않습니다. 이를 위해 .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 명령을 표시하거나 숨기도록 프로그래밍할 수 있습니다. VSPackage가 명령의 상태를 설정할 수 있도록 하려면 일반적으로 IOleCommandTarget 인터페이스의 QueryStatus 메서드를 구현하여 사용할 수 있지만, 코드를 실행하려면 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에서 패키지 명령을 표시하거나 숨길 수 있습니다. 이렇게 하려면 , DefaultInvisibleDynamicVisibility 명령 플래그를 사용하고 DefaultDisabledVisibilityConstraints 섹션에 하나 이상의 VisibilityItem 요소를 추가하여 패키지의 .vsct 파일에서 명령을 정의합니다. 지정된 명령 컨텍스트 GUID 가 활성화되면 패키지를 로드하지 않고 명령이 표시됩니다.

사용자 지정 컨텍스트 GUID

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

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

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

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

    주의

    기존 컨텍스트 GUID의 상태에 영향을 주지 않는지 확인하세요. 다른 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>