窗口的无效区域
作者: 姜学哲(netsail0@163.net)
教材: Windows程序设计(第五版)北京大学出版社
[美]Charles Petzold 著
北京博彦科技发展有限公司 译 ¥:160
环境: windows2000 Pro sp4 + Internet Explorer 6.0 sp1 + Visual C++ 6.0
图们江计算机程序编制小组(http://chulsoft.xiloo.com)版权所有,转载请说明出处
----------------------------------------------------------------
当窗口客户区的一部分或者全部变为“无效”,以致于必须刷新时,系统将给窗口过程发送WM_PAINT消息。
收到WM_PAINT消息后必须绘制客户区。在很多时候我们只需要更新很小的一个区域就可以了。当对话框覆盖了部分客户区的时候情况就是如此。关闭对话框后,需要重画的只是先前被对话框遮住的矩形区域。这个区域就是“无效区域”或“更新区域”。
为了让你更好地理解什么是无效区域,我写了一个程序。该程序的功能是获取最新的无效区域的坐标。运行该程序后你可以用另一个较小的窗口遮住该窗口的全部或一小部分。然后再移走。又或者改变窗口的尺寸。客户区出现的四个数就是最新的无效区域坐标。以下是WndProc部分的代码:
===========================================================
LRESULT CALLBACK WndProc (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
{
static int cxChar, cxCaps, cyChar ;
HDC hdc ;
static int t[4] ;
int i ;
PAINTSTRUCT ps ;
TCHAR szBuffer [10] ;
switch (message)
{
case WM_PAINT :
hdc = BeginPaint (hwnd, &ps) ;
t[0] = ps.rcPaint.left ;
t[1] = ps.rcPaint.top ;
t[2] = ps.rcPaint.bottom ;
t[3] = ps.rcPaint.right ;
for (i = 0 ; i < 4 ; i++)
{
TextOut (hdc, t[0], t[1] + i * 20, szBuffer,
wsprintf (szBuffer, TEXT ("%5d"), t[i])) ;
}
EndPaint (hwnd, &ps) ;
return 0 ;
case WM_DESTROY :
PostQuitMessage (0) ;
return 0 ;
}
return DefWindowProc (hwnd, message, wParam, lParam) ;
}
===========================================================
BeginPaint函数除了获取设备描述表句柄之外,还从系统中获取相关信息填充她的第二个参数,也就是PAINTSTRUCT结构。该结构包含了一个rcPaint结构。而rcPaint结构就是最新无效区域的坐标。
确定无效区域的时候不需要程序员干预,是由系统自动完成的。是暗箱操作。我们只需要用BeginPaint函数获取就可以了。我对微软的这种隐藏细节的做法很不满。也仅限于不满。人在屋檐下,不得不低头。