当用户在屏幕挪动其他程序的窗口时,能够会遮住以后程序的局部窗口。Windows 不会保管被遮住的那局部窗口,当其他程序的窗口被移开时,Windows 会请求你的程序从新绘制方才被遮住的局部区域。假如你本人不重绘,Windows 是不会管的。
Windows 是一个音讯驱动的零碎,它运用两种方法把各类事情告诉给使用程序:

  • 把音讯放到使用程序的音讯队列中,让程序本人经过 GetMessage 函数获取;

  • 向窗口直接发送音讯。

WM_PAINT 音讯

WM_PAINT 音讯表现绘制窗口的客户区。窗口进程会常常收到 WM_PAINT 音讯,并且可以在需要的时分绘制客户区。
以下任何一个事情发作时,窗口进程都邑收到一条 WM_PAINT 音讯:

  • 用户挪动一个窗口,招致本来被遮住的局部窗口表露出来。

  • 用户调剂窗口的巨细(当窗口类中 style 字段的值设定为 CS_HREDRAW | CS_VREDRAW 时)。

  • 客户区滚动条滚动时。

  • 当然,你可以可以挪用响应的函数强迫生成一条 WM_PAINT 音讯。


留意:窗口类中 style 字段的值常常被设定为CS_HREDRAW | CS_VREDRAW,只要如许,调剂窗口宽度或高度时才会发作重绘。上节我们在客户区的两头地位输入一段文本,这是一个分明的例子,假如 style 字段的值不是 CS_HREDRAW | CS_VREDRAW,那么调剂窗口巨细时文本就不会主动调剂,也就是不在客户区两头了。
在多数状况下,Windows 老是会保管被掩盖的局部窗口,然后再恢复,例如:

  • 鼠标指针在客户区内挪动。

  • 在客户区内拖动图标。


读者需求记住,在Windows中一切界面多是画图,一旦界面发作改动,就需求从新绘制。

无效矩形和有效矩形

Windows 普通不重绘全部客户区,而是绘制客户区的一局部。最分明的一个例子是当一个对话框掩盖了客户区的一局部时,对话框封闭时,只要先前被掩盖的谁人矩形局部需求从新绘制。
需求从新绘制的局部被称为“有效区域”或“更新区域”。在客户区中有一个有效区域将招致 Windows 向使用程序队列中放置一条 WM_PAINT 音讯。也就是说,只要当客户区的一局部生效时,窗口进程才会接纳到 WM_PAINT 音讯。
有效区域有时分是矩形,有时分是圆、多边形等,但总有一个最小的矩形可以掩盖全部有效区域,如下图所示:


图1:可以掩盖有效区域的最小矩形


上图中,灰色暗影表现有效区域,白色边框表现最小矩形。这个最小的矩形,就称为有效矩形。Windows 会主动保管有效矩形的坐标和巨细,无需我们费心,当发作重绘时,老是重绘全部有效矩形区域。
当程序处置完 WM_PAINT 音讯,有效矩形就会酿成无效的,全部客户区也就无效了。