다음을 통해 공유


Visual Studio의 색 및 스타일 지정

Visual Studio에서 색 사용

Visual Studio에서 색은 장식뿐만 아니라 주로 통신 도구로 사용됩니다. 색을 최소한으로 사용하고 다음을 수행하려는 경우에 대비하여 남겨둡니다.

  • 의미 또는 소속 통신(예: 플랫폼 또는 언어 한정자)

  • 주의 끌기(예: 상태 변경 표시)

  • 가독성 향상 및 UI 탐색을 위한 랜드마크 제공

  • 호감도 증가

Visual Studio에서 UI 요소에 색을 할당하기 위한 몇 가지 옵션이 있습니다. 어떤 옵션을 사용해야 하는지 또는 올바르게 사용하는 방법을 파악하기가 어려울 수 있습니다. 이 항목은 다음을 지원합니다.

  • Visual Studio에서 색을 정의하는 데 사용되는 다양한 서비스 및 시스템을 이해합니다.

  • 지정된 요소에 대한 올바른 옵션을 선택합니다.

  • 선택한 옵션을 올바르게 사용합니다.

참고 항목

16진수, RGB 또는 시스템 색을 UI 요소에 하드 코드하지 마세요. 서비스를 사용하면 색상을 유연하게 조정할 수 있습니다. 또한 서비스가 없으면 VSColor 서비스의 테마 전환 기능을 활용할 수 없습니다.

Visual Studio 인터페이스 요소에 색을 할당하는 메서드

UI 요소에 가장 적합한 메서드를 선택합니다.

UI 메서드 무엇인가요?
포함되거나 독립 실행형인 대화 상자가 있습니다. 시스템 색 운영 체제에서 일반적인 대화 상자 컨트롤과 같이 UI 요소의 색과 모양을 정의할 수 있도록 하는 시스템 이름입니다.
전체 VS 환경과 일치하려는 사용자 지정 UI가 있고 공유 토큰의 범주 및 의미 체계 의미와 일치하는 UI 요소가 있습니다. 공통 공유 색 특정 UI 요소에 대해 기존의 미리 정의된 색 토큰 이름
개별 기능 또는 기능 그룹이 있고 유사한 요소에 대한 공유 색이 없습니다. 사용자 지정 색 특정 영역에 고유하며 다른 UI와 공유할 수 없는 색 토큰 이름
최종 사용자가 UI 또는 콘텐츠(예: 텍스트 편집기 또는 특수 디자이너 창)를 사용자 지정할 수 있도록 허용하려고 합니다. 최종 사용자 사용자 지정

(도구 > 옵션 대화 상자)
도구 > 옵션 대화 상자의 “글꼴 및 색” 페이지 또는 하나의 UI 기능과 관련된 특수 페이지에 정의된 설정입니다.

Visual Studio 테마

Visual Studio에는 밝은 색, 어두운 색, 파란색의 세 가지 색 테마가 있습니다. 또한 접근성을 위해 고안된 시스템 차원의 색 테마인 고대비 모드를 감지합니다.

Visual Studio를 처음 사용하는 동안 테마를 선택하라는 메시지가 표시되고 나중에 도구 > 옵션 > 환경 > 일반으로 이동하여 “색 테마” 드롭다운 메뉴에서 새 테마를 선택하고 테마를 전환할 수 있습니다.

사용자는 제어판을 사용하여 전체 시스템을 여러 고대비 테마 중 하나로 전환할 수도 있습니다. 사용자가 고대비 테마를 선택하면 사용자가 고대비 모드를 종료할 때 테마 변경 내용이 저장되지만 Visual Studio 색 테마 선택기는 더 이상 Visual Studio의 색에 영향을 주지 않습니다. 고대비 모드에 대한 자세한 내용은 고대비 색 선택을 참조하세요.

VSColor 서비스

Visual Studio는 VSColor 서비스라고 하는 환경 색 서비스를 제공하므로 각 Visual Studio 테마에 대한 색 값이 포함된 명명된 항목에 UI 요소의 색 값을 바인딩할 수 있습니다. 이렇게 하면 현재 사용자가 선택한 테마 또는 시스템 고대비 모드를 반영하도록 색이 자동으로 변경됩니다. 서비스의 사용은 모든 테마 관련 색 변경의 구현이 한 곳에서 처리된다는 것을 의미하며 서비스에서 공통 공유 색을 사용하는 경우 UI는 Visual Studio 이후 버전에서 새 테마를 자동으로 반영합니다.

