再上一篇:2.6 消息循环
上一篇:2.7 窗口函数与消息处理
主页
下一篇:2.9 WM_DESTROY消息
再下一篇:3.1 显示的时机
文章列表

2.8 WM_PAINT消息

《Windows 下的 C/C++高级编程》讲述Windows环境下调用Win32 API函数程序设计

HelloWin中的窗口函数WndProc所处理的第二个消息为WM_PAINT消息。请注意,WM_PAINT消息在Windows程序设计中是很重要的一个消息。当窗口中用户区的一部分或者全部变为“无效”从而必须“刷新”时,将由这个消息通知程序。

在以下几种情况下用户区将会变得“无效”:

■ 在最初创建窗口的时候,整个用户区都是无效的,因为程序还没有在窗口上画出任何的东西。第一个WM_PAINT消息通常发生在WinMain调用UpdateWindow的时候,并由它来指示窗口函数在用户区中画上最初的一些东西。

■ 在用户改变窗口大小后,用户区也会变得无效。我们将HelloWin中wndclass结构的style域设置为CS_HREDRAW和CS_VREDRAW,意味着当窗口大小改变(无论是水平方向、垂直方向还是两者皆有)时,系统使整个窗口变得无效。然后,给窗口函数发送一个WM_PAINT消息。

■ 当用户将窗口最小化,然后再将窗口恢复为原先的大小时,Windows将不会保存用户区的内容,因为在图形环境下,这会涉及很大的数据量。因此,Windows只是简单的使窗口变得无效,然后给窗口函数发送一个WM_PAINT消息,令其恢复窗口用户区的内容。

■ 在移动窗口使得它与其他窗口相互重叠时,Windows同样不保存其中一个窗口中被另一个窗口所覆盖的内容。当这一部分不再被覆盖之后,即被标志为无效。窗口函数同样会收到一个WM_PAINT消息,并刷新窗口用户区的内容。

通常,对WM_PAINT消息的处理从一个BeginPaint调用开始,如下:

hdc = BeginPaint( hwnd, &ps );

而以一个EndPaint调用结束,如下:

EndPaint( hwnd, &ps );

这两个函数中,第一个参数都是程序的窗口句柄,第二个参数是指向PAINTSTRUCT结构的指针。PAINTSTRUCT结构用于刷新用户区中的内容,我们将在下一章中详细介绍。

在BeginPaint调用中,如果用户区的背景还未被删除,则由Windows负责删除它,并使用相应窗口类结构的hbrBackground域中所指定的刷子来刷新背景。在HelloWin中,这是一个白色的刷子,这意味着,Windows将通过把窗口背景设置为白色来删除窗口背景。

BeginPaint调用使整个用户区变得有效,并返回一个“显示设备描述句柄”。显示设备描述句柄用于访问物理输出设备(如显示器)及其设备驱动程序。程序需要通过显示设备描述句柄在窗口的用户区中显示文本或图形,但是不能通过从BeginPaint返回的显示设备描述句柄在用户区之外显示文本或绘制图形。

EndPaint调用用于释放显示设备描述句柄,使之不再有效。

#第26页~

第2章 窗口和消息

在调用BeginPaint之后,WndProc接着调用GetClientRect,如下:

GetClientRect( hwnd, &rect );

该函数的第一个参数是程序的窗口句柄。第二个参数是一个指向RECT结构的指针。RECT结构有4个LONG域,分别为left、top、right和bottom。其中,left域和top域通常设置为0,而right域和bottom域设置为用户区的宽度和高度(以像素点计),这样GetClientRect就得到了用户区域的大小、位置信息。

WndProc将指向该RECT结构的指针作为参数传递给DrawText函数。

语句

DrawText( hdc, TEXT(“Hello, Windows 98!”), -1, &rect,

DT_SINGLELINE | DT_CENTER | DT_VCENTER );

用于在客户区中输出文本。

该函数的第一个参数是从BeginPaint返回的显示设备描述句柄;第二个参数是要输出的文本;第三个参数是要输出的文本中的字符数,这里为-1,表示所要显示的文本串是以0结尾的,文本串中所包含的字符数由系统自动统计。

该函数的最后一个参数是一系列显示方式位标志,在WINUSER.H中加以定义。这里的标志位组合表示文本必须在同一行中显示,并且水平方向和垂直方向都位于第4个参数所指定的矩形的中间。

一旦用户区变得无效,WndProc就会收到一个WM_PAINT消息,并通过BeginPaint、GetClientRect、DrewText 和 EndPaint 等一系列处理重新在新窗口的中央显示文本“Hello,Windows 98!”。