Рисование в другом окне (без мерцания?) - PullRequest
2 голосов
/ 27 апреля 2011

Мне нужно что-то нарисовать в окне (это не мое - оно определяется пользователем, если это имеет значение).

Мне уже удалось нарисовать в окне, получив контекст устройства с помощью GetDC и рисуя нормально, проблема в том, что я не знаю, когда рисовать в окне - окно постоянно перерисовывается (например, игра). У меня есть несколько идей, но пока они ни хороши, ни плохи / нет реализации.

  • Использование таймера. Это была худшая идея, но я сейчас попробую что-нибудь. очевидно, поскольку окно постоянно перерисовывается, оно будет мерцать. Я думал о том, чтобы заставить окно перерисовывать перед своими рисунками, но все равно это не хорошо. не могу придумать хорошую реализацию с таймером ...
  • Перехват сообщения WM_PAINT. с использованием перехвата SetWindowsHookEx WM_GETMESSAGE Я могу использовать событие, которое получает сообщение WM_PAINT всякий раз, когда другое окно получает его, но WM_PAINT отправляется до того, как будет завершено рисование. Я обнаружил в MSDN, что вместо WH_GETMESSAGE Windows Hook вы можете использовать WndProcRetHook, который называется после обработки сообщений Windows и получения структуры, содержащей информацию о сообщениях, но пока не повезло - я не могу заставить ее работать ...
  • Перехват функций рисования. Я пытался перехватить функции рисования (или функции), такие как ReleaseDC и / или EndPaint, которые делают окно недействительным, поэтому я могу делать свои последние рисунки. на этот раз я сделал так, чтобы он работал довольно хорошо - но он все еще немного мерцает, и на некоторых окнах перехват ReleaseDC каким-то образом препятствует отображению окна - он даже не стирает его фон. иногда даже весь процесс падает.

Так что я ищу хороший способ, чтобы быть последним, чтобы рисовать в окне перед его отображением на экране. Я предпочитаю избегать перехватов, не выполняемых с помощью SetWindowsHookEx (таких как: внешняя DLL), но это тоже подойдет.

Спасибо.

Ответы [ 2 ]

3 голосов
/ 27 апреля 2011

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

Возможно, вам придется предпринять определенные шаги, чтобы щелчки мыши проходили через ваше окно к основномуокно;например.обрабатывать WM_NCHITTEST с HTTRANSPARENT и использовать стиль WS_EX_TRANSPARENT.

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

Так как в Windows окна должны рисоваться по требованию, единственный способ сделать это - использовать SetWindowsHookEx() для подключения окна WM_PAINT для этого окна.

Это нетривиальный процессэто требует, чтобы ваш код рисования находился в DLL (чтобы библиотека могла быть загружена в адресное пространство целевого приложения).

В общем, это не очень хорошая идея, если у вас нет очень веской причины для этогоэто.

...