비주얼 스타일 사용

이 항목에서는 일반적인 컨트롤이 사용자의 기본 설정 시각적 스타일에 표시되도록 애플리케이션을 구성하는 방법에 대해 설명합니다.

이 항목은 다음과 같은 섹션으로 구성됩니다.

매니페스트 또는 지시문을 사용하여 시각적 스타일을 애플리케이션에 적용할 수 있는지 확인

애플리케이션에서 시각적 스타일을 사용할 수 있도록 설정하려면 ComCtl32.dll 버전 6 이상을 사용해야 합니다. 버전 6은 재배포할 수 없으므로 애플리케이션이 포함된 Windows 버전에서 실행되는 경우에만 사용할 수 있습니다. Windows에는 버전 5 및 버전 6이 모두 함께 있습니다. ComCtl32.dll 버전 6에는 사용자 정의 컨트롤과 공용 컨트롤이 모두 포함됩니다. 기본적으로 애플리케이션은 User32.dll 정의된 사용자 정의 컨트롤과 ComCtl32.dll 버전 5에 정의된 공용 컨트롤을 사용합니다. DLL 버전 및 해당 배포 플랫폼 목록은 공용 컨트롤 버전을 참조하세요.

애플리케이션에서 시각적 스타일을 사용하려면 사용 가능한 경우 ComCtl32.dll 버전 6을 사용해야 함을 나타내는 애플리케이션 매니페스트 또는 컴파일러 지시문을 추가해야 합니다.

애플리케이션 매니페스트를 사용하면 애플리케이션에서 필요한 어셈블리 버전을 지정할 수 있습니다. Microsoft Win32에서 어셈블리는 DLL 집합 및 해당 DLL 내에 포함된 버전 관리 가능한 개체 목록입니다.

매니페스트는 XML로 작성됩니다. 애플리케이션 매니페스트 파일의 이름은 실행 가능한 파일의 이름 뒤에 파일 이름 확장명 .manifest가 붙습니다(예: MyApp.exe.manifest). 다음 샘플 매니페스트에서는 첫 번째 섹션에서 매니페스트 자체를 설명하는 것을 보여 줍니다. 다음 표에서는 매니페스트 설명 섹션의 assemblyIdentity 요소에 의해 설정된 특성을 보여 줍니다.

attribute Description
버전 매니페스트의 버전입니다. 버전은 major.minor.revision.build 형식이어야 합니다(즉, n.n.n.n, 여기서 n <=65535).
processorArchitecture 애플리케이션이 개발되는 프로세서입니다.
name 회사 이름, 제품 이름 및 애플리케이션 이름을 포함합니다.
형식 Win32와 같은 애플리케이션의 유형입니다.

 

또한 샘플 매니페스트는 애플리케이션에 대한 설명을 제공하고 애플리케이션 종속성을 지정합니다. 다음 표에서는 종속성 섹션의 assemblyIdentity 요소에 의해 설정된 특성을 보여 줍니다.

attribute Description
type Win32와 같은 종속성 구성 요소의 유형입니다.
name 구성 요소의 이름입니다.
버전 구성 요소 버전입니다.
processorArchitecture 구성 요소가 디자인된 프로세서입니다.
publicKeyToken 이 구성 요소와 함께 사용되는 키 토큰입니다.
언어 구성 요소의 언어입니다.

 

다음은 매니페스트 파일의 예입니다.

중요

애플리케이션이 32비트 Windows 플랫폼을 대상으로 하는 경우 processorArchitecture 항목을 "X86" 으로 설정하고, 애플리케이션이 64비트 Windows 플랫폼을 대상으로 하는 경우 "amd64"로 설정합니다. 다음 예제와 같이 모든 플랫폼이 대상으로 지정되도록 하는 "*"를 지정할 수도 있습니다.

 

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0">
<assemblyIdentity
    version="1.0.0.0"
    processorArchitecture="*"
    name="CompanyName.ProductName.YourApplication"
    type="win32"
