首页 > 代码库 > 窗口非客户区的绘制

窗口非客户区的绘制

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以调用之.

发现在window2000 下当鼠标单击nc区时还是会画出默认的nc区。经过试验当鼠标单击时调用 LockWindowUpdate  这条函数就行了。使用方法。.

LockWindowUpdate(hWnd);

..

LockWindowUpdate(NULL);