闪烁/死区问题最大化MFC窗口

时间:2010-04-15 23:26:04

标签: windows opengl mfc

我试图让MFC窗口(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纹理替换。

我正在使用的代码改编自Stefan在下面的答案中链接的代码,来自The Old New Thing,这比我原来的代码更好。我假设这个问题不是因为我决定不插入代码来保存窗口位置(根据旧的新事物),因为这发生在我尝试恢复窗口之前。

1 个答案:

答案 0 :(得分:1)

如果您想让它全屏显示,请不要最大化窗口。 请改用this approach