2010-07-12 6 views
3

В настоящее время я рисую графику с помощью GDI, но мне нужно иметь возможность перерисовывать весь рабочий стол/экран. Моя графика рисуется на экране, но когда я буду перемещать застроенный пиксель, это станет линией, потому что я не перерисовываю экран (окна окна нет). Мне нужно что-то, чтобы заставить его перерисовывать весь экран, я попытался следующие подходы:Заставляет окна перерисовывать весь экран

UpdateWindow(GetDesktopWindow()); 

InvalidateRect(GetDesktopWindow(), NULL, TRUE); 

SendMessage(GetDesktopWindow(), WM_PAINT, NULL, NULL); 

Ни один из них не похоже на работу, мне просто нужно весь экран, чтобы перерисовать.

+0

Почему вы делаете все эти вещи на рабочем столе окна вместо своего окна? Окно рабочего стола - это то, что отображает ваши обои, и каждое другое окно появляется поверх него ... – Cogwheel

+0

Потому что у меня нет собственного окна, и я знаю, что он делает. Я рисую на рабочем столе, используя дескриптор рабочего стола. – Yonathan

+1

Почему бы не создать полноэкранное прозрачное окно? – onof

ответ

1

Лучшим способом может быть сохранение предыдущего состояния/цвета пикселя и его восстановление при перемещении пикселя. Перерисовать весь экран кажется слишком большим усилием и огромной тратой ресурсов.

+1

Я согласен с Джей ... С полным обновлением ваш экран будет мерцать безумно! – bits

+0

Сохранение каждой позиции пикселей все время, и изменение, скорее всего, сделает все невероятно медленным, не так ли? Должен быть какой-то способ заставить окна перерисовывать только раздел, который может быть предыдущей позицией для всего, что мне нужно. – Yonathan

2

Если вы все еще хотите, чтобы заставить весь рабочий стол перерисовать, вы можете использовать

RECT rect; 
::GetClientRect(::GetDesktopWindow(), &rect); 
::RedrawWindow(::GetDesktopWindow(), &rect, NULL, RDW_ERASE | RDW_INVALIDATE | RDW_ALLCHILDREN); 
+0

Даже с 'RDW_ERASENOW' вместо' RDW_ERASE' и 'NULL' вместо' :: GetDesktopWindow() 'работает! – sergiol

Смежные вопросы