Есть много всего плохого в этом. Что вы на самом деле пытаетесь сделать?
Из того факта, что вы используете GetDC(NULL)
, похоже, что предполагается рисовать прямоугольник на весь экран.
Откуда берется значение hwnd
? Если в этом окне есть цикл обработки сообщений (и, вероятно, он есть), то это окно становится недействительным и перерисовывается.
Примечание: InvalidateRect
просто помечает прямоугольник как необходимый для рисования в следующий раз, когда очередь сообщений этого приложения (фактически потока, более или менее) будет пустой. UpdateWindow
приведет к немедленной отправке сообщения WM_PAINT
.
drawRect
тоже не убирает должным образом. Он должен вызвать ReleaseDC
, когда он закончил, и он должен восстановить предыдущие объекты рисования после того, как он закончил (и наиболее определенно, прежде чем удалит их):
HBRUSH oldBackground = SelectObject(hDC, background);
// ...
SelectObject(hDC, oldBackground);
Что вы, вероятно, хотите сделать, так это, когда начнется выделение, создайте окно размером с экран и скопируйте в него существующий экран . Тогда вы можете рисовать все это разумно.
Функция DrawDragRect
(см. мой блог ) предназначена для такого рода вещей.