0

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

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

//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;

我也试图让多边形超出其范围,但它也没有做任何事情。

4

1 回答 1

0

它只是绘制另一个多边形而不擦除另一个多边形

当您调用 BeginPaint 时,系统通常会在返回之前调用 WM_ERASEBKGND。然后 WM_ERASEBKGND 处理程序有机会“擦除”窗口。默认处理程序(来自 DefWndProc)将使用此窗口的 WNDCLASS 中的画笔填充该区域。

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

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

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

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

于 2020-01-22T00:43:18.700 回答