이 요리 문서에는 Visual Studio 2015에 도입된 Visual Studio Image Service 및 이미지 카탈로그를 채택하기 위한 지침과 모범 사례가 포함되어 있습니다.
Visual Studio 2015에 도입된 이미지 서비스를 통해 개발자는 디바이스에 가장 적합한 이미지와 사용자가 선택한 테마를 가져와 표시되는 컨텍스트에 대한 올바른 테마를 포함하여 이미지를 표시할 수 있습니다. 이미지 서비스를 채택하면 자산 유지 관리, HDPI 크기 조정 및 테마와 관련된 주요 문제를 제거하는 데 도움이 됩니다.
| 오늘 문제 | 솔루션 |
|---|---|
| 배경색 혼합 | 기본 제공 알파 블렌딩 |
| 일부 이미지 테마 지정 | 테마 메타데이터 |
| 고대비 모드 | 대체 고대비 리소스 |
| 다른 DPI 모드에 여러 리소스 필요 | 벡터 기반 대체를 사용하는 선택 가능한 리소스 |
| 중복 이미지 | 이미지 개념당 하나의 식별자 |
이미지 서비스를 채택하는 이유는 무엇인가요?
항상 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>
<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>
| 하위 요소 | 정의 |
|---|---|
| Import | 현재 매니페스트에서 사용할 지정된 매니페스트 파일의 기호를 가져옵니다. |
| 가이드 | 기호는 GUID를 나타내며 GUID 서식과 일치해야 합니다. |
| 아이디 | 기호는 ID를 나타내며 음수가 아닌 정수여야 합니다. |
| String | 기호는 임의의 문자열 값을 나타냅니다. |
기호는 대/소문자를 구분하며 $(symbol-name) 구문을 사용하여 참조됩니다.
<Image Guid="$(ShellCommandGuid)" ID="$(cmdidSaveAll)" >
<Source Uri="/$(AssemblyName);Component/Resources/image.xaml" />
</Image>
일부 기호는 모든 매니페스트에 대해 미리 정의됩니다. 원본 또는 <Import> 요소의 Uri 특성에서 로컬 컴퓨터의 <> 경로를 참조하는 데 사용할 수 있습니다.
| 기호 | 설명 |
|---|---|
| CommonProgramFiles (공용 프로그램 파일) | %CommonProgramFiles% 환경 변수의 값입니다. |
| LocalAppData | %LocalAppData% 환경 변수의 값입니다. |
| 매니페스트폴더 | 매니페스트 파일이 포함된 폴더 |
| MyDocuments | 현재 사용자의 내 문서 폴더 전체 경로 |
| ProgramFiles | %ProgramFiles% 환경 변수의 값입니다. |
| 시스템 | Windows\System32 폴더 |
| WinDir | %WinDir% 환경 변수의 값입니다. |
Image
<Image> 요소는 모니커에서 참조할 수 있는 이미지를 정의합니다. 함께 가져온 GUID와 ID는 이미지 모니커를 형성합니다. 이미지의 모니커는 전체 이미지 라이브러리에서 고유해야 합니다. 둘 이상의 이미지에 지정된 모니커가 있는 경우 라이브러리를 빌드하는 동안 처음 발생하는 모니커가 유지됩니다.
하나 이상의 원본을 포함해야 합니다. 크기 중립적 소스는 광범위한 크기에서 최상의 결과를 제공하지만 필수는 아닙니다. 서비스에 Image< 요소에 >정의되지 않은 크기의 이미지가 요청되고 크기 중립적 원본이 없는 경우 서비스는 최상의 크기별 원본을 선택하고 요청된 크기로 크기를 조정합니다.
<Image Guid="guid" ID="int" AllowColorInversion="true/false">
<Source ... />
<!-- optional additional Source elements -->
</Image>
| 속성 | 정의 |
|---|---|
| 가이드 | [필수] 이미지 모니커의 GUID 부분입니다. |
| 아이디 | [필수] 이미지 모니커의 ID 부분입니다. |
| 색상 반전 허용 | [선택 사항, 기본값 true] 어두운 배경에서 사용할 때 이미지의 색을 프로그래밍 방식으로 반전할 수 있는지 여부를 나타냅니다. |
출처
<Source> 요소는 단일 이미지 원본 자산(XAML 및 PNG)을 정의합니다.
<Source Uri="uri" Background="background">
<!-- optional NativeResource element -->
</Source>
| 속성 | 정의 |
|---|---|
| Uri | [필수] 이미지를 로드할 수 있는 위치를 정의하는 URI입니다. 다음 중 하나일 수 있습니다. - application:/// 권한을 사용하는 팩 URI - 절대 구성 요소 리소스 참조 - 네이티브 리소스를 포함하는 파일의 경로 |
| 배경 | [선택 사항] 원본이 사용하려는 배경의 종류를 나타냅니다. 다음 중 하나일 수 있습니다. 광: 원본은 밝은 배경에서 사용할 수 있습니다. 어둠: 원본은 어두운 배경에서 사용할 수 있습니다. HighContrast: 고대비 모드의 모든 배경에서 원본을 사용할 수 있습니다. HighContrastLight: 고대비 모드의 밝은 배경에서 원본을 사용할 수 있습니다. HighContrastDark: 원본은 고대비 모드의 어두운 배경에서 사용할 수 있습니다. Background 특성을 생략하면 모든 백그라운드에서 원본을 사용할 수 있습니다. 배경이 밝게, 어둡게, HighContrastLight 또는 HighContrastDark인 경우 원본의 색은 반전되지 않습니다. Background를 생략하거나 HighContrast로 설정하면 원본 색의 반전이 이미지의 AllowColorInversion 특성에 의해 제어됩니다. |
<Source> 요소에는 다음 선택적 하위 요소 중 하나만 있을 수 있습니다.
| 요소 | 특성(모두 필요) | 정의 |
|---|---|---|
| <크기> | 가치 | 원본은 지정된 크기의 이미지(디바이스 단위)에 사용됩니다. 이미지는 정사각형입니다. |
| <크기 범위> | MinSize, MaxSize | 원본은 MinSize에서 MaxSize(디바이스 단위)에 이르는 이미지에 사용됩니다. 이미지는 정사각형입니다. |
| <치수> | 너비, 높이 | 원본은 지정된 너비와 높이(디바이스 단위)의 이미지에 사용됩니다. |
| <차원범위> | MinWidth (최소 너비), MinHeight (최소 높이) MaxWidth, MaxHeight |
원본은 최소 너비/높이에서 최대 너비/높이(디바이스 단위)에 이르는 이미지에 사용됩니다. |
<Source> 요소에는 관리되는 어셈블리가 아닌 네이티브 어셈블리에서 로드되는 <Source>를 정의하는 선택적인 <NativeResource> 하위 요소가 있을 수도 있습니다.
<NativeResource Type="type" ID="int" />
| 속성 | 정의 |
|---|---|
| 유형 | [필수] 네이티브 리소스의 형식(XAML 또는 PNG) |
| 아이디 | [필수] 네이티브 리소스의 정수 ID 부분입니다. |
ImageList
<ImageList> 요소는 단일 스트립에서 반환할 수 있는 이미지 컬렉션을 정의합니다. 스트립은 필요에 따라 주문형으로 제작됩니다.
<ImageList>
<ContainedImage Guid="guid" ID="int" External="true/false" />
<!-- optional additional ContainedImage elements -->
</ImageList>
| 속성 | 정의 |
|---|---|
| 가이드 | [필수] 이미지 모니커의 GUID 부분입니다. |
| 아이디 | [필수] 이미지 모니커의 ID 부분입니다. |
| External | [선택 사항, 기본값 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에 정적으로 바인딩합니다. (위의 예제를 참조하세요.)
이미지가 변경되지 않으며 사용자 고유의 사용자 지정 이미지를 사용하는 경우 사용자 고유의 모니커에 정적으로 바인딩합니다.
이미지를 변경할 수 있는 경우 속성 변경 내용을 알릴 코드 속성에 Moniker 특성을 바인딩합니다.
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>
이전 버전의 Visual Studio에서도 .vsct 파일을 읽어야 하는 경우 어떻게 되나요?
이전 버전의 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(일반 프로젝트 시스템)에서 사용자 지정 이미지 설정은 수동으로 또는 프로젝트 시스템 확장성 SDK와 함께 제공되는 항목 템플릿을 통해 수행할 수 있습니다.
프로젝트 시스템 확장성 SDK 사용
프로젝트 유형/항목 유형에 대한 사용자 지정 아이콘 제공의 지침에 따라 CPS 이미지를 사용자 지정합니다. CPS에 대한 자세한 내용은 Visual Studio Project System 확장성 설명서에서 찾을 수 있습니다.
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(<imagestrip name>_##가 포함된 항목)을 제거합니다.
권장 사항: AssetsGuid 기호 및 이미지 스트립 기호의 이름을 해당 용도에 맞게 바꿉니다.
각 ContainedImage의 GUID를 $(ImageCatalogGuid)로 바꾸고, 각 ContainedImage의 ID를 $(<모니커>)로 바꾸고, 각 ContainedImage에 External="true" 특성을 추가합니다.
- <모니커는> 이미지와 일치하는 KnownMoniker으로 바꿔야 하며, 이름에서 "KnownMonikers."를 제거해야 합니다.
기호 섹션의 맨 위에 <Import Manifest="$(ManifestFolder)\<Relative install dir 경로를 *>\Microsoft.VisualStudio.ImageCatalog.imagemanifest" /*> 행을 추가<>합니다.
- 상대 경로는 매니페스트에 대한 설치 작성에 정의된 배포 위치에 따라 결정됩니다.
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에서 도구를 찾을 수 있습니다. 이 도구 및 기타 도구에 대한 설명서는 여기에서 찾을 수 있습니다.
추가 리소스
Samples
다양한 Visual Studio 확장성 지점의 일부로 이미지 서비스를 사용하는 방법을 보여 주도록 GitHub의 여러 Visual Studio 샘플이 업데이트되었습니다.
최신 샘플을 http://github.com/Microsoft/VSSDK-Extensibility-Samples에서 확인하세요.
Tooling
Image Service에서 작동하는 UI를 만들거나 업데이트하는 데 도움이 되도록 Image Service에 대한 지원 도구 집합이 만들어졌습니다. 각 도구에 대한 자세한 내용은 도구와 함께 제공되는 설명서를 확인하세요. 도구는 Visual Studio 2015 SDK의 일부로 포함됩니다.
ManifestFromResources
리소스의 매니페스트 도구는 이미지 리소스 목록(PNG 또는 XAML)을 사용하고 이미지 서비스와 함께 해당 이미지를 사용하기 위한 이미지 매니페스트 파일을 생성합니다.
ManifestToCode
매니페스트-코드 도구는 이미지 매니페스트 파일을 사용하고 코드(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.참조폴더열기 KnownImageIds.FolderOpened ImageName.ReferenceFolder KnownImageIds.Reference ImageName.Reference KnownImageIds.Reference ImageName.SdlWebReference KnownImageIds.웹참조폴더 ImageName.디스코웹레퍼런스 KnownImageIds.DynamicDiscoveryDocument ImageName.폴더 KnownImageIds.FolderClosed 이미지이름.폴더열기 KnownImageIds.FolderOpened 이미지이름.제외된_폴더 KnownImageIds.HiddenFolderClosed 이미지이름.제외된폴더열기 숨겨진폴더열림_이미지ID ImageName.제외된파일 알려진이미지ID.숨김파일 이미지 이름.종속 파일 (ImageName.DependentFile) KnownImageIds.GenerateFile ImageName.누락된파일 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.웹사용자제어 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.설정 ImageName.리소스 KnownImageIds.DocumentGroup 이미지이름.비트맵 KnownImageIds.Image ImageName.Icon KnownImageIds.IconFile ImageName.Image KnownImageIds.Image ImageName.ImageMap KnownImageIds.ImageMapFile ImageName.XWorld KnownImageIds.XWorldFile ImageName.Audio KnownImageIds.사운드 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 알려진이미지ID.커서파일 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.누락된폴더 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 클래스프라이빗 GlyphGroupClass GlyphItemShortcut ClassShortcut GlyphGroupConstant GlyphItemPublic ConstantPublic 글리프그룹컨스턴트 (GlyphGroupConstant) GlyphItemInternal ConstantInternal GlyphGroupConstant GlyphItemFriend ConstantInternal GlyphGroupConstant GlyphItemProtected ConstantProtected GlyphGroupConstant GlyphItemPrivate ConstantPrivate GlyphGroupConstant GlyphItemShortcut ConstantShortcut 글리프그룹 대리자 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 열거 바로 가기 GlyphGroupEnumMember GlyphItemPublic 열거_항목_공개 GlyphGroupEnumMember GlyphItemInternal 열거항목내부 GlyphGroupEnumMember GlyphItemFriend 열거항목내부 GlyphGroupEnumMember GlyphItemProtected EnumerationItemProtected GlyphGroupEnumMember GlyphItemPrivate EnumerationItemPrivate GlyphGroupEnumMember GlyphItemShortcut 열거 항목 바로 가기 GlyphGroupEvent GlyphItemPublic EventPublic GlyphGroupEvent GlyphItemInternal EventInternal GlyphGroupEvent GlyphItemFriend EventInternal GlyphGroupEvent GlyphItemProtected 이벤트 보호 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 필드단축키 GlyphGroupInterface GlyphItemPublic InterfacePublic GlyphGroupInterface GlyphItemInternal InterfaceInternal GlyphGroupInterface GlyphItemFriend InterfaceInternal 글리프그룹인터페이스 GlyphItemProtected 인터페이스 보호됨 GlyphGroupInterface GlyphItemPrivate InterfacePrivate GlyphGroupInterface GlyphItemShortcut 인터페이스 단축키 GlyphGroupMacro GlyphItemPublic MacroPublic GlyphGroupMacro GlyphItemInternal MacroInternal GlyphGroupMacro GlyphItemFriend MacroInternal GlyphGroupMacro GlyphItemProtected MacroProtected GlyphGroupMacro GlyphItemPrivate MacroPrivate GlyphGroupMacro GlyphItemShortcut MacroShortcut GlyphGroupMap GlyphItemPublic MapPublic 글리프 그룹 맵 GlyphItemInternal MapInternal GlyphGroupMap GlyphItemFriend MapInternal GlyphGroupMap GlyphItemProtected MapProtected GlyphGroupMap GlyphItemPrivate MapPrivate GlyphGroupMap GlyphItemShortcut MapShortcut GlyphGroupMapItem GlyphItemPublic 맵아이템공개 GlyphGroupMapItem GlyphItemInternal MapItemInternal 글리프 그룹 맵 항목 GlyphItemFriend MapItemInternal GlyphGroupMapItem GlyphItemProtected 맵항목보호됨 GlyphGroupMapItem GlyphItemPrivate MapItemPrivate GlyphGroupMapItem GlyphItemShortcut 지도항목바로가기 글리프그룹메소드 GlyphItemPublic MethodPublic 글리프그룹메소드 GlyphItemInternal MethodInternal GlyphGroupMethod (글리프 그룹 메소드) GlyphItemFriend MethodInternal GlyphGroupMethod GlyphItemProtected MethodProtected GlyphGroupMethod GlyphItemPrivate MethodPrivate GlyphGroupMethod GlyphItemShortcut MethodShortcut GlyphGroupOverload GlyphItemPublic MethodPublic 글리프 그룹 과부하 GlyphItemInternal MethodInternal GlyphGroupOverload GlyphItemFriend MethodInternal 글리프그룹오버로드 GlyphItemProtected MethodProtected GlyphGroupOverload GlyphItemPrivate MethodPrivate GlyphGroupOverload GlyphItemShortcut MethodShortcut GlyphGroupModule GlyphItemPublic ModulePublic GlyphGroupModule GlyphItemInternal ModuleInternal GlyphGroupModule GlyphItemFriend ModuleInternal GlyphGroupModule GlyphItemProtected 모듈보호됨 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 글립그룹연산자 GlyphItemInternal OperatorInternal GlyphGroupOperator GlyphItemFriend OperatorInternal GlyphGroupOperator GlyphItemProtected 운영자보호 GlyphGroupOperator GlyphItemPrivate OperatorPrivate GlyphGroupOperator GlyphItemShortcut OperatorShortcut GlyphGroupProperty GlyphItemPublic PropertyPublic GlyphGroupProperty GlyphItemInternal PropertyInternal GlyphGroupProperty GlyphItemFriend PropertyInternal GlyphGroupProperty GlyphItemProtected 재산 보호됨 GlyphGroupProperty GlyphItemPrivate PropertyPrivate GlyphGroupProperty GlyphItemShortcut PropertyShortcut GlyphGroupStruct GlyphItemPublic 구조공개 GlyphGroupStruct (글리프 그룹 구조체) GlyphItemInternal StructureInternal GlyphGroupStruct GlyphItemFriend 구조내부 GlyphGroupStruct GlyphItemProtected 구조보호됨 GlyphGroupStruct GlyphItemPrivate StructurePrivate GlyphGroupStruct GlyphItemShortcut StructureShortcut GlyphGroupTemplate GlyphItemPublic 템플릿퍼블릭 글리프그룹템플릿 (GlyphGroupTemplate) GlyphItemInternal TemplateInternal GlyphGroupTemplate GlyphItemFriend TemplateInternal 글리프그룹템플릿 GlyphItemProtected 템플릿보호 GlyphGroupTemplate GlyphItemPrivate TemplatePrivate GlyphGroupTemplate GlyphItemShortcut 템플릿 단축키 GlyphGroupTypedef GlyphItemPublic TypeDefinitionPublic GlyphGroupTypedef GlyphItemInternal TypeDefinitionInternal GlyphGroupTypedef GlyphItemFriend TypeDefinitionInternal GlyphGroupTypedef GlyphItemProtected 형식정의보호됨 GlyphGroupTypedef GlyphItemPrivate 유형정의비공개 GlyphGroupTypedef GlyphItemShortcut 타입 정의 단축키 GlyphGroupType GlyphItemPublic TypePublic GlyphGroupType GlyphItemInternal 타입내부 글리프그룹유형 GlyphItemFriend TypeInternal GlyphGroupType GlyphItemProtected TypeProtected GlyphGroupType GlyphItemPrivate TypePrivate 글리프그룹유형 GlyphItemShortcut 유형 단축키 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 필드단축키 GlyphGroupValueType GlyphItemPublic ValueTypePublic GlyphGroupValueType GlyphItemInternal ValueTypeInternal GlyphGroupValueType GlyphItemFriend ValueTypeInternal GlyphGroupValueType GlyphItemProtected ValueTypeProtected GlyphGroupValueType GlyphItemPrivate 값형비공개 GlyphGroupValueType GlyphItemShortcut ValueTypeShortcut GlyphGroupIntrinsic GlyphItemPublic ObjectPublic GlyphGroupIntrinsic GlyphItemInternal ObjectInternal GlyphGroupIntrinsic GlyphItemFriend ObjectInternal GlyphGroupIntrinsic GlyphItemProtected 개체 보호됨 GlyphGroupIntrinsic GlyphItemPrivate ObjectPrivate GlyphGroupIntrinsic GlyphItemShortcut ObjectShortcut GlyphGroupJSharpMethod GlyphItemPublic MethodPublic GlyphGroupJSharpMethod GlyphItemInternal MethodInternal GlyphGroupJSharpMethod GlyphItemFriend MethodInternal GlyphGroupJSharpMethod GlyphItemProtected MethodProtected GlyphGroupJSharpMethod GlyphItemPrivate MethodPrivate GlyphGroupJSharpMethod 글리프아이템단축키 MethodShortcut GlyphGroupJSharpField GlyphItemPublic FieldPublic GlyphGroupJSharpField GlyphItemInternal FieldInternal GlyphGroupJSharpField GlyphItemFriend FieldInternal GlyphGroupJSharpField GlyphItemProtected 필드보호 (FieldProtected) GlyphGroupJSharpField GlyphItemPrivate FieldPrivate GlyphGroupJSharpField GlyphItemShortcut 필드단축키 GlyphGroupJSharpClass GlyphItemPublic ClassPublic GlyphGroupJSharpClass GlyphItemInternal ClassInternal GlyphGroupJSharpClass GlyphItemFriend ClassInternal GlyphGroupJSharpClass GlyphItemProtected ClassProtected GlyphGroupJSharpClass GlyphItemPrivate 클래스프라이빗 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 인터페이스 보호됨 GlyphGroupJSharpInterface GlyphItemPrivate InterfacePrivate GlyphGroupJSharpInterface GlyphItemShortcut 인터페이스 단축키 글리프그룹오류 상태 오류 GlyphBscFile ClassFile GlyphAssembly Reference GlyphLibrary 라이브러리 GlyphVBProject VBProjectNode GlyphCoolProject CSProjectNode GlyphCppProject CPPProjectNode GlyphDialogId Dialog GlyphOpenFolder 폴더 열림 글리프닫힌폴더 폴더닫힘 GlyphArrow 다음으로 이동 GlyphCSharpFile CSFileNode GlyphCSharpExpansion 단편 GlyphKeyword IntellisenseKeyword GlyphInformation 상태정보 GlyphReference 클래스 메서드 참조 GlyphRecursion 재귀 GlyphXmlItem Tag GlyphJSharpProject 문서 컬렉션 GlyphJSharpDocument (글리프제이샤프문서) 문서 GlyphForwardType 다음으로 이동 GlyphCallersGraph CallTo GlyphCallGraph CallFrom GlyphWarning 상태 경고 GlyphMaybeReference 물음표 GlyphMaybeCaller CallTo GlyphMaybeCall CallFrom GlyphExtensionMethod 확장 메서드 GlyphExtensionMethodInternal 익스텐션 메서드 GlyphExtensionMethodFriend ExtensionMethod GlyphExtensionMethodProtected ExtensionMethod GlyphExtensionMethodPrivate 확장 메서드 GlyphExtensionMethodShortcut 확장 메서드 GlyphXmlAttribute XmlAttribute GlyphXmlChild XmlElement GlyphXmlDescendant XmlDescendant GlyphXmlNamespace XmlNamespace 글리프Xml속성질문 XmlAttributeLowConfidence (낮은 신뢰도의 XML 특성) GlyphXmlAttributeCheck XmlAttributeHighConfidence GlyphXmlChildQuestion 엑스엠엘 요소 - 낮은 신뢰도 GlyphXmlChildCheck XML 요소 높은 신뢰도 글리프Xml자손질문 XML 자손 낮은 신뢰도 GlyphXmlDescendantCheck XmlDescendantHighConfidence GlyphCompletionWarning IntellisenseWarning