在更新区域重新划线

【勇芳软件工作室】汉化HomePreviousNext

通过确定更新区域的大小和位置来处理WM_PAINT消息时,可以限制应用程序执行的绘制量。由于Windows在为窗口的显示DC创建剪辑区域时使用更新区域,因此可以通过检查剪切区域间接确定更新区域。

在以下示例中,窗口过程绘制三角形,矩形,五边形和六边形,但仅当每个图形的全部或部分位于更新区域中时。窗口过程使用RectVisible函数和一个100乘100的矩形来确定一个数字是否位于由BeginPaint检索到的公共DC的裁剪区域内(因此是更新区域)。

POINT aptTriangle[4] = {50,2, 98,86, 2,86, 50,2},

aptRectangle[5] = { 2,2, 98,2, 98,98, 2,98, 2,2},

aptPentagon[6] = {50,2, 98,35, 79,90, 21,90, 2,35, 50,2},

aptHexagon[7] = {50,2, 93,25, 93,75, 50,98, 7,75, 7,25, 50,2};

.

.

.

case WM_PAINT:

hdc = BeginPaint(hwnd, &ps);

SetRect(&rc, 0, 0, 100, 100);

if(RectVisible(hdc,& rc))

Polyline(hdc, aptTriangle, 4);

SetViewportOrgEx(hdc, 100, 0, NULL);

if(RectVisible(hdc,& rc))

Polyline(hdc, aptRectangle, 5);

SetViewportOrgEx(hdc, 0, 100, NULL);

if(RectVisible(hdc,& rc))

Polyline(hdc, aptPentagon, 6);

SetViewportOrgEx(hdc, 100, 100, NULL);

if(RectVisible(hdc,& rc))

Polyline(hdc, aptHexagon, 7);

EndPaint(hwnd, &ps);

return 0L;

.

.

.

该示例中每个图形的坐标位于相同的100×100矩形内。在绘制图形之前,窗口过程通过使用SetViewportOrgEx功能将视口原点设置为客户区域的不同部分。这样可以防止数字被画在另一个之上。更改视口原点不会影响裁剪区域,但会影响如何解释传递到RectVisible的矩形的坐标。更改原点还允许您使用单个矩形来检查更新区域,而不是每个图形的单个矩形。