Проблемы мерцания / мертвой области при максимизации окна - PullRequest
0 голосов
/ 16 апреля 2010

Я пытаюсь сделать окно MFC (a CDialog) полноэкранным, когда пользователь пытается его развернуть. Окно используется как контекст OpenGL. Я пытаюсь сделать все внутри обратного вызова CDialog::OnSize. Вот код, который я использую:

void MyCDialogSubclass::OnSize(UINT action, int width, int height) {
    CDialog::OnSize(action, width, height);

    switch (action) {
        case SIZE_MAXIMIZED:
            if (GetStyle() & WS_OVERLAPPEDWINDOW) {
                MONITORINFO screen;
                screen.cbSize = sizeof(screen);
                if (GetMonitorInfo(MonitorFromWindow(GetSafeHwnd(), MONITOR_DEFAULTTOPRIMARY), &screen)) {
                    ModifyStyle(WS_OVERLAPPEDWINDOW, 0, 0);
                    width = screen.rcMonitor.right - screen.rcMonitor.left;
                    height = screen.rcMonitor.bottom - screen.rcMonitor.top;
                    SetWindowPos(&wndTop, screen.rcMonitor.left, screen.rcMonitor.top, width, height, SWP_NOOWNERZORDER | SWP_FRAMECHANGED);
                }
            }
            break;
        case SIZE_MINIMIZED:
        case SIZE_RESTORED:
            if (!(GetStyle() & WS_OVERLAPPEDWINDOW)) {
                ModifyStyle(0, WS_OVERLAPPEDWINDOW, 0);
                SetWindowPos(NULL, 0, 0, 0, 0, SWP_NOMOVE | SWP_NOSIZE | SWP_NOZORDER | SWP_NOOWNERZORDER | SWP_FRAMECHANGED);
            }
            break;
    }

    if (wglMakeCurrent(my_hdc, my_hglrc))
        my_opengl_reshape_call(width, height);
    wglMakeCurrent(NULL, NULL);
}

Если я закомментирую вызовы ModifyStyle(), все работает нормально, с очевидным условием, что стиль окна остается нормальным, поэтому в верхней части экрана есть стандартная строка заголовка окна, от которой я хочу избавиться. Если я сохраню вызовы ModifyStyle() и закомментирую вызовы SetWindowPos(), строка заголовка и все остальное исчезнет, ​​но у окна будет черная область в верхней части экрана, которая является точной высотой строки заголовка - как будто это зарезервировано. Если я не закомментирую ни одну из пар вызовов, как показано в коде выше, экран сильно мерцает. Я полагаю, что между черной областью, присутствующей и не присутствующей, мерцает взад-вперед, но трудно сказать. Это мерцание также приводит к повреждению видеопамяти, поскольку я получаю постоянные артефакты в заголовках окон (в разных приложениях, не меньше), и однажды изображение входа в систему в меню Пуск было заменено одной из моих текстур OpenGL.

Код, который я использую, адаптирован из кода, который Стефан связал в ответе ниже, из The Old New Thing , который работает лучше, чем мой оригинальный код. Я предполагаю, что эта проблема не возникает из-за моего решения не вставлять код для сохранения расположения окна (согласно «Старому новому»), потому что это происходит до того, как я попытаюсь восстановить окно.

1 Ответ

1 голос
/ 16 апреля 2010

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

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