다음을 통해 공유


이미지 서비스 및 카탈로그

이 Cookbook에는 Visual Studio 2015에 도입된 Visual Studio 이미지 서비스 및 이미지 카탈로그를 채택하기 위한 지침과 모범 사례가 포함되어 있습니다.

Visual Studio 2015에 도입된 이미지 서비스를 사용하면 개발자가 디바이스에 가장 적합한 이미지와 사용자가 선택한 테마를 가져와 이미지를 표시할 수 있습니다(이미지가 표시되는 컨텍스트에 대한 올바른 테마 포함). 이미지 서비스를 채택하면 자산 유지 관리, HDPI 크기 조정 및 테마와 관련된 주요 문제를 제거하는 데 도움이 됩니다.

현재 문제 솔루션
배경색 혼합 기본 제공 알파 혼합
테마(일부) 이미지 테마 메타데이터
고대비 모드 대체 고대비 리소스
다른 DPI 모드에 여러 리소스 필요 벡터 기반 대체를 사용하는 선택 가능한 리소스
중복된 이미지 이미지 개념당 식별자 1개

이미지 서비스를 채택하는 이유는 무엇인가요?

  • 항상 Visual Studio에서 최신 "완벽한 픽셀의" 이미지를 가져옵니다.

  • 사용자 고유의 이미지를 제출하고 사용할 수 있습니다.

  • Windows에서 새 DPI 크기 조정을 추가할 때 이미지를 테스트할 필요가 없습니다.

  • 구현에서 오래된 아키텍처 장애물 해결

    이미지 서비스 사용 전과 후의 Visual Studio 셸 도구 모음:

    이미지 서비스 이전 및 이후

작동 방식

이미지 서비스는 지원되는 모든 UI 프레임워크에 적합한 비트맵 이미지를 제공할 수 있습니다.

  • WPF: BitmapSource

  • WinForms: System.Drawing.Bitmap

  • Win32: HBITMAP

    이미지 서비스 흐름 다이어그램

    이미지 서비스 흐름 다이어그램

    이미지 모니커

    이미지 모니커(또는 줄여서 모니커)는 이미지 라이브러리에서 이미지 자산 또는 이미지 목록 자산을 고유하게 식별하는 GUID/ID 쌍입니다.

    알려진 모니커

    Visual Studio 이미지 카탈로그에 포함되어 있고 모든 Visual Studio 구성 요소 또는 확장에서 공개적으로 사용할 수 있는 이미지 모니커 집합입니다.

    이미지 매니페스트 파일

    이미지 매니페스트(.imagemanifest) 파일은 이미지 자산 집합, 해당 자산을 나타내는 모니커, 각 자산을 나타내는 실제 이미지를 정의하는 XML 파일입니다. 이미지 매니페스트는 레거시 UI 지원을 위해 독립 실행형 이미지 또는 이미지 목록을 정의할 수 있습니다. 또한 자산 또는 각 자산 뒤에 있는 개별 이미지에서 설정하여 이러한 자산이 표시되는 시기와 방법을 변경할 수 있는 특성이 있습니다.

    이미지 매니페스트 스키마

    전체 이미지 매니페스트는 다음과 같습니다.

<ImageManifest>
      <!-- zero or one Symbols elements -->
      <Symbols>
        <!-- zero or more Import, Guid, ID, or String elements -->
      </Symbols>
      <!-- zero or one Images elements -->
      <Images>
        <!-- zero or more Image elements -->
      </Images>
      <!-- zero or one ImageLists elements -->
      <ImageLists>
        <!-- zero or more ImageList elements -->
      </ImageLists>
</ImageManifest>

Symbols

가독성 및 유지 관리 지원으로 이미지 매니페스트는 특성 값에 대한 기호를 사용할 수 있습니다. 기호는 다음과 같이 정의됩니다.

<Symbols>
      <Import Manifest="manifest" />
      <Guid Name="ShellCommandGuid" Value="8ee4f65d-bab4-4cde-b8e7-ac412abbda8a" />
      <ID Name="cmdidSaveAll" Value="1000" />
      <String Name="AssemblyName" Value="Microsoft.VisualStudio.Shell.UI.Internal" />
      <!-- If your assembly is strongly named, you'll need the version and public key token as well -->
      <!-- <String Name="AssemblyName" Value="Microsoft.VisualStudio.Shell.UI.Internal;v17.0.0.0;b03f5f7f11d50a3a" /> -->
</Symbols>
하위 요소 정의
가져오기 현재 매니페스트에서 사용할 지정된 매니페스트 파일의 기호를 가져옵니다.
Guid 기호는 GUID를 나타내며 GUID 서식과 일치해야 합니다.
ID 기호는 ID를 나타내며 음수 정수여야 합니다.
문자열 기호는 임의의 문자열 값을 나타냅니다.

기호는 대/소문자를 구분하며 $(symbol-name) 구문을 사용하여 참조됩니다.

<Image Guid="$(ShellCommandGuid)" ID="$(cmdidSaveAll)" >
      <Source Uri="/$(AssemblyName);Component/Resources/image.xaml" />
</Image>

일부 기호는 모든 매니페스트에 대해 미리 정의됩니다. <원본> 또는 <가져오기> 요소의 URI 속성에서 로컬 컴퓨터의 경로를 참조하는 데 사용할 수 있습니다.

기호 설명
CommonProgramFiles %CommonProgramFiles% 환경 변수의 값
LocalAppData %LocalAppData% 환경 변수의 값
ManifestFolder 매니페스트 파일이 포함된 폴더
MyDocuments 현재 사용자의 내 문서 폴더 전체 경로
ProgramFiles %ProgramFiles% 환경 변수의 값
시스템 Windows\System32 폴더
WinDir %WinDir% 환경 변수의 값

이미지

<이미지> 요소는 모니커에서 참조할 수 있는 이미지를 정의합니다. 함께 가져온 GUID 및 ID는 이미지 모니커를 구성합니다. 이미지의 모니커는 전체 이미지 라이브러리에서 고유해야 합니다. 둘 이상의 이미지에 지정된 모니커가 있는 경우 라이브러리를 빌드하는 동안 발생한 첫 번째 이미지가 유지됩니다.

원본을 하나 이상 포함해야 합니다. 크기 중립적 원본은 광범위한 크기에서 최상의 결과를 제공하지만 필수는 아닙니다. 서비스가 <이미지> 요소에 정의되지 않은 크기의 이미지를 요청하고 크기 중립적 원본이 없는 경우 서비스는 가장 적합한 크기별 원본을 선택하고 요청한 크기로 크기를 조정합니다.

<Image Guid="guid" ID="int" AllowColorInversion="true/false">
      <Source ... />
      <!-- optional additional Source elements -->
</Image>
Attribute 정의
Guid [필수] 이미지 모니커의 GUID 부분
ID [필수] 이미지 모니커의 ID 부분
AllowColorInversion [선택 사항, 기본값은 true] 어두운 배경에서 이미지를 사용할 때 프로그래밍 방식으로 색을 반전시킬 수 있는지 여부를 나타냅니다.

원본

<원본> 요소는 단일 이미지 원본 자산(XAML 및 PNG)을 정의합니다.

<Source Uri="uri" Background="background">
      <!-- optional NativeResource element -->
 </Source>
Attribute 정의
URI [필수] 이미지를 로드할 수 있는 위치를 정의하는 URI입니다. 다음 중 하나일 수 있습니다.

- application:/// 권한을 사용하는 팩 URI
- 절대 구성 요소 리소스 참조
- 네이티브 리소스를 포함하는 파일의 경로
배경 [선택 사항] 원본에서 사용할 배경의 종류를 나타냅니다.

다음 중 하나일 수 있습니다.

Light: 원본을 밝은 배경에서 사용할 수 있습니다.

