使工作区失效

系统不是 WM_PAINT 消息的唯一来源。 InvalidateRectInvalidateRgn 函数可以间接为窗口生成WM_PAINT消息。 这些函数将工作区的全部或部分标记为无效 (,必须重新绘制) 。

在以下示例中,窗口过程在处理 WM_CHAR 消息时使整个工作区失效。 这允许用户通过键入数字并查看结果来更改数字;只要应用程序的消息队列中没有其他消息,就会立即绘制这些结果。

RECT rc;
POINT 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}; 
POINT *ppt = aptPentagon; 
int cpt = 6; 
 
  . 
  . 
  . 
 
case WM_CHAR: 
    switch (wParam) 
    { 
        case '5': 
            ppt = aptPentagon; 
            cpt = 6; 
            break; 
        case '6': 
            ppt = aptHexagon; 
            cpt = 7; 
            break; 
    } 
    InvalidateRect(hwnd, NULL, TRUE); 
    return 0L; 
 
case WM_PAINT: 
    hdc = BeginPaint(hwnd, &ps); 
    GetClientRect(hwnd, &rc); 
    SetMapMode(hdc, MM_ANISOTROPIC); 
    SetWindowExtEx(hdc, 100, 100, NULL); 
    SetViewportExtEx(hdc, rc.right, rc.bottom, NULL); 
    Polyline(hdc, ppt, cpt); 
    EndPaint(hwnd, &ps); 
    return 0L; 

在此示例中,InvalidateRect 使用的 NULL 参数指定整个工作区;TRUE 参数会导致背景被擦除。 如果不希望应用程序等到应用程序的消息队列没有其他消息,请使用 UpdateWindow 函数强制立即发送 WM_PAINT 消息。 如果工作区有任何无效部分, UpdateWindow 会将指定窗口 的WM_PAINT 消息直接发送到窗口过程。