구현

Visual Studio 소스 코드에는 토큰 이름 목록과 각 테마의 해당 색 값이 포함된 여러 패키지 정의 파일이 포함되어 있습니다. 색 서비스는 이러한 패키지 정의 파일에 정의된 VSColor를 읽습니다. 이러한 색은 XAML 변경 내용이나 코드에서 참조된 다음, IVsUIShell5.GetThemedColor 메서드 또는 DynamicResource 매핑을 통해 로드됩니다.

시스템 색상

공용 컨트롤은 기본적으로 시스템 색을 참조합니다. 포함된 대화 상자나 독립 실행형 대화 상자를 만들 때와 같이 UI에서 시스템 색을 사용하도록 하려면 아무것도 할 필요가 없습니다.

VSColor 서비스의 공통 공유 색

인터페이스 요소는 전체 Visual Studio 환경을 반영해야 합니다. 디자인 중인 UI 구성 요소에 적합한 공통 공유 색을 다시 사용하면 인터페이스가 다른 Visual Studio 인터페이스와 일치하고 테마가 추가되거나 업데이트될 때 색이 자동으로 업데이트됩니다.

공통 공유 색을 사용하기 전에 해당 색을 올바르게 사용하는 방법을 이해해야 합니다. 일반적인 공유 색을 잘못 사용하면 사용자에게 일관성이 없고 실망스럽거나 혼란스러운 경험을 초래할 수 있습니다.

사용자 지정 가능한 색

참조: 최종 사용자를 위한 색 노출

경우에 따라 코드 편집기 또는 디자인 화면을 만들 때처럼 최종 사용자가 UI를 사용자 지정할 수 있도록 허용할 수 있습니다. 사용자 지정 가능한 UI 구성 요소는 도구 > 옵션 대화 상자의 글꼴 및 색 섹션에서 찾을 수 있습니다. 여기서 사용자는 전경색, 배경색 또는 둘 다를 변경할 수 있습니다.

Tools > Options dialog
도구 > 옵션 대화 상자

VSColor 서비스

Visual Studio는 VSColor 서비스 또는 셸 색 서비스라고도 하는 환경 색 서비스를 제공합니다. 이 서비스를 사용하면 UI 요소의 색 값을 각 테마의 색이 포함된 이름-값 색 집합에 바인딩할 수 있습니다. VSColor 서비스는 모든 UI 요소에 사용해야 하므로 색이 현재 사용자가 선택한 테마를 반영하도록 자동으로 변경되고 환경 색 서비스에 바인딩된 UI가 향후 버전의 Visual Studio에서 새 테마와 통합되도록 해야 합니다.

서비스의 작동 방식

환경 색 서비스는 UI 구성 요소에 대한 .pkgdef에 정의된 VSColor를 읽습니다. 그런 다음 이러한 VSColor는 XAML 변경 내용 또는 코드에서 참조되고 IVsUIShell5.GetThemedColor 또는 DynamicResource 매핑을 통해 로드됩니다.

Environment color service architecture
환경 색 서비스 아키텍처

서비스 액세스

사용 중인 색 토큰의 종류와 코드 종류에 따라 VSColor 서비스에 액세스하는 여러 가지 방법이 있습니다.

미리 정의된 환경 색

네이티브 코드에서

셸은 색의 COLORREF에 대한 액세스를 제공하는 서비스를 제공합니다. 서비스/인터페이스는 다음과 같습니다.

IVsUIShell2::GetVSSysColorEx(VSSYSCOLOR dwSysColIndex, DWORD *pdwRGBval)

VSShell80.idl 파일에서 열거형 __VSSYSCOLOREX에는 셸 색 상수가 있습니다. 이를 사용하려면 MSDN에 문서화된 enum __VSSYSCOLOREX 값 중 하나 또는 Windows 시스템 API GetSysColor가 허용하는 일반 인덱스 번호 중 하나를 인덱스 값으로 전달하세요. 이렇게 하면 두 번째 매개 변수에 사용해야 하는 색의 RGB 값이 다시 반환됩니다.

