Как восстановить свернутое окно без мерцания - PullRequest
6 голосов
/ 08 декабря 2008

Я сделал клон экспозиции для Vista, который иногда должен восстанавливать свернутое окно. Мне удалось сделать это с помощью функции SetWindowPlacement. Проблема в том, что это также перерисовывает окно, которое выглядит как дерьмо, после того, как окно красиво скользит в экран.

Это код, который я использую, чтобы вывести окно наверх и выделить его:

    private static void ActivateWindow(IntPtr windowToShow)
    {
        RectAPI r = new RectAPI();
        Win32.GetWindowRect(windowToShow, ref r);

        if (r.top == -32000) //r.top is -32000 if the window is in minimized state
        {
            WINDOWPLACEMENT wp = new WINDOWPLACEMENT();
            Win32.GetWindowPlacement(windowToShow, ref wp);

            if (wp.flags == WindowPlacementFlags.WPF_RESTORETOMAXIMIZED)
                wp.showCmd = cmdShow.SW_SHOWMAXIMIZED;
            else
                wp.showCmd = cmdShow.SW_RESTORE;

            Win32.SetWindowPlacement(windowToShow, ref wp);
        }

        Win32.SetForegroundWindow(windowToShow);
    }

Если я использую его в уже восстановленном окне, оно вызовет только SetForegroundWindow, и окно попадет в верхнюю часть z-порядка и получит фокус без какого-либо мерцания.

Но если я вызываю его в свернутом окне, я также должен использовать SetWindowPlacement, чтобы вернуть окно в восстановленное состояние. Вот что заставляет окно перекрашиваться и мерцать: /

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

Ответы [ 3 ]

2 голосов
/ 09 декабря 2008

Один из способов сделать это - использовать технику двойной буферизации: рисовать в закадровом растровом изображении, затем восстанавливать, а затем перетаскивать растровое изображение на экран. Но это кажется излишним, если восстановление свернутого окна - единственный сценарий, где это необходимо. Может быть, у других будут лучшие идеи? ..

Кроме того, если вы рисуете всю клиентскую область окна, вы можете отключить WM_ERASEBKGND (или, точнее, сказать, что вы его обработали, но ничего не делаете), чтобы избежать ненужной последовательности заполнения фоновым рисунком и перерисовки.

1 голос
/ 09 декабря 2008

Эта ссылка в MSDN объяснит, как вы хотели бы обработать окраску окна в вашем случае. Оконные события, такие как обновление окна или сворачивание / сворачивание, потребуют перекраски вашего окна или области окна.

Счастливое кодирование !!

0 голосов
/ 09 декабря 2008

Я ОП ... случайно съел мое печенье.

Изучил, как windows flip3d и панель задач управляют этим немного ближе, и они фактически перерисовывают окно до того, как запустят анимацию большого пальца. Попытайтесь свернуть окно, а затем восстановите его с помощью flip3d, на 3d-окне появится небольшое мерцание, прежде чем оно будет восстановлено.

Пробовал то же самое с моим приложением, и оно выглядит намного лучше, не идеально, но приемлемо: /

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...