窗口非客户区的绘制
作者:admin 日期:2011-05-12
1.根据需要,要改变nc区的大小.
响应WM_NCCALCSIZE可改变nc区的大小.关键在于lParam,msdn上说当wParam为True时,
lParam为LPNCCALCSIZE_PARAMS的指定,当wParam为False时为LPRECT,做了些实验发现
只有第一次时wParam为False,LPNCCALCSIZE_PARAMS的语义相当复杂,不过我们只用
看第一个RECT就成.它表是窗口客户区的大小.当lParam为LPRECT时,也同样.只用改变
客户区的大小,相应的就改变了非客户区的大小.
2.响应WM_NCPAINT绘制窗口的Title和Border
3.响应WM_NCHITTEST,在这里要做的是改变原来的HTMAXBUTTON,HTMINBUTTON,HTMINBUTTON 区域.
4.响应WM_NCACTIVATE,在这里不能调用默认的处理因为当窗口是非激活状态时会画出默认的Title
5.响应WM_ACTIVATEAPP,在这里先调用默认的处理.然后再自绘nc区.
6.响应
0x00AE://WM_NCUAHDRAWCAPTION
0x00AF://WM_NCUAHDRAWFRAME
这两条消息是在xp sp2后加的.xp在以前有个bug在某些时候Titlebar会画错.
在这里不能调用默认处理,直接自绘nc区.
7.最后要响应WM_NCMOUSEMOVE,WM_NCLBUTTONDOWN,WM_NCLBUTTONUP,
WM_NCMOUSELEAVE,来处理Titlebar上的鼠标动作.
另外最好调用SetWindowTheme(hWnd, L"", L""),和
DWORD dwAttr = 1;
DwmSetWindowAttribute(hWnd, 2, &dwAttr, 4));
以防止xp,和vista用主题绘制窗口nc区.
这两条函数分别是xp和vista特有的,所以只能动态加载相应的dll以调用之.
原文:http://blog.csdn.net/yyan/archive/2007/04/06/1554048.aspx