펜이나 브러시를 새 색으로 저장하는 경우 (Visual Studio 셸 외부에서) AdviseBroadcastMessages하고 WM_SYSCOLORCHANGEWM_THEMECHANGED 메시지를 수신해야 합니다.

네이티브 코드에서 색 서비스에 액세스하려면 다음과 유사한 호출을 수행합니다.

pUIShell2->GetVSSysColorEx(VSCOLOR_COLOR_NAME, &rgbLOCAL_COLOR);

참고 항목

GetVSSysColorEx()에서 반환된 COLORREF 값에는 테마 색의 R, G, B 구성 요소만 포함됩니다. 테마 항목에서 투명도를 사용하는 경우 알파 채널 값은 반환되기 전에 삭제됩니다. 따라서 투명성 채널이 중요한 위치에서 관심 환경 색을 사용해야 하는 경우 이 항목의 뒷부분에 설명된 대로 IVsUIShell2::GetVSSysColorEx 대신 IVsUIShell5.GetThemedColor를 사용해야 합니다.

관리 코드에서

네이티브 코드를 통해 VSColor 서비스에 액세스하는 것은 매우 간단합니다. 그러나 관리 코드를 통해 작업하는 경우 서비스 사용 방법을 결정하기가 까다로울 수 있습니다. 이 점을 염두에 두고 이 프로세스를 보여 주는 C# 코드 조각은 다음과 같습니다.

private void VSColorPaint(object sender, System.Windows.Forms.PaintEventArgs e)
{
    //getIVSUIShell2
    IVsUIShell2 uiShell2 = Package.GetService(typeof(SVsUIShell)) as IVsUIShell2;
    Debug.Assert (uiShell2 != null, "failed to get IVsUIShell2");

    if (uiShell2 != null)
    {
        //get the COLORREF structure
        uint win32Color;
        uiShell2.GetVSSysColorEx((int)__VSSYSCOLOREX.VSCOLOR_SMARTTAG_HOVER_FILL, out win32Color);

        //translate it to a managed Color structure
        Color myColor = ColorTranslator.FromWin32((int)win32Color);
        //use it
        e.Graphics.FillRectangle(new SolidBrush(myColor), 0, 0, 100, 100);
    }
}

Visual Basic에서 작업하는 경우 다음을 사용합니다.

Dim myColor As Color = ColorTranslator.FromWin32((Integer)win32Color)
WPF UI에서

애플리케이션의 ResourceDictionary로 내보낸 값을 통해 Visual Studio 색에 바인딩할 수 있습니다. 다음은 색 테이블의 리소스를 사용하고 XAML의 환경 글꼴 데이터에 바인딩하는 예제입니다.

<Style TargetType="{x:Type Button}">
    <Setter Property="TextBlock.FontFamily"
            Value="{DynamicResource VsFont.EnvironmentFontFamily}" />
    <Setter Property="TextBlock.FontSize"
            Value="{DynamicResource VsFont.EnvironmentFontSize}" />
    <Setter Property="Background"
            Value="{DynamicResource VsBrush.EnvironmentBackgroundGradient}" />
</Style>

관리 코드에 대한 도우미 클래스 및 메서드

관리 코드의 경우 셸의 관리 패키지 프레임워크 라이브러리(Microsoft.VisualStudio.Shell.12.0.dll)에 테마 색 사용을 용이하게 하는 몇 가지 도우미 클래스가 포함되어 있습니다.

MPF의 Microsoft.VisualStudio.Shell.VsColors 클래스에 있는 도우미 메서드에는 GetThemedGDIColor()GetThemedWPFColor()가 있습니다. 이러한 도우미 메서드는 WinForms 또는 WPF UI에서 사용할 테마 항목의 색상 값을 System.Drawing.Color 또는 System.Windows.Media.Color로 반환합니다.

IVsUIShell5 shell5;
Button button = new Button();
button.BackColor = GetThemedGDIColor(shell5, SolutionExplorerColors.SelectedItemBrushKey);
button.ForeColor = GetThemedGDIColor(shell5, SolutionExplorerColors.SelectedItemTextBrushKey);

