C++ 清除循环内的GDI形状

C++ 清除循环内的GDI形状,c++,winapi,gdi,C++,Winapi,Gdi,我有一个程序,可以在鼠标光标下画一个矩形并显示像素颜色,但我无法清除while循环中的形状,如果我使用“无效竖立()”清除矩形太快且闪烁,如果不使用“无效竖立()”,则矩形会继续复制,如是,如何修复 HWND hwnd; POINT p; unsigned short R=0, G=0, B=0; void drawRect() { GetCursorPos(&p); HDC hdc = GetDC(NULL); HPEN border = Create

我有一个程序,可以在鼠标光标下画一个矩形并显示像素颜色,但我无法清除while循环中的形状,如果我使用“无效竖立()”清除矩形太快且闪烁,如果不使用“无效竖立()”,则矩形会继续复制,如是,如何修复

HWND hwnd;
POINT p;
unsigned short R=0, G=0, B=0;

void drawRect()
{
     GetCursorPos(&p);

     HDC hdc = GetDC(NULL);
     HPEN border = CreatePen(PS_SOLID, 2, RGB(0, 0, 0));
     HBRUSH background = CreateSolidBrush(RGB(R, G, B)); 

     SelectObject(hdc, border);
     SelectObject(hdc, background);
     Rectangle(hdc, p.x+10, p.y+10, p.x+40, p.y+40);

     DeleteObject(border);
     DeleteObject(background);
 }

 void init()
 {
     while (GetAsyncKeyState(VK_RBUTTON) & 0x8000)
     {
         grabPixel(); //get RGB color from cursor coordination
         drawRect();  //draw preview rectangle under cursor

         InvalidateRect(hwnd, NULL, true);
     }
 }

注意:它没有WinMain()或WndProc()

这有各种各样的问题。你到底想做什么

从您使用的是
GetDC(NULL)
这一事实来看,它似乎应该在整个屏幕上绘制一个矩形

hwnd
值来自何处?如果该窗口确实有一个消息循环(它可能有),则该窗口将失效并重新绘制自身

注意:
invalidate
仅将矩形标记为下次应用程序(实际上是线程的,或多或少)消息队列为空时需要绘制
UpdateWindow
将导致立即发送
WM\u PAINT
消息

drawRect
也没有正确清理。完成后,它应该调用
ReleaseDC
,并且应该在完成后(最明确的是在删除之前)恢复以前的图形对象:

您可能想做的是,当选择开始时,创建一个屏幕大小的窗口并将其插入其中。然后你就可以聪明地画出来了


DrawDragRect
函数(请参阅)就是为这类事情而设计的。

这有各种各样的问题。你到底想做什么

从您使用的是
GetDC(NULL)
这一事实来看,它似乎应该在整个屏幕上绘制一个矩形

hwnd
值来自何处?如果该窗口确实有一个消息循环(它可能有),则该窗口将失效并重新绘制自身

注意:
invalidate
仅将矩形标记为下次应用程序(实际上是线程的,或多或少)消息队列为空时需要绘制
UpdateWindow
将导致立即发送
WM\u PAINT
消息

drawRect
也没有正确清理。完成后,它应该调用
ReleaseDC
,并且应该在完成后(最明确的是在删除之前)恢复以前的图形对象:

您可能想做的是,当选择开始时,创建一个屏幕大小的窗口并将其插入其中。然后你就可以聪明地画出来了


DrawDragRect
函数(请参阅)就是为这类事情而设计的。

只需记住之前在哪里绘制的,然后将该矩形绘制回背景色即可。如果你仍然看到闪烁,它应该不再明显,然后只需重新绘制没有被新矩形重叠的部分。很好的提示@Hans,我正在处理它。只需记住你之前绘制的位置,并将该矩形绘制回背景色。如果你仍然看到闪烁,它应该不再明显,然后只需重新绘制没有被新矩形重叠的部分。很好的提示@Hans,我正在处理它。这很有帮助,很棒的博客!那很有帮助,很棒的博客!
HBRUSH oldBackground = SelectObject(hDC, background);

// ...

SelectObject(hDC, oldBackground);