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

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

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

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

Чтобы приложение использовало визуальные стили, необходимо использовать 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 в разделе описания манифеста.

Атрибут Description
версия Версия манифеста. Версия должна находиться в форме major.minor.version.build (то есть n.n.n.n, где n <=65535).
processorArchitecture Процессор, для которого разрабатывается приложение.
name Включает имя компании, имя продукта и имя приложения.
type Тип приложения, например Win32.

 

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

Атрибут Описание
type Тип компонента зависимостей, например Win32.
name Имя компонента.
версия Версия компонента.
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 в приложении, использующего только стандартные расширения

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

  • Calculator
  • FreeCell (в Windows Vista и Windows 7)
  • Minesweeper (в 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 Обозреватель 6 и более поздних версиях. Чтобы отключить стили визуальных элементов для HTML-страницы, добавьте тег META в <head> раздел. Этот метод также применяется к содержимому, упаковаемого в виде HTML-приложений (HTAs). Чтобы отключить стили визуальных элементов, тег 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.
  • Напишите код обработки ошибок для экземпляров, когда визуальные стили не работают должным образом.
  • Установка манифеста приложения в более ранних версиях не влияет на отрисовку элементов управления.

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