/// <summary>
/// Gets a System.Drawing.Color value from the current theme for the given color key.
/// </summary>
/// <param name="vsUIShell">The IVsUIShell5 service, used to get the color's value.</param>
/// <param name="themeResourceKey">The key to find the color for.</param>
/// <returns>The current theme's value of the named color.</returns>
public static System.Drawing.Color GetThemedGDIColor(this IVsUIShell5 vsUIShell, ThemeResourceKey themeResourceKey)
{
   Validate.IsNotNull(vsUIShell, "vsUIShell");
   Validate.IsNotNull(themeResourceKey, "themeResourceKey");

   byte[] colorComponents = GetThemedColorRgba(vsUIShell, themeResourceKey);

   // Note: The Win32 color we get back from IVsUIShell5.GetThemedColor is ABGR
   return System.Drawing.Color.FromArgb(colorComponents[3], colorComponents[0], colorComponents[1], colorComponents[2]);
}

private static byte[] GetThemedColorRgba(IVsUIShell5 vsUIShell, ThemeResourceKey themeResourceKey)
{
   Guid category = themeResourceKey.Category;
   __THEMEDCOLORTYPE colorType = __THEMEDCOLORTYPE.TCT_Foreground
   if (themeResourceKey.KeyType == ThemeResourceKeyType.BackgroundColor || themeResourceKey.KeyType == ThemeResourceKeyType.BackgroundBrush)
   {
      colorType = __THEMEDCOLORTYPE.TCT_Background;
   }

   // This call will throw an exception if the color is not found
   uint rgbaColor = vsUIShell.GetThemedColor(ref category, themeResourceKey.Name, (uint)colorType);
   return BitConverter.GetBytes(rgbaColor);
}
public static System.Windows.Media.Color GetThemedWPFColor(this IVsUIShell5 vsUIShell, ThemeResourceKey themeResourceKey)
{
   Validate.IsNotNull(vsUIShell, "vsUIShell");
   Validate.IsNotNull(themeResourceKey, "themeResourceKey");

   byte[] colorComponents = GetThemedColorComponents(vsUIShell, themeResourceKey);

    return System.Windows.Media.Color.FromArgb(colorComponents[3], colorComponents[0], colorComponents[1], colorComponents[2]);
}

클래스를 사용하여 지정된 WPF 색 리소스 키에 대한 VSCOLOR 식별자를 가져올 수도 있고 그 반대의 경우도 마찬가지입니다.

public static string GetColorBaseKey(int vsSysColor);
public static bool TryGetColorIDFromBaseKey(string baseKey, out int vsSysColor);

VsColors 클래스의 메서드는 호출될 때마다 색 값을 반환하도록 VSColor 서비스를 쿼리합니다. 색 값을 System.Drawing.Color로 가져오려면 성능이 더 좋은 대안은 VSColor 서비스에서 가져온 색 값을 캐시하는 Microsoft.VisualStudio.PlatformUI.VSColorTheme 클래스의 메서드를 대신 사용하는 것입니다. 클래스는 내부적으로 셸 브로드캐스트 메시지 이벤트를 구독하고 테마 변경 이벤트가 발생하면 캐시된 값을 삭제합니다. 또한 이 클래스는 테마 변경 내용을 구독하는 .NET 친화적인 이벤트를 제공합니다. ThemeChanged 이벤트를 사용하여 새 처리기를 추가하고 GetThemedColor() 메서드를 사용하여 관심 있는 ThemeResourceKeys의 색 값을 가져옵니다. 샘플 코드는 다음과 같습니다.

public MyWindowPanel()
{
    InitializeComponent();

    // Subscribe to theme changes events so we can refresh the colors
    VSColorTheme.ThemeChanged += VSColorTheme_ThemeChanged;

    RefreshColors();
}

private void VSColorTheme_ThemeChanged(ThemeChangedEventArgs e)
{
    RefreshColors();

    // Also post a message to all the children so they can apply the current theme appropriately
    foreach (System.Windows.Forms.Control child in this.Controls)
    {
        NativeMethods.SendMessage(child.Handle, e.Message, IntPtr.Zero, IntPtr.Zero);
    }
}

private void RefreshColors()
{
    this.BackColor = VSColorTheme.GetThemedColor(EnvironmentColors.ToolWindowBackgroundColorKey);
    this.ForeColor = VSColorTheme.GetThemedColor(EnvironmentColors.ToolWindowTextColorKey);
}

