Вопрос

Я пытаюсь вызвать OpenThemeData (см. msdn OpenThemeData ), но я не смог определить, какие допустимые имена классов должны передаваться параметром pszClassList .

HTHEME OpenThemeData(      
    HWND hwnd,
    LPCWSTR pszClassList
);

Кто-нибудь может мне сказать, какие имена классов допустимы для этого параметра? Спасибо!

Это было полезно?

Решение

Вы можете посмотреть в " AeroStyle.xml " как отмечалось в предыдущем постере, который дает точный список для Vista / Aero. Однако, если вы хотите играть безопасно (и вы, вероятно, делаете), имена классов должны, как правило, быть именами классов Windows общих элементов управления Windows. Например, нажимные кнопки и флажки используют имя класса «Кнопка», элемент управления «Изменить» и т. Д. Я обычно выбираю имя класса элемента управления, наиболее близкого к любому пользовательскому элементу, над которым я работаю, и используйте данные темы для этого. Таким образом, вы получите код, который работает с XP, Vista и (надеюсь) Windows 7, независимо от того, какая тема выбрана пользователем.

Однако, если вы не используете сырой Win32 много, вы, вероятно, не будете создавать много элементов управления напрямую, используя имя класса. Имена классов довольно либерально разбросаны по всему MSDN. Хорошее место для начала - обычно " CommCtrl.h " файл из Platform SDK, в котором их много, и они всегда описаны в справке MSDN по отдельным общим элементам управления. Вы также можете часто изучать их, посмотрев, как определяются диалоги в файлах .rc, открыв их в текстовом редакторе: они содержат имя класса для элементов управления.

Другие советы

Статья Запчасти и Состояния в MSDN содержат таблицу, в которой отображаются управляющие классы , parts и состояния . Значения в таблице определены в Vsstyle.h и Vssym32.h .

Вот краткий справочник:

BUTTON, CLOCK, COMBOBOX, COMMUNICATIONS, CONTROLPANEL, DATEPICKER, DRAGDROP, 
EDIT, EXPLORERBAR, FLYOUT, GLOBALS, HEADER, LISTBOX, LISTVIEW, MENU, MENUBAND, 
NAVIGATION, PAGE, PROGRESS, REBAR, SCROLLBAR, SEARCHEDITBOX, SPIN, STARTPANEL, 
STATUS, TAB, TASKBAND, TASKBAR, TASKDIALOG, TEXTSTYLE, TOOLBAR, TOOLTIP, 
TRACKBAR, TRAYNOTIFY, TREEVIEW, WINDOW

Ответ на вопрос Темы Windows Visual: Галерея деталей и состояний? предоставляет приложение " Проводник деталей и состояний " , в котором можно просматривать и тестировать большинство стилей.

Имена классов зависят от темы. Например, в документации OpenThemeData говорится

  

Имена классов для темы Aero   определенный в AeroStyle.xml, который   находится в папке «Включить»   Разработка программного обеспечения для Microsoft Windows   Комплект (SDK).

Я знаю, что это старый вопрос, но я хочу дать обновленный ответ (2018) для тех, кто пришел сюда из Google.

В принятом ответе DavidK говорится, что нужно заглянуть в файл AeroStyle.xml " где темы определены. Этот файл был частью Windows 7 SDK, но был удален из Windows 10 SDK, поэтому принятый ответ больше не нужен.

Ответ на всплывающие ссылки на MSDN , где список названий тем, частей и состояний является крайне несогласованным и не обновляется.

Темы создаются UxTheme.dll , который считывает изображения, цвета и т. д. из файла aero.msstyles в папке C: \ Windows. \ Resources \ Themes \ Aero в Windows 10.

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

Но я точно знаю, что в Windows 10 build 18282 Microsoft удалила тему " Clock " который больше не используется, и было добавлено множество недокументированных тем, например: " TaskBand2CompositedSmallIconsVertical8Light :: Taskband2 " который передается как имя класса темы в OpenThemeData () .

И я также знаю, что несколько тем можно получить, только если вы передадите правильный дескриптор окна. Если вы передадите дескриптор неправильного окна, вы можете получить другой дескриптор темы, чем ожидалось, или даже NULL .

Я также знаю, что Microsoft за последние 2 года внутренне изменила весь свой код, чтобы использовать OpenThemeDataForDpi () вместо OpenThemeData () , поскольку каждый монитор в Windows 10 может иметь другое разрешение.

Проблема, с которой мы сталкиваемся, - это серьезная нехватка документации в MSDN и отсутствие функции API для перечисления всех доступных тем.

Это не имеет ничего общего с Aero, которого даже нет в XP! См. Исходный код OpenThemeData () ..

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top