【问题标题】:Clear GDI shape inside the loop清除循环内的 GDI 形状
【发布时间】:2012-03-18 02:40:03
【问题描述】:

我有一个程序可以在鼠标光标下绘制一个矩形并显示像素颜色,但是如果我使用 'InvalidateRect(),我无法管理它来清除 while 循环内的形状' 它清除矩形太快并且闪烁,如果不使用 'InvalidateRect()' 然后 Rectangle 会像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()

【问题讨论】:

  • 只要记住你之前画的地方,然后把那个矩形画回背景颜色。如果你仍然看到闪烁,它应该不再明显了,然后重新绘制没有被新矩形重叠的部分。
  • 不错的提示@Hans,我正在努力。

标签: c++ winapi gdi


【解决方案1】:

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

从您使用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 into it.然后你就可以智能地画出来了。

DrawDragRect 函数(参见my blog)就是为这类事情而设计的。

【讨论】:

  • 这很有帮助,很棒的博客!
猜你喜欢
  • 2020-12-18
  • 2015-10-21
  • 2022-12-10
  • 2015-11-01
  • 1970-01-01
  • 1970-01-01
  • 2019-06-30
  • 1970-01-01
  • 2019-12-18
相关资源
最近更新 更多