Обновление фона скрытого элемента управления Windows Forms - PullRequest
0 голосов
/ 03 января 2012

У меня есть элемент управления Windows Forms (подкласс Panel), который служит панелью для отображения изображения. Фон элемента управления служит изображением, которое отображается пользователю. Само изображение обычно представляет собой скриншот того, что находится за приложением. Метод получения этого снимка экрана состоит в том, чтобы скрыть приложение и заставить пользователя нажать кнопку. Когда эта кнопка нажата, снимок экрана сохраняется в качестве фона элемента управления Windows Forms, а затем приложение отображается снова. Фон не обновляется пока элемент управления снова не станет видимым, и это вызывает заметное мерцание, когда старый фон переключается на новый. Есть ли способ заставить фон изменить, пока элемент управления скрыт и убрать это мерцание?

Код:

public void updateBackground()
{
    Image bg = null;

    do
    {
        // this just gets the background using gdi32 and user32 calls
        bg = Utilities.getDesktopImage(); 
    }
    while (bg == null);

    // this function invokes the GUI thread to change the BackgroundImage of the 
    //    drawPanel
    drawPanel.setBackground(bg)

    // drawPanel is a child control to the main Form
    mainForm.show();
}

Я также пытался использовать различные формы Refresh() и Invalidate(), чтобы получить элемент управления для обновления до его отображения. Application.DoEvents() кажется для улучшения скорости, но все еще есть заметное изменение от старого фона к новому.

Есть ли что-то, чего мне не хватает? Кажется, я не могу найти то, что ищу, в Google или где-либо еще в StackOverflow.

Спасибо.

Ответы [ 2 ]

0 голосов
/ 03 января 2012

Используете ли вы Win7 или Vista и запущена ли служба диспетчера окон рабочего стола?

Устранена ли проблема при отключении DWM (Панель управления -> Администрирование -> Службы -> Диспетчер сеансов диспетчера окон рабочего стола)?

Звучит как проблема с Aero - DWM работает так, что графический буфер формы не обновляется, пока он скрыт. DWM хранит данные последней видимой краски и не обновляется, пока форма снова не станет видимой. Это приводит к тому, что предыдущий холст формы кратковременно виден до тех пор, пока Windows не сможет перерисовать изменения с момента его последнего отображения (т. Е. Мерцание).

В этой статье обсуждаются некоторые темы:

http://blogs.msdn.com/b/greg_schechter/archive/2006/05/02/588934.aspx

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

0 голосов
/ 03 января 2012

Попробуйте переместить логику в другой поток (Task, Backgroundworker или ThreadPool).Это должно устранить задержку, которую вы видите.

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

...