изменение цвета дочерних окон MDI под Windows 7

У меня есть MDI-приложение, написанное на C++, которое отлично работает под Windows XP. Все дочерние окна MDI в конечном итоге выглядят как их родительские окна. Хороший. Однако в Windows 7 (и, возможно, в Vista) родительские окна имеют аэродинамическое стекло, а дочерние окна имеют этот отвратительный неизменяемый голубой цвет (такой же, как тема Windows 7 Basic). Так что мое приложение действительно выглядит очень-очень плохо.

Вы можете увидеть такое же уродливое поведение, запустив Office 2003 и попробовав просмотреть дочерние окна MDI (возможно, в Excel). Однако на самом деле в Office 2007 есть три цветовые темы: синяя, серебристая и черная. Эти темы каким-то образом переносятся в дочерние окна MDI в Excel.

Я не знаю, как Microsoft делает это в Office 2007. Я хотел бы узнать, как это сделать. Мне нужно подключить и взять на себя отрисовку моих дочерних окон MDI и воспроизвести то, что удалось сделать команде Office 2007. Проблема в том, что я хочу использовать все вызовы DrawTheme*, чтобы правильно отрисовывать градиенты, закругленные края и кнопки. И всем этим системным вызовам нужен дескриптор темы. Но кажется невозможным, например, использовать SetWindowTheme для перехода на использование цветовой схемы из другой темы. По крайней мере, насколько я могу судить.

Кто-нибудь знает, как Microsoft добилась этого?


person dsmtoday    schedule 25.08.2009    source источник


Ответы (1)


Это не самое лучшее решение, но, порывшись в Интернете, я нашел эту статью о том, как поместить закругленный вид WinXP в квадратный плоский стиль окна Win95/Win98/Win2k. Он работает с использованием моментальных снимков BMP темы WinXP, а затем с помощью функций битблита, чтобы растянуть их до соответствующих размеров вокруг границы оконной рамы. Я попробовал его демонстрационную программу, и действительно, она выглядит как WinXP Luna под Win7. Я могу использовать его пример в качестве основы для подключения и замены моего рисунка дочерней оконной рамы MDI.

Проблема с этим подходом заключается в том, что вам либо нужно выбрать ширину заголовка и придерживаться ее, не реагируя на глобальные настройки темы, которые изменяют высоту заголовка, либо вам нужно сделать много разных снимков BMP с разными размерами. Для моих целей, вероятно, будет достаточно просто придерживаться одной толщины и игнорировать настройки пользовательской темы. Оказавшись на месте, я могу применять разные темы, просто создавая их BMP-снимки, поэтому я также могу применить дочерний вид Office 2007 MDI.

person dsmtoday    schedule 27.08.2009
comment
Я действительно ненавижу делать что-то подобное, поскольку это нарушает стандарты графического интерфейса, но мне бы даже не пришлось об этом думать, если бы Microsoft предоставила возможность настраивать цвета дочерних элементов MDI в Windows 7. - person dsmtoday; 27.08.2009