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 设置了正确的值。一旦成功,您可以尝试其他方法。
每当我按下按钮时,我都会绘制一个多边形。
我想在再次按下按钮时重新绘制多边形,但是当我按下它时,它只是绘制了另一个多边形而没有擦除另一个:
//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 设置了正确的值。一旦成功,您可以尝试其他方法。