Dark: 원본을 어두운 배경에서 사용할 수 있습니다.

HighContrast: 고대비 모드의 모든 배경에서 원본을 사용할 수 있습니다.

HighContrastLight: 고대비 모드의 밝은 배경에서 원본을 사용할 수 있습니다.

HighContrastDark: 고대비 모드의 어두운 배경에서 원본을 사용할 수 있습니다.

Background 특성을 생략하면 어떤 백그라운드에서든 원본을 사용할 수 있습니다.

베경이 Light, Dark, HighContrastLight 또는 HighContrastDark인 경우 원본의 색은 반전되지 않습니다. Background가 생략되거나 HighContrast로 설정된 경우 원본 색의 반전은 이미지의 AllowColorInversion 특성을 통해 제어됩니다.

<Source> 요소에는 다음과 같은 선택적 하위 요소 중 하나만 포함될 수 있습니다.

요소 특성(모두 필수) 정의
<크기> 원본은 지정된 크기의 이미지(디바이스 단위)에 사용됩니다. 이미지는 정사각형입니다.
<SizeRange> MinSize, MaxSize 원본은 MinSize에서 MaxSize(디바이스 단위)에 이르는 이미지에 포함됩니다. 이미지는 정사각형입니다.
<차원> 너비, 높이 원본은 지정된 너비 및 높이의 이미지(디바이스 단위)에 사용됩니다.
<DimensionRange> MinWidth, MinHeight,

MaxWidth, MaxHeight
원본은 최소 너비/높이에서 최대 너비/높이(디바이스 단위)에 이르는 이미지에 사용됩니다.

<Source> 요소에는 관리되는 어셈블리가 아닌 네이티브 어셈블리에서 로드되는 <Source>를 정의하는 선택적 <NativeResource> 하위 요소가 있을 수도 있습니다.

<NativeResource Type="type" ID="int" />
Attribute 정의
형식 [필수] 네이티브 리소스의 형식(XAML 또는 PNG)
ID [필수] 네이티브 리소스의 정수 ID 부분

ImageList

<ImageList> 요소는 단일 스트립에서 반환할 수 있는 이미지 컬렉션을 정의합니다. 스트립은 필요에 따라 주문 시 빌드됩니다.

<ImageList>
      <ContainedImage Guid="guid" ID="int" External="true/false" />
      <!-- optional additional ContainedImage elements -->
 </ImageList>
Attribute 정의
Guid [필수] 이미지 모니커의 GUID 부분
ID [필수] 이미지 모니커의 ID 부분
외부 [선택 사항, 기본값은 false] 이미지 모니커가 현재 매니페스트의 이미지를 참조하는지 여부를 나타냅니다.

포함된 이미지의 모니커는 현재 매니페스트에 정의된 이미지를 참조할 필요가 없습니다. 이미지 라이브러리에서 포함된 이미지를 찾을 수 없는 경우 빈 자리 표시자 이미지가 해당 위치에 사용됩니다.

이미지 서비스 사용

첫 번째 단계(관리됨)

이미지 서비스를 사용하려면 다음 어셈블리의 일부 또는 전부에 대한 참조를 프로젝트에 추가해야 합니다.

  • Microsoft.VisualStudio.ImageCatalog.dll

    • 기본 제공 이미지 카탈로그 KnownMonikers를 사용하는 경우 필요합니다.
  • Microsoft.VisualStudio.Imaging.dll

    • WPF UI에서 CrispImageImageThemingUtilities를 사용하는 경우 필요합니다.
  • Microsoft.VisualStudio.Imaging.Interop.14.0.DesignTime.dll

    • ImageMonikerImageAttributes 형식을 사용하는 경우 필요합니다.

    • EmbedInteropTypes는 true로 설정해야 합니다.

  • Microsoft.VisualStudio.Shell.Interop.14.0.DesignTime

    • IVsImageService2 형식을 사용하는 경우 필요합니다.

    • EmbedInteropTypes는 true로 설정해야 합니다.

  • Microsoft.VisualStudio.Utilities.dll

    • WPF UI에서 ImageThemingUtilities.ImageBackgroundColor에 대해 BrushToColorConverter를 사용하는 경우 필요합니다.
  • Microsoft.VisualStudio.Shell.<VSVersion>.0

    • IVsUIObject 형식을 사용하는 경우 필요합니다.
  • Microsoft.VisualStudio.Shell.Interop.10.0.dll

    • WinForms 관련 UI 도우미를 사용하는 경우 필요합니다.

    • EmbedInteropTypes를 true로 설정해야 합니다.

첫 번째 단계(네이티브)

이미지 서비스를 사용하려면 다음 헤더 중 일부 또는 전체를 프로젝트에 포함해야 합니다.

  • KnownImageIds.h

    • 기본 제공 이미지 카탈로그 KnownMonikers를 사용하는 경우 필요하지만 IVsHierarchy GetGuidProperty 또는 GetProperty 호출에서 값을 반환하는 경우와 같이 ImageMoniker 형식은 사용할 수 없습니다.
  • KnownMonikers.h

    • 기본 제공 이미지 카탈로그 KnownMonikers를 사용하는 경우 필요합니다.
  • ImageParameters140.h

    • ImageMonikerImageAttributes 형식을 사용하는 경우 필요합니다.
  • VSShell140.h

    • IVsImageService2 형식을 사용하는 경우 필요합니다.
  • ImageThemingUtilities.h

    • 이미지 서비스에서 테마를 처리하도록 할 수 없는 경우 필요합니다.

    • 이미지 서비스에서 이미지 테마를 처리할 수 있는 경우 이 헤더를 사용하지 마세요.

  • VsDpiAwareness.h

    • DPI 인식 도우미를 사용하여 현재 DPI를 가져오는 경우 필요합니다.

새 WPF UI는 어떻게 작성하나요?

  1. 먼저 위의 첫 번째 단계 섹션에 필요한 어셈블리 참조를 프로젝트에 추가합니다. 모든 항목을 추가할 필요는 없으므로 필요한 참조만 추가합니다. (참고: 브러시 대신 을 사용 중이거나 액세스 권한이 있는 경우 변환기가 필요하지 않으므로 유틸리티에 대한 참조를 건너뛸 수 있습니다.)

  2. 원하는 이미지를 선택하고 모니커를 가져옵니다. KnownMoniker를 사용하거나, 사용자 지정 이미지와 모니커가 있는 경우 사용자 고유의 이미지를 사용합니다.

  3. XAML에 CrispImages를 추가합니다. (아래 예제를 참조하세요.)

  4. UI 계층 구조에서 ImageThemingUtilities.ImageBackgroundColor 속성을 설정합니다. (이 설정은 배경색이 알려진 위치에서 설정해야 하며 반드시 CrispImage에 있는 것은 아닙니다.) (아래 예제를 참조하세요.)

<Window
  x:Class="WpfApplication.MainWindow"
  xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
  xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
  xmlns:imaging="clr-namespace:Microsoft.VisualStudio.Imaging;assembly=Microsoft.VisualStudio.Imaging"
  xmlns:theming="clr-namespace:Microsoft.VisualStudio.PlatformUI;assembly=Microsoft.VisualStudio.Imaging"
  xmlns:utilities="clr-namespace:Microsoft.VisualStudio.PlatformUI;assembly=Microsoft.VisualStudio.Utilities"
  xmlns:catalog="clr-namespace:Microsoft.VisualStudio.Imaging;assembly=Microsoft.VisualStudio.ImageCatalog"
  Title="MainWindow" Height="350" Width="525" UseLayoutRounding="True">
  <Window.Resources>
    <utilities:BrushToColorConverter x:Key="BrushToColorConverter"/>
  </Window.Resources>
  <StackPanel Background="White" VerticalAlignment="Center"
    theming:ImageThemingUtilities.ImageBackgroundColor="{Binding Background, RelativeSource={RelativeSource Self}, Converter={StaticResource BrushToColorConverter}}">
    <imaging:CrispImage Width="16" Height="16" Moniker="{x:Static catalog:KnownMonikers.MoveUp}" />
  </StackPanel>
