Как убирать за собой при рисовании прямо на экран - PullRequest
2 голосов
/ 27 марта 2010

Я рисую прямо на экране, используя BitBlt и GetDC(IntPtr.Zero). Можно ли как-нибудь вызвать «Обновить» или «Неправильно» на всем экране, когда я закончу, чтобы я не оставлял большие куски краски везде (в цифровом виде)?

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

Проблема в том, что некоторые части рабочего стола Windows не перекрашиваются в течение длительного времени. Например, если я рисую поверх панели задач, реальные задачи перекрашиваются довольно быстро (вместе с кнопкой «Пуск» и т. Д.), Но сама панель задач сохраняет то, что я нарисовал, в течение пары минут.

Если бы у моего приложения было окно, которое покрывало весь экран, я бы просто назвал Invalidate() в этой форме, что заставило бы его перерисовать себя и, таким образом, весь экран. Мне нужен какой-то способ вызова Invalidate или Refresh на весь экран.

Ответы [ 2 ]

3 голосов
/ 02 апреля 2010

InvalidateRect(NULL, NULL, TRUE) должны сделать недействительными и перерисовать все окна. Хотя это будет дорогая операция.

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

Вы также можете попробовать создать прозрачное окно поверх области, которую вы нарисовали, когда вы хотите сделать недействительными окна там. Обратите внимание, что вы хотите создать альфа-смешанное многоуровневое окно, а не окно WS_TRANSPARENT. Если вы делаете это с прозрачностью 99%, DWM должен перекрасить все окна под ним, как только он будет разрушен. Конечно, это может привести к едва заметному мерцанию над целевой областью из-за изменчивости окна перед его уничтожением.

1 голос
/ 30 марта 2010

«Экран» состоит из набора окон, которые связаны с окном рабочего стола. Я полагаю, что вы можете просто сделать недействительным окно рабочего стола, хотя вам, возможно, потребуется выполнить рекурсию через дочерние окна (окна приложений верхнего уровня) и сделать их недействительными. (Могут также быть проблемы с мониторами разной кратности, но это должно дать вам отправную точку)

См. GetDesktopWindow () .

Либо создайте форму, которая покрывает весь экран, и используйте прозрачный рисунок. Затем просто закройте его, когда закончите.

...