Плавное изменение размеров окна в Windows (с использованием Direct2D 1.1)?

Меня раздражает, что изменение размеров окон в Windows не такое «плавное», как хотелось бы (в общем случае это касается программ для Windows, а не только для меня. Visual Studio - хороший пример). Это заставляет ОС и ее программы чувствовать себя «надуманными» и «дешевыми» (да, меня интересует, как программы и пользовательские интерфейсыЧувствоватьТочно так же я забочусь о звуке и ощущении закрытия дверцы машины. Это отражение качества сборки), что, на мой взгляд, влияет на общий UX и, в конечном счете, на восприятие бренда.

Перерисовка содержимого окна просто не поспевает за движением мыши во время изменения размера. Всякий раз, когда я изменяю размер окна, возникает эффект «заикания» / «мерцания», по-видимому, из-за того, что содержимое предыдущего размера окна перерисовывается в новой рамке окна с измененным размером до рисования нового содержимого с измененным размером.

Я создаю приложение Win32 (x64), которое использует Direct2D 1.1 для рисования своего пользовательского интерфейса, и учитывая скорость Direct2D, я думаю, что в 2014 году такие артефакты в ОС должны быть излишними. Я сам на Windows 8.1, но нацеливаюсь на Windows 7 и выше с этим приложением.

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

Вот что происходит:

(Допустим, на экране есть полностью визуализированное окно размером 500 x 500 пикселей).Я максимизирую окно:Рамка окна максимально увеличенаСтарый контент 500 х 500 рисуется в новом кадре, перед тем как ..... максимизированное окно перекрашено с соответствующим размером содержимого.

Мне интересно, есть ли способ смягчить это (например, избавиться от шага 4) - например, путем перехвата сообщения Windows - и избежать перекрашивания окна в новом размере со старым содержимым перед окончательной повторной визуализацией новый контент случается. Это похоже на то, как Windows выполняет перерисовку окна, используя любую имеющуюся графику, ПЕРЕД тем, что надоедает попросить меня предоставить обновленный контент с сообщением WM_PAINT или аналогичным.

Это можно сделать?

Редактировать: кажется, что WM_WINDOWPOSCHANGING / WM_SIZING обеспечивает «ранний доступ» к новым данным размера, но мне все еще не удалось подавить рисование старого содержимого.

мойWndProc выглядит так:

LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
    switch (message)
    {
    case WM_ERASEBKGND:
        return 1;
    case WM_PAINT:
        PAINTSTRUCT ps;
        BeginPaint(hWnd, &ps);
        D2DRender();
        EndPaint(hWnd, &ps);
        return 0;
    case WM_SIZE:
        if (DeviceContext && wParam != SIZE_MINIMIZED)
        {
            D2DResizeTargetBitmap();
            D2DRender();
        }
        return 0;
    case WM_DISPLAYCHANGE:
        D2DRender();
        return 0;
    case WM_DESTROY:
        PostQuitMessage(0);
        return 0;
    }
    return DefWindowProc(hWnd, message, wParam, lParam);
}

Окно не имеетCS_HREDRAW или жеCS_VREDRAW задавать. Swapchain с двойной буферизацией иPresent вызов сделан с SyncInterval = 0.

Я знаю, что воссоздание буферов swapchain каждый раз, когда изменяется размер окна, создаетнемного накладные расходы по сравнению с простой перерисовкой на поверхности статического окна. Однако "заикание" не вызвано этим, как это происходит, даже когда изменение размера буфера отключено, а существующее содержимое окна простомасштабируется во время изменения размера окна (хотя этоделает заставьте это идти в ногу лучше с движением мыши).

Ответы на вопрос(6)

Ваш ответ на вопрос