Re[2]: Кнопки в заголовок окна для Windows Vista/7(Aero)
От: lucifer_vrn  
Дата: 23.03.10 09:04
Оценка:
Здравствуйте, Sergei I. Gorelkin, Вы писали:

SIG>Здравствуйте, lucifer_vrn, Вы писали:


_>>Здравствуйте!

_>>Подскажите пожалуйста, как поместить кнопку или хотя бы просто нарисовать нечто в заголовке окна рядом с кнопками "закрыть", "свернуть", "развернуть"?
_>>Тут множество топиков про это, равно как и в гугле, но тут есть одна проблема — они не работают по Windows Vista/ Windows Seven, т.е. под Aero(если его отключить то все работает). А меня интересует именно под висту, если под более раними осями работать не будет — не страшно.

SIG>Aero не позволяет рисовать в неклиенской области окна (при попытке это сделать Aero отключается), зато рамку можно расширить в клиентскую область.

SIG>Поэтому:
SIG>1) путем обработки WM_NCCALCSIZE системе внушается, что клиентская область окна занимает все окно.
SIG>2) с помощью DwmExtendFrameIntoClientArea() восстанавливаем визуально исходный размер рамки.
SIG>3) теперь остается сущая мелочь — самостоятельно реализовать всю функциональность неклиенской области, которая ушла лесом из-за п.1.
SIG>4) и сущая мелочь номер два — доработать напильником рисование клиентской области, чтобы на месте рамки рисовалось только то, что нужно.


2 и 3 с теми или иными нюансами у меня было сделанно.
4 немогу начать пока остальное не сделаю.
вот за пункт 1 большое спасибо! Попытался реализовать сие дело:

case WM_NCCALCSIZE:
if (wParam)
{
NCCALCSIZE_PARAMS *a1 =( NCCALCSIZE_PARAMS *) message->lParam;
if(message->wParam)
{
const int border = 7;
a1->rgrc[0].left += border; a1->rgrc[0].right -= border; a1->rgrc[0].bottom -= border; //a1->rgrc[0].top += border;
a1->rgrc[1].left = a1->rgrc[0].left; a1->rgrc[1].right = a1->rgrc[0].right; a1->rgrc[1].bottom = a1->rgrc[0].bottom; //a1->rgrc[1].top = a1->rgrc[0].top;
a1->rgrc[2].left = a1->rgrc[0].left; a1->rgrc[2].right = a1->rgrc[0].right; a1->rgrc[2].bottom = a1->rgrc[0].bottom; //a1->rgrc[2].top = a1->rgrc[0].top;
}

return SWP_DRAWFRAME;
}

вообще плохо понял как правильно реализовывать WM_NCCALCSIZE... в моей реализации главный косяк, что я еще случай с wParam == FALSE не обрабатываю, но он вроде и не приходит.
Так вот при этой реализции:
1. кнопки системного меню свернуть закрыть итд остались — что есть великолепно!
2. окно нормально ресайзиться
3. Но когда пытаюсь переместить окно(за клиентскую часть у меня реализация этого была) оно у меня начинает увеличивать размер. Видимо дело в том что я в WM_NCCALCSIZE чето не правильно считаю...
4. После перемещение/ресайза окна — кнопки закрыть/свернуть начинают работать только со второго клика, т.е. первый раз нажимаю чето происходит второй раз жму он выполянет.

Подскажите пожалуйста как правильно реализовать WM_NCCALCSIZE?
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.