Как нарисовать настраиваемую кнопку на панели заголовков темы Aero, не расширяя неклиентскую область?

Я пытаюсь понять, как нарисовать пользовательскую кнопку на панели заголовков окон при использовании темы Aero в Vista или Win7. Мне нужно применить это к ряду различных приложений, не меняя исходный код, так что это будет процедура перехвата. Поскольку я не могу изменить исходный код, я не могу использовать DwmExtendFrameIntoClientArea.

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

В качестве теста я попытался использовать сообщение WM_NCPAINT, чтобы нарисовать что-то на панели заголовков. Когда тема Aero активна, ничего, что я нарисовал, не появится. Если я получаю DC для всего экрана, а не только для окна, то я могу «рисовать» на панели заголовков, но, конечно, это действительно отображается на экране. При таком подходе возникают всевозможные проблемы, поэтому он не работает. Если у кого-то есть хорошие идеи или даже хорошие подсказки, я буду очень признателен за помощь!


person Warner Young    schedule 14.07.2010    source источник


Ответы (1)


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

Вы можете подключить WndProc целевого окна для сообщений WM_MOVE и WM_SIZE.

person jnm2    schedule 03.07.2014