/>
<description>Your application description here.</description>
<dependency>
    <dependentAssembly>
        <assemblyIdentity
            type="win32"
            name="Microsoft.Windows.Common-Controls"
            version="6.0.0.0"
            processorArchitecture="*"
            publicKeyToken="6595b64144ccf1df"
            language="*"
        />
    </dependentAssembly>
</dependency>
</assembly>

Microsoft Visual C++ 2005 이상을 사용하는 경우 매니페스트를 수동으로 만드는 대신 다음 컴파일러 지시문을 소스 코드에 추가할 수 있습니다. 가독성을 위해 지시문은 여기에서 여러 줄로 나뉩니다.

#pragma comment(linker,"\"/manifestdependency:type='win32' \
name='Microsoft.Windows.Common-Controls' version='6.0.0.0' \
processorArchitecture='*' publicKeyToken='6595b64144ccf1df' language='*'\"")

다음 항목에서는 다양한 유형의 애플리케이션에 시각적 스타일을 적용하는 단계를 설명합니다. 매니페스트 형식은 각 경우에 동일합니다.

표준 확장만 사용하는 애플리케이션에서 ComCtl32.dll 버전 6 사용

다음은 타사 확장을 사용하지 않는 애플리케이션의 예입니다.

  • 계산기
  • FreeCell(Windows Vista 및 Windows 7에서)
  • Minesweeper(Windows Vista 및 Windows 7에서)
  • 메모장
  • Solitaire(Windows Vista 및 Windows 7에서)

매니페스트를 만들고 애플리케이션에서 시각적 스타일을 사용하도록 설정

  1. ComCtl32.lib에 연결하고 InitCommonControls를 호출합니다.

  2. XML 매니페스트 형식의 소스 트리에 YourApp.exe.manifest라는 파일을 추가합니다.

    <?xml version="1.0" encoding="UTF-8" standalone="yes"?>
    <assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0">
    <assemblyIdentity
        version="1.0.0.0"
        processorArchitecture="*"
        name="CompanyName.ProductName.YourApplication"
        type="win32"
    />
    <description>Your application description here.</description>
    <dependency>
        <dependentAssembly>
            <assemblyIdentity
                type="win32"
                name="Microsoft.Windows.Common-Controls"
                version="6.0.0.0"
                processorArchitecture="*"
                publicKeyToken="6595b64144ccf1df"
                language="*"
            />
        </dependentAssembly>
    </dependency>
    </assembly>
    
  3. 다음과 같이 애플리케이션의 리소스 파일에 매니페스트를 추가합니다.

    CREATEPROCESS_MANIFEST_RESOURCE_ID RT_MANIFEST "YourApp.exe.manifest"
    

    참고

    리소스에 이전 항목을 추가할 때 한 줄에 서식을 지정해야 합니다. 또는 XML 매니페스트 파일을 애플리케이션의 실행 가능한 파일과 동일한 디렉터리에 배치할 수 있습니다. 운영 체제는 먼저 파일 시스템에서 매니페스트를 로드한 다음 실행 가능한 파일의 리소스 섹션을 확인합니다. 파일 시스템 버전이 우선합니다.

     

애플리케이션을 빌드하면 매니페스트가 이진 리소스로 추가됩니다.

제어판에서 ComCtl32 버전 6 또는 RunDll32.exe실행 중인 DLL 사용

매니페스트를 만들고 애플리케이션에서 시각적 스타일을 사용하도록 설정

  1. ComCtl32.lib에 연결하고 InitCommonControls를 호출합니다.

  2. XML 매니페스트 형식의 소스 트리에 YourApp.cpl.manifest라는 파일을 추가합니다.

    <?xml version="1.0" encoding="UTF-8" standalone="yes"?>
    <assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0">
    <assemblyIdentity
        version="1.0.0.0"
        processorArchitecture="*"
        name="CompanyName.ProductName.YourApplication"
        type="win32"
    />
    <description>Your application description here.</description>
    <dependency>
        <dependentAssembly>
            <assemblyIdentity
                type="win32"
                name="Microsoft.Windows.Common-Controls"
                version="6.0.0.0"
                processorArchitecture="*"
                publicKeyToken="6595b64144ccf1df"
                language="*"
            />
        </dependentAssembly>
    </dependency>
    </assembly>
    
  3. 애플리케이션의 리소스 파일에 매니페스트를 리소스 ID 123으로 추가합니다.