protected override void Dispose(bool disposing)
{
    if (disposing)
    {
        VSColorTheme.ThemeChanged -= this.VSColorTheme_ThemeChanged;
        base.Dispose(disposing);}
}

고대비 색 선택

Windows는 텍스트, 배경, 이미지의 색 대비를 증가시키는 여러 고대비 시스템 수준 테마를 사용하므로 요소가 화면에 더 뚜렷하게 표시됩니다. 접근성을 위해 사용자가 고대비 테마로 전환할 때 Visual Studio 인터페이스 요소가 올바르게 응답해야 합니다.

고대비 테마에는 소수의 시스템 색만 사용할 수 있습니다. 시스템 색 이름을 선택할 때는 다음 팁을 기억하세요.

  • 색을 지정하는 요소와 의미 체계가 같은 시스템 색을 선택합니다. 예를 들어 창 내에서 텍스트에 고대비 색을 선택하는 경우 ControlText가 아닌 WindowText를 사용합니다.

  • 전경/배경 쌍을 함께 선택하세요. 그러지 않으면 색 선택이 모든 고대비 테마에서 작동하는지 확신할 수 없습니다.

  • UI의 가장 중요한 부분을 결정하고 콘텐츠 영역이 눈에 띄는지 확인합니다. 색상의 미묘한 차이가 일반적으로 구별하는 세부 사항이 많이 손실되므로 콘텐츠 영역을 정의하는 데 강한 테두리 색을 사용하는 것이 일반적입니다. 서로 다른 콘텐츠 영역에 색 변형이 없기 때문입니다.

시스템 색 집합

WPF 팀 블로그: SystemColors 참조의 테이블은 전체 시스템 색 이름 집합과 각 테마에 표시되는 해당 색상을 나타냅니다.

이 제한된 색 집합을 UI 에 적용하면 "일반" 테마에 있던 미묘한 세부 정보가 손실될 것으로 예상됩니다. 다음은 도구 창 내에서 영역을 구분하는 데 사용되는 미묘한 회색인 UI의 예입니다. 고대비 모드로 표시된 동일한 창과 쌍을 이루면 모든 배경이 동일한 색조이고 해당 영역의 테두리가 테두리만으로 표시되는 것을 볼 수 있습니다.

Example of how subtle details are lost in High Contrast
고대비에서 미묘한 세부 정보가 손실되는 방법의 예

편집기에서 텍스트 색 선택

색이 지정된 텍스트는 편집기 또는 디자인 화면에서 유사한 항목 그룹을 쉽게 식별할 수 있도록 허용하는 것과 같이 의미를 나타내는 데 사용됩니다. 그러나 고대비 테마에서는 세 개 이상의 텍스트 색을 구분할 수 없습니다. WindowText, GrayText, HotTrackText는 WindowBackground 화면에서 사용할 수 있는 색의 전부입니다. 세 가지 이상의 색을 사용할 수 없으므로 고대비 모드에서 표시하려는 가장 중요한 차이점을 신중하게 선택합니다.

각 고대비 테마에 표시되므로 편집기 화면에서 허용되는 각 토큰 이름에 대한 색상:

High Contrast editor comparison
고대비 편집기 비교

파란색 테마의 편집기 화면의 예:

Editor in Blue theme
파란색 테마의 편집기

Editor in High Contrast #1 theme
고대비 #1 테마의 편집기

사용 패턴

많은 일반적인 UI 요소에는 이미 고대비 색이 정의되어 있습니다. 사용자 고유의 시스템 색 이름을 선택할 때 이러한 사용 패턴을 참조하여 UI 요소가 유사한 구성 요소와 일치하도록 할 수 있습니다.

