이미지 서비스 및 카탈로그
이 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에서 CrispImage 및 ImageThemingUtilities를 사용하는 경우 필요합니다.
Microsoft.VisualStudio.Imaging.Interop.14.0.DesignTime.dll
ImageMoniker 및 ImageAttributes 형식을 사용하는 경우 필요합니다.
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
- ImageMoniker 및 ImageAttributes 형식을 사용하는 경우 필요합니다.
VSShell140.h
- IVsImageService2 형식을 사용하는 경우 필요합니다.
ImageThemingUtilities.h
이미지 서비스에서 테마를 처리하도록 할 수 없는 경우 필요합니다.
이미지 서비스에서 이미지 테마를 처리할 수 있는 경우 이 헤더를 사용하지 마세요.
VsDpiAwareness.h
- DPI 인식 도우미를 사용하여 현재 DPI를 가져오는 경우 필요합니다.
새 WPF UI는 어떻게 작성하나요?
먼저 위의 첫 번째 단계 섹션에 필요한 어셈블리 참조를 프로젝트에 추가합니다. 모든 항목을 추가할 필요는 없으므로 필요한 참조만 추가합니다. (참고: 브러시 대신 색을 사용 중이거나 액세스 권한이 있는 경우 변환기가 필요하지 않으므로 유틸리티에 대한 참조를 건너뛸 수 있습니다.)
원하는 이미지를 선택하고 모니커를 가져옵니다. KnownMoniker를 사용하거나, 사용자 지정 이미지와 모니커가 있는 경우 사용자 고유의 이미지를 사용합니다.
XAML에 CrispImages를 추가합니다. (아래 예제를 참조하세요.)
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 업데이트는 세 가지 기본 단계로 구성된 비교적 간단한 프로세스입니다.
UI의 모든 <이미지> 요소를 <CrispImage> 요소로 바꿉니다.
모든 원본 특성을 모니커 특성으로 변경합니다.
이미지가 변경되지 않고 KnownMonikers를 사용하는 경우 해당 속성을 KnownMoniker에 정적으로 바인딩합니다. (위 예제를 참조하세요.)
이미지가 변경되지 않고 고유한 사용자 지정 이미지를 사용하는 경우 고유한 모니커에 정적으로 바인딩합니다.
이미지를 변경할 수 있는 경우 속성 변경을 알리는 코드 속성에 모니커 특성을 바인딩합니다.
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)을 선택합니다. 프로젝트 언어의 확장성 노드에서 사용자 지정 도구 창을 선택하고 도구 창에 이름을 지정한 다음, 추가 단추를 누릅니다.
도구 창에서 모니커를 사용하는 주요 위치입니다. 다음 각각에 대한 지침을 따르세요.
탭이 충분히 작아지면 도구 창 탭(Ctrl+Tab 창 전환기에서도 사용됨)
ToolWindowPane 형식에서 파생되는 클래스의 생성자에 다음 줄을 추가합니다.
// Replace this KnownMoniker with your desired ImageMoniker this.BitmapImageMoniker = KnownMonikers.Blank;
도구 창을 여는 명령입니다.
패키지의
.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"/>
기존 도구 창에서 이미지 모니커를 어떻게 사용하나요?
이미지 모니커를 사용하도록 기존 도구 창을 업데이트하는 작업은 새 도구 창을 만드는 단계와 비슷합니다.
도구 창에서 모니커를 사용하는 주요 위치입니다. 다음 각각에 대한 지침을 따르세요.
탭이 충분히 작아지면 도구 창 탭(Ctrl+Tab 창 전환기에서도 사용됨)
ToolWindowPane 형식에서 파생되는 클래스의 생성자에서 다음 줄(있는 경우)을 제거합니다.
this.BitmapResourceID = <Value>; this.BitmapIndex = <Value>;
위의 "새 도구 창에서 이미지 모니커를 어떻게 사용하나요?" 섹션에서 1단계를 참조하세요.
도구 창을 여는 명령입니다.
- 위의 "새 도구 창에서 이미지 모니커를 어떻게 사용하나요?" 섹션에서 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를 제공하는 방법
프로젝트의 IVsHierarchy에 VSHPROPID_SupportsIconMonikers를 구현하고 true를 반환합니다.
VSHPROPID_IconMonikerImageList(원래 프로젝트에서 VSHPROPID_IconImgList를 사용한 경우) 또는 VSHPROPID_IconMonikerGuid, VSHPROPID_IconMonikerId, VSHPROPID_OpenFolderIconMonikerGuid, VSHPROPID_OpenFolderIconMonikerId(원래 프로젝트에서 VSHPROPID_IconHandle 및 VSHPROPID_OpenFolderIconHandle을 사용한 경우)을 구현합니다.
확장 지점에서 요청하는 경우 아이콘의 "레거시" 버전을 만들도록 원래 VSHPROPID의 구현을 변경합니다. IVsImageService2는 해당 아이콘을 가져오는 데 필요한 기능을 제공합니다.
VB/C# 프로젝트 버전에 대한 추가 요구 사항
프로젝트가 가장 바깥쪽 버전임을 감지한 경우에만 VSHPROPID_SupportsIconMonikers를 구현합니다. 그렇지 않으면 가장 바깥쪽 버전이 실제로 이미지 모니커를 지원하지 않을 수 있으며 기본 버전이 사용자 지정 이미지를 효과적으로 "숨길" 수 있습니다.
CPS에서 이미지 모니커를 어떻게 사용하나요?
CPS(Common Project System)에서 사용자 지정 이미지를 설정하는 작업은 수동으로 또는 Project System Extensibility SDK와 함께 제공되는 항목 템플릿을 통해 수행할 수 있습니다.
프로젝트 시스템 확장성 SDK 사용
프로젝트 형식/항목 형식에 대한 사용자 지정 아이콘 제공의 지침에 따라 CPS 이미지를 사용자 지정합니다. CPS에 대한 자세한 내용은 Visual Studio 프로젝트 시스템 확장성 설명서에서 찾을 수 있습니다.
수동으로 ImageMonikers 사용
프로젝트 시스템에서 IProjectTreeModifier 인터페이스를 구현하고 내보냅니다.
사용할 KnownMoniker 또는 사용자 지정 이미지 모니커를 결정합니다.
ApplyModifications 메서드에서 아래 예제와 유사하게 새 트리를 반환하기 전에 메서드의 임의 위치에서 다음을 수행합니다.
// Replace this KnownMoniker with your desired ImageMoniker tree = tree.SetIcon(KnownMonikers.Blank.ToProjectSystemType());
새 트리를 만드는 경우 아래 예제와 유사하게 원하는 모니커를 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로 인해 제약을 받는 경우에도 이미지 서비스의 이점을 얻을 수 있습니다. 모니커 기반 이미지 스트립을 만들려면 아래 단계에 따라 기존 모니커에서 매니페스트를 만듭니다.
ManifestFromResources 도구를 실행하여 이미지 스트립을 전달합니다. 그러면 스트립에 대한 매니페스트가 생성됩니다.
- 권장: 매니페스트의 사용량에 맞게 기본값이 아닌 이름을 제공합니다.
KnownMonikers만 사용하는 경우 다음을 수행합니다.
매니페스트의 <이미지> 섹션을 <이미지/>로 바꿉니다.
모든 하위 이미지 ID(<이미지 스트립 이름>_## 포함)를 제거합니다.
권장: 사용량에 맞게 AssetsGuid 기호 및 이미지 스트립 기호의 이름을 바꿉니다.
각 ContainedImage의 GUID를 $(ImageCatalogGuid)로 바꾸고, 각 ContainedImage의 ID를 $(<모니커>)로 바꾸고, External="true" 특성을 각 ContainedImage에 추가합니다.
- <모니커>는 KnownMoniker로 바꿔야 하며 이는 이미지와 일치하지만 이름에서 제거된 "KnownMonikers"입니다.
<기호> 섹션의 상단에 >*\Microsoft.VisualStudio.ImageCatalog.imagemanifest" /*>에 대한 <Import Manifest="$(ManifestFolder)\< 상대 설치 디렉터리 경로를 추가합니다.
- 상대 경로는 매니페스트에 대한 설치 작성에 정의된 배포 위치에 따라 결정됩니다.
ManifestToCode 도구를 실행해 래퍼를 생성하여 기존 코드가 이미지 스트립에 대한 이미지 서비스를 쿼리하는 데 사용할 수 있는 모니커가 있도록 합니다.
- 권장: 래퍼 및 네임스페이스에 대한 기본값이 아닌 이름을 사용량에 맞게 제공합니다.
모든 추가, 설치 작성/배포 및 기타 코드 변경을 수행하여 이미지 서비스 및 새 파일과 사용합니다.
내부 및 외부 이미지가 모두 포함된 샘플 매니페스트는 다음과 같이 표시되어야 합니다.
<?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를 지원할 필요 없음
이미지 스트립의 이미지와 일치하는 KnownMonikers 집합을 결정하거나, 이미지 스트립의 이미지에 대한 고유한 이름을 만듭니다.
대신에 모니커를 사용하려면 이미지 스트립의 필수 인덱스에서 이미지를 가져오는 데 사용한 매핑을 업데이트합니다.
이미지 서비스를 사용하여 업데이트된 매핑을 통해 모니커를 요청하려면 코드를 업데이트합니다. (이는 관리 코드에 대해 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 프로젝트 시스템을 업데이트하고 있습니다. ImageName 및 StockIconService는 어떻게 되었나요?
해당 항목은 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
완료 목록 공급자를 업데이트하고 있습니다. 이전 StandardGlyphGroup 및 StandardGlyph 값과 일치하는 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