참고

제어판 애플리케이션을 작성할 때 적절한 범주에 배치합니다. 이제 제어판은 제어판 애플리케이션의 분류를 지원합니다. 즉, 제어판 애플리케이션에 식별자를 할당하고 프로그램 추가 또는 제거, 모양 및 테마 또는 날짜, 시간, 언어 및 지역 옵션과 같은 작업 영역으로 구분할 수 있습니다.

 

프로세스로 가져온 확장, 플러그 인, MMC 스냅인 또는 DLL에 시각적 스타일 지원 추가

시각적 스타일에 대한 지원은 확장, 플러그 인, MMC 스냅인 또는 프로세스로 가져온 DLL에 추가할 수 있습니다. 예를 들어 다음 단계를 사용하여 MMC(Microsoft Management Console) 스냅인에 대한 시각적 스타일 지원을 추가합니다.

  1. -DISOLATION_AWARE_ENABLED 플래그를 사용하여 스냅인을 컴파일하거나 #include "windows.h" 문 앞에 다음 문을 삽입합니다.

    #define ISOLATION_AWARE_ENABLED 1
    

    ISOLATION_AWARE_ENABLED에 대한 자세한 내용은 구성 요소 격리를 참조하세요.

  2. 스냅인 원본에 공통 컨트롤 헤더 파일을 포함합니다.

    #include <commctrl.h>
    
  3. XML 매니페스트 형식을 사용하는 원본 트리에 YourApp.manifest라는 파일을 추가합니다.

    <?xml version="1.0" encoding="UTF-8" standalone="yes"?>
    <assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0">
    <assemblyIdentity
        version="1.0.0.0"
        processorArchitecture="*"
        name="CompanyName.ProductName.YourApplication"
        type="win32"
    />
    <description>Your application description here.</description>
    <dependency>
        <dependentAssembly>
            <assemblyIdentity
                type="win32"
                name="Microsoft.Windows.Common-Controls"
                version="6.0.0.0"
                processorArchitecture="*"
                publicKeyToken="6595b64144ccf1df"
                language="*"
            />
        </dependentAssembly>
    </dependency>
    </assembly>
    
  4. 스냅인의 리소스 파일에 매니페스트를 추가합니다. 리소스 파일에 매니페스트를 추가하는 방법에 대한 자세한 내용은 프로세스에 가져온 확장, 플러그 인 또는 DLL을 사용하는 애플리케이션에서 ComCtl32 버전 6 사용을 참조하세요.

시각적 스타일 끄기

다음과 같이 SetWindowTheme 함수를 호출하여 컨트롤 또는 창의 모든 컨트롤에 대한 시각적 스타일을 끌 수 있습니다.

SetWindowTheme(hwnd, L" ", L" ");

이전 예제에서 hwnd는 시각적 스타일을 사용하지 않도록 설정할 창의 핸들입니다. 호출 후 컨트롤은 시각적 스타일 없이 렌더링됩니다.

HTML 콘텐츠와 함께 시각적 스타일 사용

배경 또는 테두리와 같은 CSS(Cascading Style Sheets) 속성을 수정하는 HTML 페이지에는 시각적 스타일이 적용되지 않습니다. 이는 지정된 CSS 특성을 표시합니다. 콘텐츠의 일부로 지정된 경우 대부분의 CSS 속성은 시각적 스타일이 적용된 요소에 적용됩니다.

기본적으로 시각적 스타일은 Microsoft Internet Explorer 6 이상 버전에 표시된 페이지의 기본 HTML 컨트롤에 적용됩니다. HTML 페이지의 시각적 스타일을 해제하려면 <head> 섹션에 META 태그를 추가합니다. 이 기술은 HTA(HTML 애플리케이션)로 패키지된 콘텐츠에도 적용됩니다. 시각적 스타일을 해제하려면 META 태그는 다음과 같아야 합니다.

<META HTTP-EQUIV="MSThemeCompatible" CONTENT="no">

참고