시스템 색상 사용
ActiveCaption - 마우스로 가리키고 누를 때 활성 IDE 및 래프팅된 창 단추 문자 모양
- IDE 및 래프팅된 창의 제목 표시줄 배경
- 기본 상태 표시줄 배경
ActiveCaptionText - 제목 표시줄 전경을 위한 활성 IDE 및 래프팅된 창(텍스트 및 문자 모양)
- 마우스로 가리키고 누를 때 활성 창 단추의 배경 및 테두리
제어 - 콤보 상자, 드롭다운 목록, 검색 컨트롤 기본과 비활성화된 배경(드롭다운 단추 포함)
- 대상 단추 배경 고정
- 명령 모음 배경
- 도구 창 배경
ControlDark - IDE 배경
- 메뉴 및 명령 모음 구분 기호
- 명령 모음 테두리
- 메뉴 섀도
- 도구 창 탭 기본값 및 가리키기 테두리 및 구분 기호
- 문서 웰 오버플로 단추 배경
- 대상 문자 모양 테두리 고정
ControlDarkDark - 포커스가 없고 선택된 문서 탭 창
ControlLight - 탭 테두리 자동 숨기기
- 콤보 상자 및 드롭다운 목록 테두리
- 대상 배경 및 테두리 고정
ControlLightLight - 선택되고 포커스가 있는 임시 테두리
ControlText - 콤보 상자 및 드롭다운 목록 문자 모양
- 도구 창 선택되지 않은 탭 텍스트
GrayText - 콤보 상자 및 드롭다운 목록 비활성화 테두리, 드롭다운 문자 모양, 텍스트, 메뉴 항목 텍스트
- 사용하지 않는 메뉴 텍스트
- 검색 컨트롤 ‘검색 옵션’ 헤더 텍스트
- 검색 컨트롤 섹션 구분 기호
강조 - 콤보 상자 드롭다운 단추 배경 및 문서 웰 오버플로 단추 테두리를 제외한 모든 마우스로 가리키고 누른 배경 및 테두리
- 선택된 항목 배경
HighlightText - 마우스로 가리키고 누른 전경(텍스트 및 문자 모양)
- 포커스가 있는 도구 창 및 문서 탭 창 컨트롤 전경
- 포커스가 있는 도구 창 제목 표시줄 테두리
- 포커스가 있는 선택된 임시 탭 전경
- 마우스로 가리키고 누른 문서 웰 오버플로 단추 테두리
- 선택된 아이콘 테두리
HotTrack - 누를 때 스크롤 막대 Thumb 배경 및 테두리
- 누를 때 스크롤 막대 화살표 문자 모양
InactiveCaption - 가리킬 때 비활성 IDE 및 래프팅된 창 단추 문자 모양
- IDE 및 래프팅된 창의 제목 표시줄 배경
- 사용하지 않는 검색 컨트롤 배경
InactiveCaptionText - 사용하지 않는 IDE 및 래프팅된 창 제목 표시줄 전경(텍스트 및 문자 모양)
- 가리킬 때 사용하지 않는 창 단추 배경 및 테두리
- 포커스가 없는 도구 창 단추 배경 및 테두리
- 사용하지 않는 검색 컨트롤 전경
메뉴 - 드롭다운 메뉴 배경
- 확인 및 사용하지 않는 확인 표시 배경
MenuText - 드롭다운 메뉴 테두리
- 확인 표시
- 메뉴 문자 모양
- 드롭다운 메뉴 텍스트
- 선택된 아이콘 테두리
스크롤 막대 - 모든 상태의 스크롤 막대 및 스크롤 막대 화살표 배경
Window - 탭 배경 자동 숨기기
- 메뉴 모음 및 명령 선반 배경
- 열려 있는 탭과 임시 탭 모두에 대해 포커스가 없거나 선택되지 않은 문서 창 탭 배경 및 문서 테두리
- 포커스가 없는 도구 창 제목 표시줄 배경
- 도구 창 탭 배경(선택됨 및 선택 취소됨)
WindowFrame - IDE 테두리
WindowText - 탭 전경 자동 숨기기
- 선택된 도구 창 탭 전경
- 포커스가 없는 문서 창 탭 및 포커스가 없거나 선택되지 않은 임시 탭 전경
- 트리 뷰 기본 전경 및 선택되지 않은 문자 모양 위로 가리키기
- 도구 창에서 선택된 탭 테두리
- 스크롤 막대 Thumb 배경, 테두리, 문자 모양

최종 사용자를 위한 색 노출

코드 편집기 또는 디자인 화면을 만들 때처럼 최종 사용자가 UI를 사용자 지정할 수 있도록 허용하려는 경우가 있습니다. 이 작업을 수행하는 가장 일반적인 방법은 도구 > 옵션 대화 상자를 사용하는 것입니다. 특수한 컨트롤이 필요한 고도로 특수화된 UI가 없는 경우 사용자 지정을 표시하는 가장 쉬운 방법은 대화 상자의 환경 섹션에 있는 글꼴 및 색 페이지를 사용하는 것입니다. 사용자 지정을 위해 노출하는 각 요소에 대해 사용자는 전경색, 배경색 또는 둘 다를 변경하도록 선택할 수 있습니다.

