Принудительно перерисовывать экран после рисования на экране DC C++

Я создаю пользовательский SIP для Windows Mobile, и когда пользователь нажимает или «наводит курсор» на кнопку на клавиатуре, я рисую соответствующее выбранное изображение (в стиле iPhone) на DC экрана, используя :: GetDC (NULL). Он разработан в Win32 C++.

Моя проблема в том, что я никогда не могу заставить экран перерисовываться, стирая ранее нарисованный ключ. Я перепробовал все, что только мог придумать, чтобы заставить это сделать: ::RedrawWindow() со всеми различными комбинациями параметров, используя NULL или любую из функций Get..Window в качестве HWND, и все комбинации флагов (INVALIDATE | UPDATENOW | ERASENOW | ВСЕ ДЕТИ и др.). Я также пытался аннулировать прямоугольник и принудительно перерисовать базовое приложение, используя ::GetActiveWindow и ::GetForegroundWindow, вариации, используя ::GetDesktopWindow и т. д. По сути, у меня закончились идеи, и это последнее, что удерживает меня от используя его на моем устройстве Windows Mobile. У кого-нибудь есть идеи? Любая помощь будет принята с благодарностью.

Я включил несколько скриншотов, чтобы проиллюстрировать мою дилемму.

До снимка экрана
После снимка экрана

http://img13.imageshack.us/img13/9861/cezoom1.png http://img3.imageshack.us/img3/7481/cezoom2.png

Заранее спасибо!


person Community    schedule 07.03.2009    source источник


Ответы (2)


Вместо того, чтобы рисовать на фоне DC, почему бы вам не создать временное окно и не рисовать в нем? Когда вы уничтожаете окно, фон должен автоматически перерисовываться.

Я просто предполагаю, потому что я не знаю Windows Mobile, но может быть, что Windows кэширует последнее, что было нарисовано в DC, и перерисовывает его каждый раз, когда вы аннулируете окно.

person Mark Ransom    schedule 07.03.2009
comment
Интересный подход, попробую, спасибо. Я не верю, что DC кэширует, потому что проблема возникает только тогда, когда кнопки рисуются за пределами моей sip-панели (над ней). У меня нет этой проблемы с кнопками внутри панели, хотя они тоже нарисованы на экране. - person ; 07.03.2009
comment
Когда я говорю кнопки внутри панели, я имею в виду выбранные синие всплывающие кнопки. (все остальные кнопки нарисованы на растровом изображении, а затем перенесены на DC моей sip-панели, а не на экран) - person ; 07.03.2009

Вы пробовали InvalidateRect на экране hWnd?

person Chris Hynes    schedule 07.03.2009
comment
под screen hWnd я полагаю, вы имеете в виду ::GetDesktopWindow(), правильно? Если это то, что вы имеете в виду, то да, я пробовал все обычные вызовы против экрана wnd. - person ; 07.03.2009