一、绘图
1、更新区域(update region)
1)更新区域是窗口中过期或无效,需要重绘的区域。系统依靠更新区域向应用程序发送WM_PAINT消息。
WM_PAINT产生的条件:有需要更新的区域,并且消息队列中没有其它消息时。
2)相关API:
InvalidateRect/InvalidateRgn:无效化一块区域;
ValidateRect/ValidateRgn:有效化一块区域,将这块区域从更新区域中去掉。
GetUpdateRect/GetUpdateRgn:获得更新矩形/区域。
UpdateWindow:如果更新区域非空,立即发送WM_PAINT消息;
RedrawWindow:不管更新区域是否为空,立即发送WM_PAINT消息。
二、窗口
1、窗口的类型
Windows窗口分为3种类型:
#define WS_OVERLAPPED
0x00000000L
Child窗口是其它窗口的子窗口;
popup窗口是弹出窗口,适合做主窗口;
overplapped是重叠窗口,默认有标题栏和边框。即使显示去掉WS_CAPTION和WS_BORDER这些风格,Windows还是会加上标题栏和边框。适合做主窗口。重叠窗口是top-level窗口,不能成为子窗口。
2、窗口与窗口的关系
1)Destop窗口
桌面窗口,一个特殊的窗口,可以理解为就是桌面。
2)top-level窗口
没有WS_CHILD属性的窗口,父窗口一般为Desktop或者NULL。Windows发送某些消息的时候一般要求是top-level窗口,如HWND_BROADCAST、WM_DISPLAYCHANGE等。
3)子窗口
具有WS_CHILD属性的窗口为子窗口。子窗口只能出现在父窗口的客户区内。如果要使一个窗口随另一个窗口一起移动,可以考虑使其成为另一个窗口的子窗口。需要注意的是,当父窗口移动时,子窗口不会收到WM_MOVE等消息,因为子窗口相对于父窗口并没有移动。
4)parent和owner关系
这个暂时还没发现实际中owner有啥用,主要是parent-child关系常用。
3、常用窗口风格
WS_CLIPSIBLINGS:用于兄弟窗口,即有相同父窗口的子窗口。设置了该风格的子窗口需要重绘(收到WM_PAINT消息)时,将剪裁其它子窗口的重叠部分,被遮挡的区域不进行重绘。如果没有这个属性,子窗口绘制时可能会绘制到兄弟窗口的客户区上。因此所有的top-level窗口都具有这个属性。
WS_CLIPCHILDREN:用于父窗口。设置了这个属性,当父窗口进行绘制时,子窗口的区域父窗口不负责进行绘制,子窗口自行绘制。