</Window>

기존 WPF UI는 어떻게 업데이트하나요?

기존 WPF UI 업데이트는 세 가지 기본 단계로 구성된 비교적 간단한 프로세스입니다.

  1. UI의 모든 <이미지> 요소를 <CrispImage> 요소로 바꿉니다.

  2. 모든 원본 특성을 모니커 특성으로 변경합니다.

    • 이미지가 변경되지 않고 KnownMonikers를 사용하는 경우 해당 속성을 KnownMoniker에 정적으로 바인딩합니다. (위 예제를 참조하세요.)

    • 이미지가 변경되지 않고 고유한 사용자 지정 이미지를 사용하는 경우 고유한 모니커에 정적으로 바인딩합니다.

    • 이미지를 변경할 수 있는 경우 속성 변경을 알리는 코드 속성에 모니커 특성을 바인딩합니다.

  3. UI 계층 구조의 임의 위치에 ImageThemingUtilities.ImageBackgroundColor를 설정하여 색 반전이 올바르게 작동하도록 합니다.

    • 이렇게 하려면 BrushToColorConverter 클래스를 사용해야 할 수 있습니다. (위 예제를 참조하세요.)

Win32 UI를 어떻게 업데이트하나요?

이미지의 원시 로딩을 바꾸기 위해 적절한 위치에 다음을 코드에 추가합니다. 필요에 따라 HBITMAP 및 HICON 및 HIMAGELIST를 반환하기 위한 값을 전환합니다.

이미지 서비스 가져오기

CComPtr<IVsImageService2> spImgSvc;
CGlobalServiceProvider::HrQueryService(SID_SVsImageService, &spImgSvc);

이미지 요청

UINT dpiX, dpiY;
HWND hwnd = // get the HWND where the image will be displayed
VsUI::CDpiAwareness::GetDpiForWindow(hwnd, &dpiX, &dpiY);

ImageAttributes attr = { 0 };
attr.StructSize      = sizeof(attributes);
attr.Format          = DF_Win32;
// IT_Bitmap for HBITMAP, IT_Icon for HICON, IT_ImageList for HIMAGELIST
attr.ImageType       = IT_Bitmap;
attr.LogicalWidth    = 16;
attr.LogicalHeight   = 16;
attr.Dpi             = dpiX;
// Desired RGBA color, if you don't use this, don't set IAF_Background below
attr.Background      = 0xFFFFFFFF;
attr.Flags           = IAF_RequiredFlags | IAF_Background;

CComPtr<IVsUIObject> spImg;
// Replace this KnownMoniker with your desired ImageMoniker
spImgSvc->GetImage(KnownMonikers::Blank, attributes, &spImg);

WinForms UI를 어떻게 업데이트하나요?

이미지의 원시 로딩을 바꾸기 위해 적절한 위치에 다음을 코드에 추가합니다. 필요에 따라 비트맵 및 아이콘을 반환하기 위한 값을 전환합니다.

유용한 using 문

using GelUtilities = Microsoft.Internal.VisualStudio.PlatformUI.Utilities;

이미지 서비스 가져오기

// This or your preferred way of querying for Visual Studio services
IVsImageService2 imageService = (IVsImageService2)Package.GetGlobalService(typeof(SVsImageService));

이미지 요청

Control control = // get the control where the image will be displayed

ImageAttributes attributes = new ImageAttributes
{
    StructSize    = Marshal.SizeOf(typeof(ImageAttributes)),
    // IT_Bitmap for Bitmap, IT_Icon for Icon, IT_ImageList for ImageList
    ImageType     = (uint)_UIImageType.IT_Bitmap,
    Format        = (uint)_UIDataFormat.DF_WinForms,
    LogicalWidth  = 16,
    LogicalHeight = 16,
    Dpi           = (int)DpiAwareness.GetWindowDpi(control.Handle);
    // Desired RGBA color, if you don't use this, don't set IAF_Background below
    Background    = 0xFFFFFFFF,
    Flags         = unchecked((uint)_ImageAttributesFlags.IAF_RequiredFlags | _ImageAttributesFlags.IAF_Background),
};

// Replace this KnownMoniker with your desired ImageMoniker
IVsUIObject uIObj = imageService.GetImage(KnownMonikers.Blank, attributes);

Bitmap bitmap = (Bitmap)GelUtilities.GetObjectData(uiObj); // Use this if you need a bitmap
// Icon icon = (Icon)GelUtilities.GetObjectData(uiObj);    // Use this if you need an icon

새 도구 창에서 이미지 모니커를 어떻게 사용하나요?

VSIX 패키지 프로젝트 템플릿이 Visual Studio 2015용으로 업데이트되었습니다. 새 도구 창을 만들려면 VSIX 프로젝트를 마우스 오른쪽 단추로 클릭하고 추가>새 항목(Ctrl+Shift+A)을 선택합니다. 프로젝트 언어의 확장성 노드에서 사용자 지정 도구 창을 선택하고 도구 창에 이름을 지정한 다음, 추가 단추를 누릅니다.

도구 창에서 모니커를 사용하는 주요 위치입니다. 다음 각각에 대한 지침을 따르세요.

  1. 탭이 충분히 작아지면 도구 창 탭(Ctrl+Tab 창 전환기에서도 사용됨)

    ToolWindowPane 형식에서 파생되는 클래스의 생성자에 다음 줄을 추가합니다.

    // Replace this KnownMoniker with your desired ImageMoniker
    this.BitmapImageMoniker = KnownMonikers.Blank;
    
  2. 도구 창을 여는 명령입니다.

    패키지의 .vsct 파일에서 도구 창의 명령 단추를 편집합니다.

    <Button guid="guidPackageCmdSet" id="CommandId" priority="0x0100" type="Button">
      <Parent guid="guidSHLMainMenu" id="IDG_VS_WNDO_OTRWNDWS1"/>
      <!-- Replace this KnownMoniker with your desired ImageMoniker -->
      <Icon guid="ImageCatalogGuid" id="Blank" />
      <!-- Add this -->
      <CommandFlag>IconIsMoniker</CommandFlag>
      <Strings>
        <ButtonText>MyToolWindow</ButtonText>
      </Strings>
    </Button>
    

    파일 맨 위의 <Extern> 요소 다음에도 다음 항목이 있는지 확인합니다.

    <Include href="KnownImageIds.vsct"/>
    

기존 도구 창에서 이미지 모니커를 어떻게 사용하나요?

이미지 모니커를 사용하도록 기존 도구 창을 업데이트하는 작업은 새 도구 창을 만드는 단계와 비슷합니다.

도구 창에서 모니커를 사용하는 주요 위치입니다. 다음 각각에 대한 지침을 따르세요.

  1. 탭이 충분히 작아지면 도구 창 탭(Ctrl+Tab 창 전환기에서도 사용됨)

    1. ToolWindowPane 형식에서 파생되는 클래스의 생성자에서 다음 줄(있는 경우)을 제거합니다.

      this.BitmapResourceID = <Value>;
      this.BitmapIndex = <Value>;
      
    2. 위의 "새 도구 창에서 이미지 모니커를 어떻게 사용하나요?" 섹션에서 1단계를 참조하세요.

  2. 도구 창을 여는 명령입니다.

    • 위의 "새 도구 창에서 이미지 모니커를 어떻게 사용하나요?" 섹션에서 2단계를 참조하세요.

.vsct 파일에서 이미지 모니커를 어떻게 사용하나요?

아래 설명된 줄에 표시된 대로 .vsct 파일을 업데이트합니다.

