Четкая форма GDI внутри цикла - PullRequest
1 голос
/ 17 марта 2012

У меня есть программа, которая рисует прямоугольник под курсором мыши и показывает цвет пикселя, но я не могу справиться с этим, чтобы очистить форму внутри цикла while, если я использую ' InvalidateRect () 'он очищает прямоугольник слишком быстро и мерцает, если не использовать ' InvalidateRect () ', то Rectangle продолжает дублироваться, как ЭТО , как это исправить?

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 ()

1 Ответ

1 голос
/ 17 марта 2012

Есть много всего плохого в этом. Что вы на самом деле пытаетесь сделать?

Из того факта, что вы используете GetDC(NULL), похоже, что предполагается рисовать прямоугольник на весь экран.

Откуда берется значение hwnd? Если в этом окне есть цикл обработки сообщений (и, вероятно, он есть), то это окно становится недействительным и перерисовывается.

Примечание: InvalidateRect просто помечает прямоугольник как необходимый для рисования в следующий раз, когда очередь сообщений этого приложения (фактически потока, более или менее) будет пустой. UpdateWindow приведет к немедленной отправке сообщения WM_PAINT.

drawRect тоже не убирает должным образом. Он должен вызвать ReleaseDC, когда он закончил, и он должен восстановить предыдущие объекты рисования после того, как он закончил (и наиболее определенно, прежде чем удалит их):

HBRUSH oldBackground = SelectObject(hDC, background);

// ...

SelectObject(hDC, oldBackground);

Что вы, вероятно, хотите сделать, так это, когда начнется выделение, создайте окно размером с экран и скопируйте в него существующий экран . Тогда вы можете рисовать все это разумно.

Функция DrawDragRect (см. мой блог ) предназначена для такого рода вещей.

...