Включение стилей оформления

В этом разделе объясняется, как настроить приложение, чтобы обеспечить отображение общих элементов управления в предпочтительном визуальном стиле пользователя.

Этот раздел включает следующие подразделы:

Использование манифестов или директив для обеспечения применения визуальных стилей к приложениям

Чтобы приложение использовало визуальные стили, необходимо использовать 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 Описание
version Версия манифеста. Версия должна находиться в форме major.minor.revision.build (то есть n.n.n.n, где n <=65535).
processorArchitecture Процессор, для которого разрабатывается приложение.
name Включает название компании, название продукта и имя приложения.
type Тип приложения, например Win32.

 

Пример манифеста также содержит описание приложения и указывает зависимости приложения. В следующей таблице показаны атрибуты, заданные элементом assemblyIdentity в разделе зависимостей.

attribute Описание
type Тип компонента зависимостей, например Win32.
name Имя компонента.
version Версия компонента.
processorArchitecture Процессор, предназначенный для компонента.
Publickeytoken Маркер ключа, используемый с этим компонентом.
Язык Язык компонента.

 

Ниже приведен пример файла манифеста.

Важно!

Задайте для записи processorArchitecture значение X86, если приложение предназначено для 32-разрядной платформы Windows или "amd64", если приложение предназначено для 64-разрядной платформы Windows. Можно также указать "*", что гарантирует, что все платформы предназначены, как показано в следующих примерах.

 

<?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)
  • Минейпер (в Windows Vista и Windows 7)
  • Блокнот
  • Одиночество (в Windows Vista и Windows 7)

Чтобы создать манифест и разрешить приложению использовать визуальные стили.

  1. Ссылка на ComCtl32.lib и вызов InitCommonControls.

  2. Добавьте файл с именем YourApp.exe.manifest в исходное дерево с форматом XML-манифеста.

    <?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 в панель управления или библиотеке DLL, которая выполняется RunDll32.exe

Чтобы создать манифест и разрешить приложению использовать визуальные стили.

  1. Ссылка на ComCtl32.lib и вызов InitCommonControls.

  2. Добавьте файл с именем YourApp.cpl.manifest в исходное дерево с форматом XML-манифеста.

    <?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. Добавьте манифест в файл ресурсов приложения в качестве идентификатора ресурса 123.

Примечание

При создании приложения панель управления поместите его в соответствующую категорию. панель управления теперь поддерживает классификацию приложений панель управления. Это означает, что панель управления приложения могут быть назначены идентификаторы и разделены на области задач, такие как "Добавление и удаление программ", "Внешний вид" и "Темы", "Дата", "Время", "Язык" и "Региональные параметры".

 

Добавление поддержки визуального стиля в расширение, подключаемый модуль, MMC прикрепление или библиотеку DLL, которая включена в процесс

Поддержку визуальных стилей можно добавить в расширение, подключаемый модуль, оснастку MMC или библиотеку DLL, которая вставляется в процесс. Например, выполните следующие действия, чтобы добавить поддержку визуальных стилей для оснастки консоли управления (MMC).

  1. Скомпилируйте оснастку с помощью флага -DISOLATION_AWARE_ENABLED или вставьте следующую инструкцию перед оператором #include "windows.h".

    #define ISOLATION_AWARE_ENABLED 1
    

    Дополнительные сведения о ISOLATION_AWARE_ENABLED см. в разделе "Изоляция компонентов".

  2. Включите общий файл заголовка элемента управления в источник оснастки.

    #include <commctrl.h>
    
  3. Добавьте файл с именем YourApp.manifest в исходное дерево, использующее формат XML-манифеста.

    <?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. Добавьте манифест в файл ресурсов оснастки. Дополнительные сведения о добавлении манифеста в файл ресурсов см . в разделе "Использование comCtl32 версии 6 в приложении, использующего расширения, подключаемые модули или библиотеку DLL" в процессе .

Отключение визуальных стилей

Вы можете отключить визуальные стили для элемента управления или для всех элементов управления в окне, вызвав функцию SetWindowTheme следующим образом:

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

