Рисовать на экране с GDI + (или GDI), аналогично Inspect - PullRequest
1 голос
/ 18 февраля 2012

Я пытаюсь нарисовать на экране (весь экран, поверх всех остальных окон), используя GDI +.
Я передал NULL в GetDC, чтобы вывести HDC на экран, а затем использовал его длясоздайте объект Graphics и использовали DrawRectangle для рисования прямоугольников на экране.
Все работает ... за исключением ... внутренняя часть прямоугольника не обновляется.

Как если бы я рисовал его над командойи переместите командную строку, внутренняя часть прямоугольника остается черной.Я ожидаю увидеть, что находится под прямоугольником.

Вот код, который выполняет рисование ..

Pen BluePen(Color(255, 0, 255, 0), 2);
Graphics graphics(screenDC);
graphics.DrawRectangle(&BluePen, myRect);

Довольно просто, так что я должен что-то сделать, чтобы получить внутрипрямоугольник для обновления, когда экран делает?Или чтобы он был действительно прозрачным.

================= РЕДАКТИРОВАТЬ =================

Я отказался от этого и предположил, что это невозможно, пока ... Я не понял, что инструмент Inspect, поставляемый с Windows SDK, делает это прекрасно.

Я хотел бы воссоздать что-то похожее на выделенный прямоугольник, и если я выберу окно (например, Firefox), а затем перенесу Inspect в фокус, я могу свободно перемещать его, когда все будет идеально обновляться.Даже мерцания нет.

Итак ... кто-нибудь знает, как Inspect удается это сделать?

Также ответы в GDI вместо GDI + хороши ...

1 Ответ

3 голосов
/ 18 февраля 2012

В окнах поверхность экрана (и окна ...) ... изменчива, как песочницы.«Перекрытие» окон и перекрашивание непокрытых поверхностей - иллюзия, созданная надлежащим управлением событиями.

Все нарисованное остается там до тех пор, пока над ним не будет нарисовано что-то еще.«Раскрытие» поверхности заставляет окно, представляющее эту поверхность, получать сообщение WM_PAINT.Это зависит от того, как оконная процедура реагирует на это сообщение, перерисовывая все, что должно быть под ним.

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

...