c++ - 清除循环内的 GDI 形状

标签 c++ winapi gdi

我有一个程序可以在鼠标光标下绘制一个矩形并显示像素颜色,但如果我使用 'InvalidateRect(),我无法管理它来清除 while 循环内的形状' 它清除矩形太快和闪烁,如果不使用 'InvalidateRect()' 然后矩形继续复制像 THIS ,如何解决?

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 值从哪里来?如果那个窗口确实有一个消息循环(它可能有),那么这个窗口就会失效并重新绘制它自己。

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

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

HBRUSH oldBackground = SelectObject(hDC, background);

// ...

SelectObject(hDC, oldBackground);

What you probably want to do is, when selection starts, create a window the size of the screen and copy the existing screen进去。然后你可以聪明地在上面画画。

DrawDragRect 函数(参见 my blog)专为此类事情而设计。

关于c++ - 清除循环内的 GDI 形状,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9752360/

相关文章:

c++ - 使用 std::function 或转发引用作为高阶函数的通用可调用对象输入参数?

c++ - 使用new运算符创建派生对象时如何解析不是基类的成员

c# - 是否可以使用 C# 删除另一个应用程序的大小调整和关闭?

c - 如何子类化 Windows 公共(public)控件?

c++ - 调整大小时,如何获得一个窗口来保留绘制的对象 C++

text - Win32 DrawText 行高

c# - 保存图像时 GDI+ 中出现一般性错误

c++ - 独立于编译器的 C++ 属性

c++ - 如何使用 Clang 获取模板类型类成员的实际类型?

c++ - 数组大小错误 x64 进程