다음을 통해 공유


이미지 서비스 및 카탈로그

이 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" />
</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로 설정합니다.

  • 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