<?xml version="1.0" encoding="utf-8"?>
<CommandTable xmlns="http://schemas.microsoft.com/VisualStudio/2005-10-18/CommandTable" xmlns:xs="http://www.w3.org/2001/XMLSchema">
  <!--  Include the definitions for images included in the VS image catalog -->
  <Include href="KnownImageIds.vsct"/>
  <Commands package="guidMyPackage">
    <Buttons>
      <Button guid="guidMyCommandSet" id="cmdidMyCommand" priority="0x0000" type="Button">
        <!-- Add an Icon element, changing the attributes to match the image moniker you want to use.
             In this case, we're using the Guid for the VS image catalog.
             Change the id attribute to be the ID of the desired image moniker. -->
        <Icon guid="ImageCatalogGuid" id="OpenFolder" />
        <CommandFlag>DynamicVisibility</CommandFlag>
        <CommandFlag>DefaultInvisible</CommandFlag>
        <CommandFlag>DefaultDisabled</CommandFlag>
        <CommandFlag>CommandWellOnly</CommandFlag>
        <CommandFlag>IconAndText</CommandFlag>
        <!-- Add the IconIsMoniker CommandFlag -->
        <CommandFlag>IconIsMoniker</CommandFlag>
        <Strings>
          <ButtonText>Quick Fixes...</ButtonText>
          <CommandName>Show Quick Fixes</CommandName>
          <CanonicalName>ShowQuickFixes</CanonicalName>
          <LocCanonicalName>ShowQuickFixes</LocCanonicalName>
        </Strings>
      </Button>
    </Buttons>
  </Commands>
  <!-- It is recommended that you remove <Bitmap> elements that are no longer used in the vsct file -->
  <Symbols>
    <GuidSymbol name="guidMyPackage"    value="{1491e936-6ffe-474e-8371-30e5920d8fdd}" />
    <GuidSymbol name="guidMyCommandSet" value="{10347de4-69a9-47f4-a950-d3301f6d2bc7}">
      <IDSymbol name="cmdidMyCommand" value="0x9437" />
    </GuidSymbol>
  </Symbols>
</CommandTable>

내 .vsct 파일도 이전 버전의 Visual Studio에서 읽어야 하는 경우 어떻게 해야 하나요?

이전 버전의 Visual Studio는 IconIsMoniker 명령 플래그를 인식하지 못합니다. 지원하는 Visual Studio 버전에서 이미지 서비스의 이미지를 사용할 수 있지만 이전 버전의 Visual Studio에서는 계속 이전 스타일 이미지를 사용할 수 있습니다. 이렇게 하려면 .vsct 파일을 변경하지 않고 그대로 두고(따라서 이전 버전의 Visual Studio와 호환됨), .vsct 파일의 <Bitmaps> 요소에 정의된 GUID/ID 쌍에서 이미지 모니커 GUID/ID 쌍으로 매핑하는 CSV(쉼표로 구분된 값) 파일을 만듭니다.

매핑 CSV 파일의 형식은 다음과 같습니다.

Icon guid, Icon id, Moniker guid, Moniker id
b714fcf7-855e-4e4c-802a-1fd87144ccad,1,fda30684-682d-421c-8be4-650a2967058e,100
b714fcf7-855e-4e4c-802a-1fd87144ccad,2,fda30684-682d-421c-8be4-650a2967058e,200

CSV 파일은 패키지와 함께 배포되며 해당 위치는 ProvideMenuResource 패키지 속성의 IconMappingFilename 속성으로 지정됩니다.

[ProvideMenuResource("MyPackage.ctmenu", 1, IconMappingFilename="IconMappings.csv")]

IconMappingFilename은 암시적으로 $PackageFolder$에 루트가 지정된 상대 경로(위의 예에서와 같이)이거나 환경 변수(예: @"%UserProfile%\dir1\dir2\MyMappingFile.csv")에 의해 정의된 디렉터리에 명시적으로 루트가 지정된 절대 경로입니다.

프로젝트 시스템을 어떻게 이식하나요?

프로젝트에 ImageMonikers를 제공하는 방법

  1. 프로젝트의 IVsHierarchyVSHPROPID_SupportsIconMonikers를 구현하고 true를 반환합니다.

  2. VSHPROPID_IconMonikerImageList(원래 프로젝트에서 VSHPROPID_IconImgList를 사용한 경우) 또는 VSHPROPID_IconMonikerGuid, VSHPROPID_IconMonikerId, VSHPROPID_OpenFolderIconMonikerGuid, VSHPROPID_OpenFolderIconMonikerId(원래 프로젝트에서 VSHPROPID_IconHandleVSHPROPID_OpenFolderIconHandle을 사용한 경우)을 구현합니다.

  3. 확장 지점에서 요청하는 경우 아이콘의 "레거시" 버전을 만들도록 원래 VSHPROPID의 구현을 변경합니다. IVsImageService2는 해당 아이콘을 가져오는 데 필요한 기능을 제공합니다.

    VB/C# 프로젝트 버전에 대한 추가 요구 사항

    프로젝트가 가장 바깥쪽 버전임을 감지한 경우에만 VSHPROPID_SupportsIconMonikers를 구현합니다. 그렇지 않으면 가장 바깥쪽 버전이 실제로 이미지 모니커를 지원하지 않을 수 있으며 기본 버전이 사용자 지정 이미지를 효과적으로 "숨길" 수 있습니다.

    CPS에서 이미지 모니커를 어떻게 사용하나요?

    CPS(Common Project System)에서 사용자 지정 이미지를 설정하는 작업은 수동으로 또는 Project System Extensibility SDK와 함께 제공되는 항목 템플릿을 통해 수행할 수 있습니다.

    프로젝트 시스템 확장성 SDK 사용

    프로젝트 형식/항목 형식에 대한 사용자 지정 아이콘 제공의 지침에 따라 CPS 이미지를 사용자 지정합니다. CPS에 대한 자세한 내용은 Visual Studio 프로젝트 시스템 확장성 설명서에서 찾을 수 있습니다.

    수동으로 ImageMonikers 사용

  4. 프로젝트 시스템에서 IProjectTreeModifier 인터페이스를 구현하고 내보냅니다.

  5. 사용할 KnownMoniker 또는 사용자 지정 이미지 모니커를 결정합니다.

  6. ApplyModifications 메서드에서 아래 예제와 유사하게 새 트리를 반환하기 전에 메서드의 임의 위치에서 다음을 수행합니다.

    // Replace this KnownMoniker with your desired ImageMoniker
    tree = tree.SetIcon(KnownMonikers.Blank.ToProjectSystemType());
    
  7. 새 트리를 만드는 경우 아래 예제와 유사하게 원하는 모니커를 NewTree 메서드에 전달하여 사용자 지정 이미지를 설정할 수 있습니다.

    // Replace this KnownMoniker with your desired ImageMoniker
    ProjectImageMoniker icon         = KnownMonikers.FolderClosed.ToProjectSystemType();
    ProjectImageMoniker expandedIcon = KnownMonikers.FolderOpened.ToProjectSystemType();
    
    return this.ProjectTreeFactory.Value.NewTree(/*caption*/<value>,
                                                 /*filePath*/<value>,
                                                 /*browseObjectProperties*/<value>,
                                                 icon,
                                                 expandedIcon);
    

실제 이미지 스트립에서 모니커 기반 이미지 스트립으로 변환하려면 어떻게 해야 하나요?

HIMAGELIST를 지원해야 함

