Как мне динамически создавать элементы управления с тем же визуальным стилем, что и их родитель? - PullRequest
4 голосов
/ 24 декабря 2009

Я использую Visual Studio 2005 (и win32 API в C ++), и у меня есть окно, которое было разработано с использованием встроенного редактора диалоговых окон.

Во время выполнения я хочу использовать CreateWindow() для добавления новых элементов управления. Это работает, однако все элементы управления, которые я создаю, выглядят действительно ужасно. Для конкретности добавляемый элемент управления - это TabControl. Когда я добавляю его с помощью встроенного редактора диалоговых окон, текст на вкладках выглядит хорошо. Когда я создаю его во время выполнения с CreateWindow(), текст становится большим и жирным и выглядит неуместным.

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

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

1 Ответ

5 голосов
/ 24 декабря 2009

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

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

Вам необходимо убедиться, что вы отправляете сообщение WM_SETFONT в создаваемые вами окна. Многие стандартные элементы управления по умолчанию используют действительно уродливый обратно совместимый шрифт, пока вы не дадите им новый. В большинстве случаев вы, вероятно, можете использовать GetStockObject(DEFAULT_GUI_FONT) (или GetStockFont(), если вы включите windowsx.h) в качестве шрифта, который вы им отправляете. Если вы используете стандартный шрифт, вам не нужно отслеживать его и освобождать позже.

Вам также нужно установить стиль WS_EX_CLIENTEDGE или WS_EX_STATICEDGE для большинства элементов управления, чтобы получить более новое поведение при отображении. Я думаю, что обычно WS_EX_STATICEDGE, когда темы включены, и WS_EX_CLIENTEDGE, когда они не включены. Но вам нужно будет поиграться с этим. Используйте Spy ++, чтобы посмотреть на различные элементы управления, посмотреть, какие стили они используют, и убедиться, что вы соответствуете им. Отключение этих стилей приводит к отключению рисования темы.

Обратите внимание, что это флаги в стиле _EX_, поэтому вам нужно будет использовать CreateWindowEx вместо CreateWindow

Могут быть и другие вещи, но попробуйте это и посмотрите, как далеко вы зашли.

...