В предыдущем примере hwnd — это дескриптор окна, в котором отключается визуальный стиль. После вызова элемент управления отрисовывается без визуальных стилей.

Использование визуальных стилей с HTML-содержимым

HTML-страницы, изменяющие свойства каскадных таблиц стилей (CSS), такие как фон или граница, не применяют к ним визуальные стили. Они отображают указанный атрибут CSS. При указании в составе содержимого большинство свойств CSS применяются к элементам с примененным визуальным стилем.

По умолчанию визуальные стили применяются к встроенным элементам управления HTML на страницах, отображаемых в Microsoft Internet Explorer 6 и более поздних версиях. Чтобы отключить визуальные стили для HTML-страницы, добавьте тег META в раздел. Этот метод также применяется к содержимому, упаковаемого в виде HTML-приложений (HTA). Чтобы отключить стили визуальных элементов, тег META должен иметь следующий вид:

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

Примечание

Если параметр браузера и параметр тега не согласны, страница не будет применять визуальные стили. Например, если для тега META задано значение "нет", а браузеру присвоено значение "нет", то стили визуальных элементов не будут применяться к странице. Однако если для браузера или тега META задано значение "да", а другой элемент не указан, будут применены стили визуальных элементов.

 

Визуальные стили могут изменить макет содержимого. Кроме того, при установке определенных атрибутов для встроенных элементов управления HTML, таких как ширина кнопки, может оказаться, что метка на кнопке нечитаема в определенных визуальных стилях.

Необходимо тщательно протестировать содержимое с помощью визуальных стилей, чтобы определить, оказывает ли применение визуальных стилей негативное влияние на содержимое и макет.

Если визуальные стили не применяются

Чтобы избежать применения визуальных стилей к окну верхнего уровня, присвойте окну область, не пустую (SetWindowRgn). Система предполагает, что окно с областью, отличной от NULL, является специализированным окном, которое не использует визуальные стили. Дочернее окно, связанное с окном верхнего уровня, отличное от визуальных стилей, может по-прежнему применять визуальные стили, даже если родительское окно не является.

Если вы хотите отключить использование визуальных стилей для всех окон в приложении, вызовите SetThemeAppProperties и не передайте флаг STAP_ALLOW_NONCLIENT. Если приложение не вызывает SetThemeAppProperties, предполагаемые значения флагов STAP_ALLOW_NONCLIENT | STAP_ALLOW_CONTROLS | STAP_ALLOW_WEBCONTENT. Предполагаемые значения приводят к применению визуального стиля неклиентной области, элементов управления и веб-содержимого.

Обеспечение совместимости приложения с более ранними версиями Windows

Большая часть архитектуры визуального стиля предназначена для упрощения отправки продукта в более ранних версиях Windows, которые не поддерживают изменение внешнего вида элементов управления. При доставке приложения для нескольких операционных систем следует учитывать следующее:

  • В версиях Windows до Windows 8 визуальные стили отключены при высокой контрастности. Чтобы обеспечить высокую контрастность, устаревшее приложение, поддерживающее визуальные стили, должно предоставить отдельный путь кода для правильного рисования элементов пользовательского интерфейса в высокой контрастности. В Windows 8 высокая контрастность является частью визуальных стилей. Однако приложение Windows 8 (включающее guid Windows 8 в разделе совместимости манифеста приложения) по-прежнему должно предоставлять отдельный путь кода для правильной отрисовки в Windows 7 ранее.
  • Если вы используете функции в ComCtl32.dll версии 6, например представление плитки или элемент управления ссылкой, необходимо обработать ситуацию, когда эти элементы управления недоступны на компьютере пользователя. ComCtl32.dll версии 6 не распространяется.
  • Протестируйте приложение, чтобы убедиться, что вы не используете функции ComCtl32.dll версии 6 без предварительной проверки текущей версии.
  • Не ссылайтесь на UxTheme.lib.
  • Написание кода обработки ошибок для экземпляров, когда визуальные стили не работают должным образом.
  • Установка манифеста приложения в более ранних версиях не влияет на отрисовку элементов управления.

Стили визуальных элементов