이미지 서비스를 사용하도록 업데이트할 코드에 대한 기존 이미지 스트립이 있지만 이미지 목록을 전달해야 하는 API로 인해 제약을 받는 경우에도 이미지 서비스의 이점을 얻을 수 있습니다. 모니커 기반 이미지 스트립을 만들려면 아래 단계에 따라 기존 모니커에서 매니페스트를 만듭니다.

  1. ManifestFromResources 도구를 실행하여 이미지 스트립을 전달합니다. 그러면 스트립에 대한 매니페스트가 생성됩니다.

    • 권장: 매니페스트의 사용량에 맞게 기본값이 아닌 이름을 제공합니다.
  2. KnownMonikers만 사용하는 경우 다음을 수행합니다.

    • 매니페스트의 <이미지> 섹션을 <이미지/>로 바꿉니다.

    • 모든 하위 이미지 ID(<이미지 스트립 이름>_## 포함)를 제거합니다.

    • 권장: 사용량에 맞게 AssetsGuid 기호 및 이미지 스트립 기호의 이름을 바꿉니다.

    • ContainedImage의 GUID를 $(ImageCatalogGuid)로 바꾸고, 각 ContainedImage의 ID를 $(<모니커>)로 바꾸고, External="true" 특성을 각 ContainedImage에 추가합니다.

      • <모니커>는 KnownMoniker로 바꿔야 하며 이는 이미지와 일치하지만 이름에서 제거된 "KnownMonikers"입니다.
    • <기호> 섹션의 상단에 >*\Microsoft.VisualStudio.ImageCatalog.imagemanifest" /*>에 대한 <Import Manifest="$(ManifestFolder)\< 상대 설치 디렉터리 경로를 추가합니다.

      • 상대 경로는 매니페스트에 대한 설치 작성에 정의된 배포 위치에 따라 결정됩니다.
  3. ManifestToCode 도구를 실행해 래퍼를 생성하여 기존 코드가 이미지 스트립에 대한 이미지 서비스를 쿼리하는 데 사용할 수 있는 모니커가 있도록 합니다.

    • 권장: 래퍼 및 네임스페이스에 대한 기본값이 아닌 이름을 사용량에 맞게 제공합니다.
  4. 모든 추가, 설치 작성/배포 및 기타 코드 변경을 수행하여 이미지 서비스 및 새 파일과 사용합니다.

    내부 및 외부 이미지가 모두 포함된 샘플 매니페스트는 다음과 같이 표시되어야 합니다.

<?xml version="1.0"?>
<ImageManifest
  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xmlns:xsd="http://www.w3.org/2001/XMLSchema"
  xmlns="http://schemas.microsoft.com/VisualStudio/ImageManifestSchema/2014">

  <Symbols>
    <!-- This needs to be the relative path from your manifest to the ImageCatalog's manifest
         where $(ManifestFolder) is the deployed location of this manifest. -->
    <Import Manifest="$(ManifestFolder)\<RelPath>\Microsoft.VisualStudio.ImageCatalog.imagemanifest" />

    <String Name="Resources" Value="/My.Assembly.Name;Component/Resources/ImageStrip" />
    <Guid Name="ImageGuid" Value="{fb41b7ef-6587-480c-aa27-5b559d42cfc9}" />
    <Guid Name="ImageStripGuid" Value="{9c84a570-d9a7-4052-a340-188fb276f973}" />
    <ID Name="MyImage_0" Value="100" />
    <ID Name="MyImage_1" Value="101" />
    <ID Name="InternalList" Value="1001" />
    <ID Name="ExternalList" Value="1002" />
  </Symbols>

  <Images>
    <Image Guid="$(ImageGuid)" ID="$(MyImage_0)">
      <Source Uri="$(Resources)/MyImage_0.png">
        <Size Value="16" />
      </Source>
    </Image>
    <Image Guid="$(ImageGuid)" ID="$(MyImage_1)">
      <Source Uri="$(Resources)/MyImage_1.png">
        <Size Value="16" />
      </Source>
    </Image>
  </Images>

  <ImageLists>
    <ImageList Guid="$(ImageStripGuid)" ID="$(InternalList)">
      <ContainedImage Guid="$(ImageGuid)" ID="$(MyImage_0)" />
      <ContainedImage Guid="$(ImageGuid)" ID="$(MyImage_1)" />
    </ImageList>
    <ImageList Guid="$(ImageStripGuid)" ID="$(ExternalList)">
      <ContainedImage Guid="$(ImageCatalogGuid)" ID="$(StatusError)" External="true" />
      <ContainedImage Guid="$(ImageCatalogGuid)" ID="$(StatusWarning)" External="true" />
      <ContainedImage Guid="$(ImageCatalogGuid)" ID="$(StatusInformation)" External="true" />
    </ImageList>
  </ImageLists>

</ImageManifest>

HIMAGELIST를 지원할 필요 없음

  1. 이미지 스트립의 이미지와 일치하는 KnownMonikers 집합을 결정하거나, 이미지 스트립의 이미지에 대한 고유한 이름을 만듭니다.

  2. 대신에 모니커를 사용하려면 이미지 스트립의 필수 인덱스에서 이미지를 가져오는 데 사용한 매핑을 업데이트합니다.

  3. 이미지 서비스를 사용하여 업데이트된 매핑을 통해 모니커를 요청하려면 코드를 업데이트합니다. (이는 관리 코드에 대해 CrispImages로 업데이트하거나 이미지 서비스에서 HBITMAP 또는 HICON을 요청하고 네이티브 코드에 대해 전달함을 의미할 수 있습니다.)

이미지 테스트

이미지 라이브러리 뷰어 도구를 사용해 이미지 매니페스트를 테스트하여 모든 항목이 올바르게 작성되었는지 확인할 수 있습니다. 이 도구는 Visual Studio 2015 SDK에서 찾을 수 있습니다. 이 도구 및 기타 도구에 대한 설명서는 여기에서 찾을 수 있습니다.

추가 자료

샘플

GitHub의 여러 Visual Studio 샘플이 다양한 Visual Studio 확장성 지점의 일부로 이미지 서비스를 사용하는 방법을 보여 주기 위해 업데이트되었습니다.

최신 샘플을 보려면 http://github.com/Microsoft/VSSDK-Extensibility-Samples를 확인하세요.

도구

이미지 서비스에 대한 지원 도구 집합은 이미지 서비스와 함께 작동하는 UI 생성/업데이트를 지원하기 위해 만들어졌습니다. 각 도구에 대한 자세한 내용은 도구와 함께 제공되는 설명서를 확인하세요. 이 도구는 Visual Studio 2015 SDK의 일부로 포함되어 있습니다.

ManifestFromResources

Manifest from Resources 도구는 이미지 리소스(PNG 또는 XAML) 목록을 가져와 이미지 서비스와 함께 해당 이미지를 사용하기 위한 이미지 매니페스트 파일을 생성합니다.

ManifestToCode

Manifest to Code 도구는 이미지 매니페스트 파일을 가져와서 코드(C++, C# 또는 VB) 또는 .vsct 파일의 매니페스트 값을 참조하기 위한 래퍼 파일을 생성합니다.

ImageLibraryViewer

이미지 라이브러리 뷰어 도구는 이미지 매니페스트를 로드할 수 있으며 사용자는 Visual Studio에서 매니페스트가 올바르게 작성되었는지 확인하는 것과 동일한 방식으로 이미지 매니페스트를 조작할 수 있습니다. 사용자는 배경, 크기, DPI 설정, 고대비 및 기타 설정을 변경할 수 있습니다. 또한 매니페스트에서 오류를 찾기 위한 로딩 정보를 표시하고 매니페스트의 각 이미지에 대한 원본 정보를 표시합니다.

FAQ

  • <Reference Include="Microsoft.VisualStudio.*.Interop.14.0.DesignTime" />을 로드할 때 포함해야 하는 종속성이 있나요??

    • 모든 interop DLL에서 EmbedInteropTypes="true"를 설정합니다.
  • 내 확장으로 이미지 매니페스트를 배포하려면 어떻게 해야 하나요?

    • 프로젝트에 .imagemanifest 파일을 추가합니다.

    • "VSIX에 포함"을 True로 설정합니다.

  • 이미지가 여전히 작동하지 않는데 무엇이 문제인지 어떻게 알 수 있나요?

    • Visual Studio에서 이미지 매니페스트를 찾지 못할 수 있습니다. Visual Studio는 성능상의 이유로 폴더 검색 깊이를 제한하므로 이미지 매니페스트는 확장 프로그램의 루트 폴더에 보관하는 것이 좋습니다.

    • 이미지 매니페스트 파일에 어셈블리 정보가 누락되었을 수 있습니다. 강력한 이름의 어셈블리는 Visual Studio에서 로드하기 위해 추가 정보가 필요합니다. 강력한 이름의 어셈블리를 로드하려면 이미지 매니페스트에 있는 이미지의 리소스 URI에 어셈블리 버전과 공개 키 토큰을 어셈블리 이름과 함께 포함시켜야 합니다.

      <ImageManifest xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns="http://schemas.microsoft.com/VisualStudio/ImageManifestSchema/2014">
        <Symbols>
          <String Name="Resources" Value="/Microsoft.VisualStudio.Shell.UI.Internal;v17.0.0.0;b03f5f7f11d50a3a;Component/Resources" />
          ...
        </Symbols>
        ...
      </ImageManifest>
      
    • 이미지 어셈블리에 대한 코드베이스 항목이 누락되었을 수 있습니다. Visual Studio에 필요한 시간까지 어셈블리가 아직 로드되지 않은 경우 어셈블리를 로드하기 위해 어셈블리를 찾을 위치를 알아야 합니다. 어셈블리의 코드베이스를 추가하려면 ProvideCodeBaseAttribute를 사용하여 코드베이스 항목이 생성되어 확장 프로그램의 pkgdef에 포함되도록 할 수 있습니다.

      [assembly: ProvideCodeBase(AssemblyName = "ClassLibrary1", Version = "1.0.0.0", CodeBase = "$PackageFolder$\\ClassLibrary1.dll")]
      
    • 이전 옵션으로 이미지 로드 문제가 해결되지 않으면 확장 프로그램의 pkgdef에 다음 항목을 드롭하여 로깅을 활성화할 수 있습니다:

      [$RootKey$\ImageLibrary]
      "TraceLevel"="Verbose"
      "TraceFilename"="ImageLibrary.log"
      

      그러면 %UserProfile% 폴더에 ImageLibrary.log 이라는 로그 파일이 생성됩니다. pkgdef에 이러한 항목을 추가한 후 개발자 명령 프롬프트에서 "devenv /updateConfiguration"을 실행해야 합니다. 이렇게 하면 로깅 항목이 활성화되고 VS에서 이미지 매니페스트 캐시를 새로 고쳐 이미지 매니페스트를 읽을 때 발생할 수 있는 오류를 찾을 수 있습니다. 그런 다음 이미지가 로드될 것으로 예상되는 시나리오를 실행하는 경우 로그 파일에는 이미지에 대한 등록 로깅과 요청 로깅이 모두 포함됩니다.

  • CPS 프로젝트 시스템을 업데이트하고 있습니다. ImageNameStockIconService는 어떻게 되었나요?

    • 해당 항목은 CPS가 모니커를 사용하도록 업데이트되었을 때 제거되었습니다. 더 이상 StockIconService를 호출할 필요가 없습니다. CPS 유틸리티에서 ToProjectSystemType() 확장 메서드를 사용하여 원하는 KnownMoniker를 메서드나 속성에 전달하기만 하면 됩니다. 아래에서 ImageName에서 KnownMonikers로의 매핑을 찾을 수 있습니다.

      ImageName KnownMoniker
      ImageName.OfflineWebApp KnownImageIds.Web
      ImageName.WebReferencesFolder KnownImageIds.Web
      ImageName.OpenReferenceFolder KnownImageIds.FolderOpened
      ImageName.ReferenceFolder KnownImageIds.Reference
      ImageName.Reference KnownImageIds.Reference
      ImageName.SdlWebReference KnownImageIds.WebReferenceFolder
      ImageName.DiscoWebReference KnownImageIds.DynamicDiscoveryDocument
      ImageName.Folder KnownImageIds.FolderClosed
      ImageName.OpenFolder KnownImageIds.FolderOpened
      ImageName.ExcludedFolder KnownImageIds.HiddenFolderClosed
      ImageName.OpenExcludedFolder KnownImageIds.HiddenFolderOpened
      ImageName.ExcludedFile KnownImageIds.HiddenFile
      ImageName.DependentFile KnownImageIds.GenerateFile
      ImageName.MissingFile KnownImageIds.DocumentWarning
      ImageName.WindowsForm KnownImageIds.WindowsForm
      ImageName.WindowsUserControl KnownImageIds.UserControl
      ImageName.WindowsComponent KnownImageIds.ComponentFile
      ImageName.XmlSchema KnownImageIds.XMLSchema
      ImageName.XmlFile KnownImageIds.XMLFile
      ImageName.WebForm KnownImageIds.Web
      ImageName.WebService KnownImageIds.WebService
      ImageName.WebUserControl KnownImageIds.WebUserControl
      ImageName.WebCustomUserControl KnownImageIds.WebCustomControl
      ImageName.AspPage KnownImageIds.ASPFile
      ImageName.GlobalApplicationClass KnownImageIds.SettingsFile
      ImageName.WebConfig KnownImageIds.ConfigurationFile
      ImageName.HtmlPage KnownImageIds.HTMLFile
      ImageName.StyleSheet KnownImageIds.StyleSheet
      ImageName.ScriptFile KnownImageIds.JSScript
      ImageName.TextFile KnownImageIds.Document
      ImageName.SettingsFile KnownImageIds.Settings
      ImageName.Resources KnownImageIds.DocumentGroup
      ImageName.Bitmap KnownImageIds.Image
      ImageName.Icon KnownImageIds.IconFile
      ImageName.Image KnownImageIds.Image
      ImageName.ImageMap KnownImageIds.ImageMapFile
      ImageName.XWorld KnownImageIds.XWorldFile
      ImageName.Audio KnownImageIds.Sound
      ImageName.Video KnownImageIds.Media
      ImageName.Cab KnownImageIds.CABProject
      ImageName.Jar KnownImageIds.JARFile
      ImageName.DataEnvironment KnownImageIds.DataTable
      ImageName.PreviewFile KnownImageIds.Report
      ImageName.DanglingReference KnownImageIds.ReferenceWarning
      ImageName.XsltFile KnownImageIds.XSLTransform
      ImageName.Cursor KnownImageIds.CursorFile
      ImageName.AppDesignerFolder KnownImageIds.Property
      ImageName.Data KnownImageIds.Database
      ImageName.Application KnownImageIds.Application
      ImageName.DataSet KnownImageIds.DatabaseGroup
      ImageName.Pfx KnownImageIds.Certificate
      ImageName.Snk KnownImageIds.Rule
      ImageName.VisualBasicProject KnownImageIds.VBProjectNode
      ImageName.CSharpProject KnownImageIds.CSProjectNode
      ImageName.Empty KnownImageIds.Blank
      ImageName.MissingFolder KnownImageIds.FolderOffline
      ImageName.SharedImportReference KnownImageIds.SharedProject
      ImageName.SharedProjectCs KnownImageIds.CSSharedProject
      ImageName.SharedProjectVc KnownImageIds.CPPSharedProject
      ImageName.SharedProjectJs KnownImageIds.JSSharedProject
      ImageName.CSharpCodeFile KnownImageIds.CSFileNode
      ImageName.VisualBasicCodeFile KnownImageIds.VBFileNode
  • 완료 목록 공급자를 업데이트하고 있습니다. 이전 StandardGlyphGroupStandardGlyph 값과 일치하는 KnownMonikers는 무엇인가요?

    속성 속성 속성
    GlyphGroupClass GlyphItemPublic ClassPublic
    GlyphGroupClass GlyphItemInternal ClassInternal
    GlyphGroupClass GlyphItemFriend ClassInternal
    GlyphGroupClass GlyphItemProtected ClassProtected
    GlyphGroupClass GlyphItemPrivate ClassPrivate
    GlyphGroupClass GlyphItemShortcut ClassShortcut
    GlyphGroupConstant GlyphItemPublic ConstantPublic
    GlyphGroupConstant GlyphItemInternal ConstantInternal
    GlyphGroupConstant GlyphItemFriend ConstantInternal
    GlyphGroupConstant GlyphItemProtected ConstantProtected
    GlyphGroupConstant GlyphItemPrivate ConstantPrivate
    GlyphGroupConstant GlyphItemShortcut ConstantShortcut
    GlyphGroupDelegate GlyphItemPublic DelegatePublic
    GlyphGroupDelegate GlyphItemInternal DelegateInternal
    GlyphGroupDelegate GlyphItemFriend DelegateInternal
    GlyphGroupDelegate GlyphItemProtected DelegateProtected
    GlyphGroupDelegate GlyphItemPrivate DelegatePrivate
    GlyphGroupDelegate GlyphItemShortcut DelegateShortcut
    GlyphGroupEnum GlyphItemPublic EnumerationPublic
    GlyphGroupEnum GlyphItemInternal EnumerationInternal
    GlyphGroupEnum GlyphItemFriend EnumerationInternal
    GlyphGroupEnum GlyphItemProtected EnumerationProtected
    GlyphGroupEnum GlyphItemPrivate EnumerationPrivate
    GlyphGroupEnum GlyphItemShortcut EnumerationShortcut
    GlyphGroupEnumMember GlyphItemPublic EnumerationItemPublic
    GlyphGroupEnumMember GlyphItemInternal EnumerationItemInternal
    GlyphGroupEnumMember GlyphItemFriend EnumerationItemInternal
    GlyphGroupEnumMember GlyphItemProtected EnumerationItemProtected
    GlyphGroupEnumMember GlyphItemPrivate EnumerationItemPrivate
    GlyphGroupEnumMember GlyphItemShortcut EnumerationItemShortcut
    GlyphGroupEvent GlyphItemPublic EventPublic
    GlyphGroupEvent GlyphItemInternal EventInternal
    GlyphGroupEvent GlyphItemFriend EventInternal
    GlyphGroupEvent GlyphItemProtected EventProtected
    GlyphGroupEvent GlyphItemPrivate EventPrivate
    GlyphGroupEvent GlyphItemShortcut EventShortcut
    GlyphGroupException GlyphItemPublic ExceptionPublic
    GlyphGroupException GlyphItemInternal ExceptionInternal
    GlyphGroupException GlyphItemFriend ExceptionInternal
    GlyphGroupException GlyphItemProtected ExceptionProtected
    GlyphGroupException GlyphItemPrivate ExceptionPrivate
    GlyphGroupException GlyphItemShortcut ExceptionShortcut
    GlyphGroupField GlyphItemPublic FieldPublic
    GlyphGroupField GlyphItemInternal FieldInternal
    GlyphGroupField GlyphItemFriend FieldInternal
    GlyphGroupField GlyphItemProtected FieldProtected
    GlyphGroupField GlyphItemPrivate FieldPrivate
    GlyphGroupField GlyphItemShortcut FieldShortcut
    GlyphGroupInterface GlyphItemPublic InterfacePublic
    GlyphGroupInterface GlyphItemInternal InterfaceInternal
    GlyphGroupInterface GlyphItemFriend InterfaceInternal
    GlyphGroupInterface GlyphItemProtected InterfaceProtected
    GlyphGroupInterface GlyphItemPrivate InterfacePrivate
    GlyphGroupInterface GlyphItemShortcut InterfaceShortcut
    GlyphGroupMacro GlyphItemPublic MacroPublic
    GlyphGroupMacro GlyphItemInternal MacroInternal
    GlyphGroupMacro GlyphItemFriend MacroInternal
    GlyphGroupMacro GlyphItemProtected MacroProtected
    GlyphGroupMacro GlyphItemPrivate MacroPrivate
    GlyphGroupMacro GlyphItemShortcut MacroShortcut
    GlyphGroupMap GlyphItemPublic MapPublic
    GlyphGroupMap GlyphItemInternal MapInternal
    GlyphGroupMap GlyphItemFriend MapInternal
    GlyphGroupMap GlyphItemProtected MapProtected
    GlyphGroupMap GlyphItemPrivate MapPrivate
    GlyphGroupMap GlyphItemShortcut MapShortcut
    GlyphGroupMapItem GlyphItemPublic MapItemPublic
    GlyphGroupMapItem GlyphItemInternal MapItemInternal
    GlyphGroupMapItem GlyphItemFriend MapItemInternal
    GlyphGroupMapItem GlyphItemProtected MapItemProtected
    GlyphGroupMapItem GlyphItemPrivate MapItemPrivate
    GlyphGroupMapItem GlyphItemShortcut MapItemShortcut
    GlyphGroupMethod GlyphItemPublic MethodPublic
    GlyphGroupMethod GlyphItemInternal MethodInternal
    GlyphGroupMethod GlyphItemFriend MethodInternal
    GlyphGroupMethod GlyphItemProtected MethodProtected
    GlyphGroupMethod GlyphItemPrivate MethodPrivate
    GlyphGroupMethod GlyphItemShortcut MethodShortcut
    GlyphGroupOverload GlyphItemPublic MethodPublic
    GlyphGroupOverload GlyphItemInternal MethodInternal
    GlyphGroupOverload GlyphItemFriend MethodInternal
    GlyphGroupOverload GlyphItemProtected MethodProtected
    GlyphGroupOverload GlyphItemPrivate MethodPrivate
    GlyphGroupOverload GlyphItemShortcut MethodShortcut
    GlyphGroupModule GlyphItemPublic ModulePublic
    GlyphGroupModule GlyphItemInternal ModuleInternal
    GlyphGroupModule GlyphItemFriend ModuleInternal
    GlyphGroupModule GlyphItemProtected ModuleProtected
    GlyphGroupModule GlyphItemPrivate ModulePrivate
    GlyphGroupModule GlyphItemShortcut ModuleShortcut
    GlyphGroupNamespace GlyphItemPublic NamespacePublic
    GlyphGroupNamespace GlyphItemInternal NamespaceInternal
    GlyphGroupNamespace GlyphItemFriend NamespaceInternal
    GlyphGroupNamespace GlyphItemProtected NamespaceProtected
    GlyphGroupNamespace GlyphItemPrivate NamespacePrivate
    GlyphGroupNamespace GlyphItemShortcut NamespaceShortcut
    GlyphGroupOperator GlyphItemPublic OperatorPublic
    GlyphGroupOperator GlyphItemInternal OperatorInternal
    GlyphGroupOperator GlyphItemFriend OperatorInternal
    GlyphGroupOperator GlyphItemProtected OperatorProtected
    GlyphGroupOperator GlyphItemPrivate OperatorPrivate
    GlyphGroupOperator GlyphItemShortcut OperatorShortcut
    GlyphGroupProperty GlyphItemPublic PropertyPublic
    GlyphGroupProperty GlyphItemInternal PropertyInternal
    GlyphGroupProperty GlyphItemFriend PropertyInternal
    GlyphGroupProperty GlyphItemProtected PropertyProtected
    GlyphGroupProperty GlyphItemPrivate PropertyPrivate
    GlyphGroupProperty GlyphItemShortcut PropertyShortcut
    GlyphGroupStruct GlyphItemPublic StructurePublic
    GlyphGroupStruct GlyphItemInternal StructureInternal
    GlyphGroupStruct GlyphItemFriend StructureInternal
    GlyphGroupStruct GlyphItemProtected StructureProtected
    GlyphGroupStruct GlyphItemPrivate StructurePrivate
    GlyphGroupStruct GlyphItemShortcut StructureShortcut
    GlyphGroupTemplate GlyphItemPublic TemplatePublic
    GlyphGroupTemplate GlyphItemInternal TemplateInternal
    GlyphGroupTemplate GlyphItemFriend TemplateInternal
    GlyphGroupTemplate GlyphItemProtected TemplateProtected
    GlyphGroupTemplate GlyphItemPrivate TemplatePrivate
    GlyphGroupTemplate GlyphItemShortcut TemplateShortcut
    GlyphGroupTypedef GlyphItemPublic TypeDefinitionPublic
    GlyphGroupTypedef GlyphItemInternal TypeDefinitionInternal
    GlyphGroupTypedef GlyphItemFriend TypeDefinitionInternal
    GlyphGroupTypedef GlyphItemProtected TypeDefinitionProtected
    GlyphGroupTypedef GlyphItemPrivate TypeDefinitionPrivate
    GlyphGroupTypedef GlyphItemShortcut TypeDefinitionShortcut
    GlyphGroupType GlyphItemPublic TypePublic
    GlyphGroupType GlyphItemInternal TypeInternal
    GlyphGroupType GlyphItemFriend TypeInternal
    GlyphGroupType GlyphItemProtected TypeProtected
    GlyphGroupType GlyphItemPrivate TypePrivate
    GlyphGroupType GlyphItemShortcut TypeShortcut
    GlyphGroupUnion GlyphItemPublic UnionPublic
    GlyphGroupUnion GlyphItemInternal UnionInternal
    GlyphGroupUnion GlyphItemFriend UnionInternal
    GlyphGroupUnion GlyphItemProtected UnionProtected
    GlyphGroupUnion GlyphItemPrivate UnionPrivate
    GlyphGroupUnion GlyphItemShortcut UnionShortcut
    GlyphGroupVariable GlyphItemPublic FieldPublic
    GlyphGroupVariable GlyphItemInternal FieldInternal
    GlyphGroupVariable GlyphItemFriend FieldInternal
    GlyphGroupVariable GlyphItemProtected FieldProtected
    GlyphGroupVariable GlyphItemPrivate FieldPrivate
    GlyphGroupVariable GlyphItemShortcut FieldShortcut
    GlyphGroupValueType GlyphItemPublic ValueTypePublic
    GlyphGroupValueType GlyphItemInternal ValueTypeInternal
    GlyphGroupValueType GlyphItemFriend ValueTypeInternal
    GlyphGroupValueType GlyphItemProtected ValueTypeProtected
    GlyphGroupValueType GlyphItemPrivate ValueTypePrivate
    GlyphGroupValueType GlyphItemShortcut ValueTypeShortcut
    GlyphGroupIntrinsic GlyphItemPublic ObjectPublic
    GlyphGroupIntrinsic GlyphItemInternal ObjectInternal
    GlyphGroupIntrinsic GlyphItemFriend ObjectInternal
    GlyphGroupIntrinsic GlyphItemProtected ObjectProtected
    GlyphGroupIntrinsic GlyphItemPrivate ObjectPrivate
    GlyphGroupIntrinsic GlyphItemShortcut ObjectShortcut
    GlyphGroupJSharpMethod GlyphItemPublic MethodPublic
    GlyphGroupJSharpMethod GlyphItemInternal MethodInternal
    GlyphGroupJSharpMethod GlyphItemFriend MethodInternal
    GlyphGroupJSharpMethod GlyphItemProtected MethodProtected
    GlyphGroupJSharpMethod GlyphItemPrivate MethodPrivate
    GlyphGroupJSharpMethod GlyphItemShortcut MethodShortcut
    GlyphGroupJSharpField GlyphItemPublic FieldPublic
    GlyphGroupJSharpField GlyphItemInternal FieldInternal
    GlyphGroupJSharpField GlyphItemFriend FieldInternal
    GlyphGroupJSharpField GlyphItemProtected FieldProtected
    GlyphGroupJSharpField GlyphItemPrivate FieldPrivate
    GlyphGroupJSharpField GlyphItemShortcut FieldShortcut
    GlyphGroupJSharpClass GlyphItemPublic ClassPublic
    GlyphGroupJSharpClass GlyphItemInternal ClassInternal
    GlyphGroupJSharpClass GlyphItemFriend ClassInternal
    GlyphGroupJSharpClass GlyphItemProtected ClassProtected
    GlyphGroupJSharpClass GlyphItemPrivate ClassPrivate
    GlyphGroupJSharpClass GlyphItemShortcut ClassShortcut
    GlyphGroupJSharpNamespace GlyphItemPublic NamespacePublic
    GlyphGroupJSharpNamespace GlyphItemInternal NamespaceInternal
    GlyphGroupJSharpNamespace GlyphItemFriend NamespaceInternal
    GlyphGroupJSharpNamespace GlyphItemProtected NamespaceProtected
    GlyphGroupJSharpNamespace GlyphItemPrivate NamespacePrivate
    GlyphGroupJSharpNamespace GlyphItemShortcut NamespaceShortcut
    GlyphGroupJSharpInterface GlyphItemPublic InterfacePublic
    GlyphGroupJSharpInterface GlyphItemInternal InterfaceInternal
    GlyphGroupJSharpInterface GlyphItemFriend InterfaceInternal
    GlyphGroupJSharpInterface GlyphItemProtected InterfaceProtected
    GlyphGroupJSharpInterface GlyphItemPrivate InterfacePrivate
    GlyphGroupJSharpInterface GlyphItemShortcut InterfaceShortcut
    GlyphGroupError StatusError
    GlyphBscFile ClassFile
    GlyphAssembly 참조
    GlyphLibrary 라이브러리
    GlyphVBProject VBProjectNode
    GlyphCoolProject CSProjectNode
    GlyphCppProject CPPProjectNode
    GlyphDialogId 대화 상자
    GlyphOpenFolder FolderOpened
    GlyphClosedFolder FolderClosed
    GlyphArrow GoToNext
    GlyphCSharpFile CSFileNode
    GlyphCSharpExpansion 코드 조각
    GlyphKeyword IntellisenseKeyword
    GlyphInformation StatusInformation
    GlyphReference ClassMethodReference
    GlyphRecursion 재귀
    GlyphXmlItem 태그
    GlyphJSharpProject DocumentCollection
    GlyphJSharpDocument 문서
    GlyphForwardType GoToNext
    GlyphCallersGraph CallTo
    GlyphCallGraph CallFrom
    GlyphWarning StatusWarning
    GlyphMaybeReference QuestionMark
    GlyphMaybeCaller CallTo
    GlyphMaybeCall CallFrom
    GlyphExtensionMethod ExtensionMethod
    GlyphExtensionMethodInternal ExtensionMethod
    GlyphExtensionMethodFriend ExtensionMethod
    GlyphExtensionMethodProtected ExtensionMethod
    GlyphExtensionMethodPrivate ExtensionMethod
    GlyphExtensionMethodShortcut ExtensionMethod
    GlyphXmlAttribute XmlAttribute
    GlyphXmlChild XmlElement
    GlyphXmlDescendant XmlDescendant
    GlyphXmlNamespace XmlNamespace
    GlyphXmlAttributeQuestion XmlAttributeLowConfidence
    GlyphXmlAttributeCheck XmlAttributeHighConfidence
    GlyphXmlChildQuestion XmlElementLowConfidence
    GlyphXmlChildCheck XmlElementHighConfidence
    GlyphXmlDescendantQuestion XmlDescendantLowConfidence
    GlyphXmlDescendantCheck XmlDescendantHighConfidence
    GlyphCompletionWarning IntellisenseWarning