Каковы возможные классы для функции OpenThemeData? - PullRequest
11 голосов
/ 20 октября 2008

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

HTHEME OpenThemeData(      
    HWND hwnd,
    LPCWSTR pszClassList
);

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

Ответы [ 5 ]

11 голосов
/ 30 июня 2011

Статья Детали и состояния в MSDN содержит таблицу, в которой показаны классы управления , части и состояния . Значения в таблице определены в 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: Галерея деталей и состояний? предоставляет «Обозреватель деталей и состояний» приложение, в котором можно просматривать и тестировать большинство стилей.

6 голосов
/ 20 октября 2008

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

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

4 голосов
/ 20 октября 2008

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

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

2 голосов
/ 21 ноября 2018

Я знаю, что это старый вопрос, но я хочу дать обновленный ответ (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 для перечисления всех доступных тем.

0 голосов
/ 20 октября 2008

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

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