Windows 7 отправляет ненужные сообщения WM_PAINT - PullRequest
0 голосов
/ 17 апреля 2011

У меня вопрос о странно исходящих сообщениях WM_PAINT, отправленных в мое окно.Это происходит в Windows 7 и не происходит в Windows XP .

Подробно

В моей программе яесть таймер, который запускает обновления GUI, таймер основан на этом вызове API:

CreateTimerQueueTimer

В потоке, предоставленном моей системе для обработки истечения таймера, я делаю некоторые обновления GUI, а именно рисую линию вокно (0,0) -> (57,50) :

HDC hdc = GetDC (hwnd);
MoveToEx (hdc, 0, 0, NULL);
LineTo (hdc, 57, 50);
ReleaseDC(hwnd,hdc);

Работает так, как и следовало ожидать на Windows XP , но на Windows7 это заставляет систему отправлять сообщение WM_PAINT в это окно с регионом обновления: (0,0,58,51) .Обратите внимание, что прямоугольник на один пиксель шире площади квадрата, на которую воздействует линия.

Этот WM_PAINT, получаемый из-за этого рисунка, является чем-то, чего я не понимаю.Окно не трогается / не перекрывается / не изменяется или что-то еще.По-видимому, эта линия распознается системой как недействительность прямоугольника.

И это происходит только в Windows 7 (в отличие от Windows XP).

Вопрос

Это что-то новое в обработке WDM или Windowsв W7?Любой способ избежать этого?

Это может быть ошибка в моей программе или графическом наборе инструментов, который я использую (или оба).Но почему тогда это проявляется только в Windows 7?

Спасибо за любую подсказку!

Денни

1 Ответ

2 голосов
/ 17 апреля 2011

Время психической отладки (другими словами, я полностью догадываюсь) ...

Помните, что вы можете обновлять содержимое окна только из потока, создавшего окно. Если вы вызываете GetDC () .. ReleaseDC () из потока, отличного от потока, создавшего окно, я не удивлен, что это вызывает проблемы.

API таймера для Vista / Win7 имеют совершенно иную реализацию, чем API таймера в XP, вполне возможно, что ваш таймер может работать в другом потоке.

Вместо того, чтобы рисовать в таймере, почему бы не отправить сообщение в окно, указывающее, что таймер сработал. Затем в обработчике сообщений аннулируйте регион для окна. Затем обработайте рисование линии в обработчике WM_PAINT.

В целом, Windows намного счастливее, если вы рисуете окно в обработчике WM_PAINT вместо рисования во время других оконных сообщений.

...