C++ 他没有重新粉刷窗户

C++ 他没有重新粉刷窗户,c++,winapi,graphics,polygon,wm-paint,C++,Winapi,Graphics,Polygon,Wm Paint,我有一个多边形,每当我按下一个按钮,它就会被画出来 我想在再次按下按钮时重新绘制多边形,但当我按下按钮时,它只绘制另一个多边形,而不会擦除另一个: //header #define CREATETRIANGLE 1 //WM_COMMAND case 2: PAINTPROCEDURE = CREATETRIANGLE; InvalidateRect(hwnd, NULL, TRUE); break; //WM_PAINT case WM_PAIN

我有一个多边形,每当我按下一个按钮,它就会被画出来

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

//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;
我还试图将多边形移出其范围,但也没有效果

它只绘制另一个多边形,而不删除另一个多边形

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

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

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

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


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

。为什么要在
WM\u PAINT
处理程序中调用
RedrawWindow()
?你根本不应该这么叫。为什么您要使用
PAINTPROCEDURE
使
WM_PAINT
有时跳过绘图?您需要在每个
WM_PAINT
消息和
BeginPaint()上重新绘制当前多边形;EndPaint()
在您的
案例中,0
分支只是浪费代码,因为您没有在那里进行绘制。如果您不打算绘制任何内容,则绝对没有理由调用
BeginPaint()
。@ken:
BeginPaint
验证无效区域。如果该调用丢失,系统将继续生成
WM_PAINT
消息。@ken:那是另一种说法。与另一个不同,这一个是正确的。但我还是想改变背景。我不知道如何改变hwnd hbrBackground,也不知道我做错了什么。这是我的WM_-ERASEBKND:
案例WM_-ERASEBKGND:hdc=BeginPaint(hwnd,&ps);GetClientRect(hwnd和rect);FillRect(hdc和rect、WndBkgnd);端漆(hwnd和ps);中断不要在WM_ERASEBKGND中调用BeginPaint或EndPaint(或从WM_PAINT处理程序以外的任何地方调用)。在注册窗口类的地方(例如,在调用RegisterClass的地方),传递的是WNDCLASS结构。其中一个字段是hbrBackground。WNDCLASS的文档告诉您如何设置该字段。