사용자 지정 가능한 색에 대한 VSPackage 빌드

VSPackage는 사용자 지정 범주를 통해 글꼴 및 색을 제어하고 글꼴 및 색 속성 페이지에서 항목을 표시할 수 있습니다. 이 메커니즘을 사용하는 경우 VSPackage는 IVsFontAndColorDefaultsProvider 인터페이스 및 관련 인터페이스를 구현해야 합니다.

원칙적으로 이 메커니즘은 기존의 모든 표시 항목과 이를 포함하는 범주를 수정하는 데 사용할 수 있습니다. 그러나 텍스트 편집기 범주 또는 표시 항목을 수정하는 데 사용해서는 안 됩니다. 텍스트 편집기 범주에 대한 자세한 내용은 글꼴 및 색 개요를 참조하세요.

사용자 지정 범주를 구현하거나 항목을 표시하려면 VSPackage에서 다음을 수행해야 합니다.

  • 레지스트리에서 범주를 만들거나 식별합니다. IDE의 글꼴 및 색 속성 페이지 구현에서는 이 정보를 사용하여 지정된 범주를 지원하는 서비스를 올바르게 쿼리합니다.

  • 레지스트리에서 그룹을 만들거나 식별합니다(선택 사항). 둘 이상의 범주의 합집합을 나타내는 그룹을 정의하는 것이 유용할 수 있습니다. 그룹이 정의되면 IDE는 자동으로 하위 범주를 병합하고 그룹 내에 표시 항목을 배포합니다.

  • IDE 지원을 구현합니다.

  • 글꼴 및 색 변경 내용을 적용합니다.

범주를 만들거나 식별하려면

[HKLM\SOFTWARE\Microsoft \Visual Studio\\<Visual Studio version\>\FontAndColors\\<Category\>] 아래에 특수 형식의 범주 레지스트리 항목을 구성합니다. 여기서 <Category>는 범주의 지역화되지 않은 이름입니다.

레지스트리를 다음 두 값으로 채웁니다.

이름 Type 데이터 설명
범주 REG_SZ GUID 범주를 식별하기 위해 만든 GUID
Package(패키지) REG_SZ GUID 범주를 지원하는 VSPackage 서비스의 GUID

레지스트리에 지정된 서비스는 해당 범주에 대한 IVsFontAndColorDefaults 구현을 제공해야 합니다.

그룹을 만들거나 식별하려면

[HKLM\SOFTWARE\Microsoft \Visual Studio\\<Visual Studio version\>\FontAndColors\\<group\>] 아래에 특수 형식의 범주 레지스트리 항목을 구성합니다. 여기서 <group>는 그룹의 지역화되지 않은 이름입니다.

레지스트리를 다음 두 값으로 채웁니다.

이름 Type 데이터 설명
범주 REG_SZ GUID 범주를 식별하기 위해 만든 GUID
Package(패키지) REG_SZ GUID 범주를 지원하는 VSPackage 서비스의 GUID

레지스트리에 지정된 서비스는 해당 그룹에 대해 IVsFontAndColorGroup 구현을 제공해야 합니다.

Implementation of IVsFontAndColorGroup
IVsFontAndColorGroup의 구현입니다.

IDE 지원을 구현하려면

제공된 각 범주 또는 그룹 GUID에 대해 IDE에 대한 IVsFontAndColorDefaults 인터페이스 또는 IVsFontAndColorGroup 인터페이스를 반환하는 GetObject를 구현합니다.

지원하는 모든 범주에 대해 VSPackage는 IVsFontAndColorDefaults 인터페이스의 별도 인스턴스를 구현합니다.

IVsFontAndColorDefaults를 통해 구현된 메서드는 IDE에 다음을 제공해야 합니다.

  • 범주의 표시 항목 목록

  • 표시 항목의 지역화 가능한 이름

  • 범주의 각 멤버에 대한 정보 표시

참고 항목

모든 범주에는 하나 이상의 표시 항목이 포함되어야 합니다.

IDE는 IVsFontAndColorGroup 인터페이스를 사용하여 여러 범주의 합집합을 정의합니다.