브라우저 설정과 태그 설정이 일치하지 않으면 페이지는 시각적 스타일을 적용하지 않습니다. 예를 들어 META 태그가 "아니요"로 설정되고 브라우저가 시각적 스타일을 사용하도록 설정된 경우 시각적 스타일이 페이지에 적용되지 않습니다. 그러나 브라우저 또는 META 태그가 "예"로 설정되어 있고 다른 항목이 지정되지 않은 경우 시각적 스타일이 적용됩니다.

 

시각적 스타일은 콘텐츠의 레이아웃을 변경할 수 있습니다. 또한 단추 너비와 같은 기본 HTML 컨트롤에 특정 특성을 설정하는 경우 특정 시각적 스타일에서 단추의 레이블을 읽을 수 없다는 것을 알 수 있습니다.

시각적 스타일을 사용하여 콘텐츠를 철저히 테스트하여 시각적 스타일을 적용하면 콘텐츠와 레이아웃에 부정적인 영향을 미치는지 확인해야 합니다.

시각적 스타일이 적용되지 않은 경우

최상위 창에 시각적 스타일을 적용하지 않도록 하려면 창에 null이 아닌 영역(SetWindowRgn)을 지정합니다. 시스템은 NULL이 아닌 영역이 있는 창이 시각적 스타일을 사용하지 않는 특수 창이라고 가정합니다. 시각적 스타일이 아닌 최상위 창과 연결된 자식 창은 부모 창이 적용되지 않더라도 시각적 스타일을 계속 적용할 수 있습니다.

애플리케이션의 모든 창에 비주얼 스타일을 사용하지 않도록 설정하려면 SetThemeAppProperties를 호출하고 STAP_ALLOW_NONCLIENT 플래그를 전달하지 마세요. 애플리케이션이 SetThemeAppProperties를 호출하지 않는 경우 가정된 플래그 값은 STAP_ALLOW_NONCLIENT | STAP_ALLOW_CONTROLS | STAP_ALLOW_WEBCONTENT입니다. 가정된 값으로 인해 비클라이언트 영역, 컨트롤 및 웹 콘텐츠에 시각적 스타일이 적용됩니다.

애플리케이션을 이전 버전의 Windows와 호환되도록 설정

대부분의 시각적 스타일 아키텍처는 컨트롤의 모양 변경을 지원하지 않는 이전 버전의 Windows에서 제품을 계속 쉽게 배송할 수 있도록 설계되었습니다. 둘 이상의 운영 체제에 애플리케이션을 배송하는 경우 다음 사항을 알고 있어야 합니다.

  • Windows 8 이전 버전의 Windows에서는 고대비가 켜지면 시각적 스타일이 꺼집니다. 고대비를 지원하려면 시각적 스타일을 지원하는 레거시 애플리케이션에서 UI 요소를 고대비로 올바르게 그리는 별도의 코드 경로를 제공해야 합니다. Windows 8에서 고대비는 시각적 스타일의 일부이지만, Windows 8 애플리케이션(애플리케이션 매니페스트의 호환성 섹션에서 Windows 8 GUID를 포함하는 애플리케이션)은 여전히 Windows 7 이전에서 고대비로 올바르게 렌더링할 수 있는 별도의 코드 경로를 제공해야 합니다.
  • 타일 보기 또는 링크 컨트롤과 같은 ComCtl32.dll 버전 6의 기능을 사용하는 경우 해당 컨트롤을 사용자의 컴퓨터에서 사용할 수 없는 경우를 처리해야 합니다. ComCtl32.dll 버전 6은 재배포할 수 없습니다.
  • 애플리케이션을 테스트하여 현재 버전을 먼저 확인하지 않고 ComCtl32.dll 버전 6의 기능에 의존하지 않는지 확인합니다.
  • UxTheme.lib에 연결하지 마세요.
  • 시각적 스타일이 예상대로 작동하지 않는 경우 인스턴스에 대한 오류 처리 코드를 작성합니다.
  • 이전 버전에서 애플리케이션의 매니페스트를 설치해도 컨트롤 렌더링에는 영향을 미치지 않습니다.

시각적 스타일