InvalidateRect 没有重新绘制 window

InvalidateRect is not repainting the window

每当我按下按钮时,我都会绘制一个多边形。

我想在再次按下按钮时重新绘制多边形,但是当我按下它时,它只是绘制了另一个多边形而没有擦除另一个:

//header
#define CREATETRIANGLE 1

//WM_COMMAND
    case 2:
      PAINTPROCEDURE = CREATETRIANGLE;
      InvalidateRect(hwnd, NULL, TRUE);
      break;

//WM_PAINT
case WM_PAINT:
  switch(PAINTPROCEDURE){
    case 0:{
      hdc = BeginPaint(hwnd, &ps);
      EndPaint(hwnd,&ps);
      }
    break;
    case 1:
      RedrawWindow(hwnd, &rect, NULL, RDW_NOCHILDREN); //I tried this function, but it did nothing
      TriangleDC = BeginPaint(hwnd, &tps);
        SelectPen(TriangleDC, CreatePen(PS_SOLID, 2, RGB(256,256,256)));
        SelectBrush(TriangleDC, CreateSolidBrush(RGB(0,192,192)));
       {
       POINT vertices[] = {{baseX,baseY}, {(baseX-(triangle.sideB)),baseY}, {baseX,(baseY-triangle.sideC)}};
       Polygon(TriangleDC, vertices, 3);
       }
      EndPaint(hwnd,&ps);
      PAINTPROCEDURE = 0;
                break;

我也试图将多边形移出它的范围,但它也什么也没做。

it just paints another polygon without erasing the other one

当您调用BeginPaint 时,系统通常会在返回前调用WM_ERASEBKGND。然后 WM_ERASEBKGND 处理程序有机会 "erase" window。默认处理程序(来自 DefWndProc)将使用来自 WNDCLASS 的画笔为此 window.

填充区域

听起来擦除没有发生,这可能意味着:(1) 您提供的 WM_ERASEBKGND 处理程序实际上并没有擦除屏幕,或者 (2) WNDCLASS 中的 hbrBackground 是设置错误或设置为空刷

在任何一种情况下,应该发生的是您从 BeginPaint 获得的 PAINTSTRUCT 的 fErase 字段将设置为 0 以外的值,这告诉您您[WM_PAINT 处理程序] 仍然必须先擦除 window。

现在,有时人们在尝试优化绘画(或在误导性尝试减少闪烁)时使用自己的自定义 WM_ERASEBKGND 处理程序玩游戏。这可能导致 fErase 标志为 0,即使您确实需要先擦除。

我的建议是让 DefWndProc 处理 WM_ERASEBKGND 并确保您在 WNDCLASS 中为 hbrBackground 设置了正确的值。一旦成功,您可以尝试其他方法。