구현은 IDE에 다음을 제공합니다.

  • 주어진 그룹을 구성하는 범주 목록

  • 그룹 내 각 범주를 지원하는 IVsFontAndColorDefaults 인스턴스에 대한 액세스

  • 지역화 가능한 그룹 이름

IDE 업데이트

IDE는 글꼴 및 색 설정에 대한 정보를 캐시합니다. 따라서 IDE 글꼴 및 색 구성을 수정한 후 캐시가 최신 상태인지 확인하는 것이 가장 좋습니다.

캐시 업데이트는 IvsFontAndColorCacheManager 인터페이스를 통해 수행되며 전역적으로 또는 선택한 항목에서만 수행할 수 있습니다.

글꼴 및 색 변경 내용 처리

VSPackage가 표시하는 텍스트의 색 지정을 적절하게 지원하려면 VSPackage를 지원하는 색 지정 서비스가 글꼴 및 색 속성 페이지를 통해 사용자가 시작한 변경 내용에 응답해야 합니다.

이렇게 하려면 VSPackage가 다음을 수행해야 합니다.

  • IVsFontAndColorEvents 인터페이스를 구현하여 IDE 생성 이벤트를 처리합니다. IDE는 글꼴 및 색 페이지의 사용자 수정에 따라 적절한 메서드를 호출합니다. 예를 들어 새 글꼴이 선택된 경우 OnFontChanged 메서드를 호출합니다.

    OR

  • IDE에서 변경 사항을 폴링합니다. 이 작업은 시스템 구현 IVsFontAndColorStorage 인터페이스를 통해 수행할 수 있습니다. 이는 시스템 구현 IVsFontAndColorStorage 인터페이스를 통해 수행할 수 있습니다. 글꼴 및 색 설정에 대한 자세한 내용은 MSDN 문서 저장된 글꼴 및 색 설정에 액세스를 참조하세요.

참고 항목

폴링 결과가 올바른지 확인하려면 IVsFontAndColorStorage 인터페이스의 검색 메서드를 호출하기 전에 IVsFontAndColorCacheManager 인터페이스를 사용하여 캐시 플러시 및 업데이트가 필요한지 확인합니다.

인터페이스를 구현하지 않고 사용자 지정 글꼴 및 색 범주 등록

다음 코드 예제에서는 인터페이스를 구현하지 않고 사용자 지정 글꼴 및 색 범주를 등록하는 방법을 보여 줍니다.

HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\VisualStudio\8.0Exp\FontAndColors\CSharp Tool Window]
"Package"="{F5E7E71D-1401-11D1-883B-0000F87579D2}"
"Category"="{9FF46859-A47E-47bf-8AC5-EC3DBE69D1FE}"
"ToolWindowPackage"="{7259e420-6241-4e0d-b535-5b820671d183}"

    "NameID"=dword:00000064

이 코드 예제의 경우:

  • "NameID" = 패키지에 있는 지역화된 범주 이름의 리소스 ID
  • "ToolWindowPackage" = 패키지 GUID
  • "Category"="{9FF46859-A47E-47bf-8AC5-EC3DBE69D1FE}"는 예제일 뿐이며 실제 값은 구현자가 제공하는 새 GUID일 수 있습니다.

글꼴 및 색 속성 범주 GUID 설정

아래 코드 예제에서는 범주 GUID를 설정하는 방법을 보여 줍니다.

// m_pView is your IVsTextView
IVsTextEditorPropertyCategoryContainer spPropCatContainer =
(IVsTextEditorPropertyCategoryContainer)m_pView;
if (spPropCatContainer != null)
{
IVsTextEditorPropertyContainer spPropContainer;
Guid GUID_EditPropCategory_View_MasterSettings =
new Guid("{D1756E7C-B7FD-49a8-B48E-87B14A55655A}");
hr = spPropCatContainer.GetPropertyCategory(
ref GUID_EditPropCategory_View_MasterSettings,
out spPropContainer);
if(hr == 0)
{
hr =
spPropContainer.SetProperty(
VSEDITPROPID.VSEDITPROPID_ViewGeneral_FontCategory,
catGUID);
hr =
spPropContainer.SetProperty(
VSEDITPROPID.VSEDITPROPID_ViewGeneral_ColorCategory,
catGUID);
}
}