代码之家  ›  专栏  ›  技术社区  ›  John Calsbeek

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

  •  0
  • John Calsbeek  · 技术社区  · 15 年前

    我正在尝试创建一个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() 调用时,一切都正常,明显的限制是窗口样式保持正常,所以屏幕顶部有一个标准的窗口标题栏,我想去掉它。如果我保持 修改字体() 电话和评论 SetWindowPos() 调用、标题栏和其他所有内容都会消失,但窗口在屏幕顶部有一个黑色区域,即标题栏的确切高度,就好像它被保留了一样。如上面代码所示,如果我不对两个调用中的任何一个进行注释,屏幕就会剧烈闪烁。我相信它在黑色区域存在和不存在之间来回闪烁,但很难分辨。这种闪烁也会损坏视频内存,因为我在窗口标题栏(至少在不同的应用程序中)中得到了持久的伪影,并且有一次,“开始”菜单中的登录图片被我的OpenGL纹理替换了。

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

    1 回复  |  直到 15 年前
        1
  •  1
  •   Stefan    15 年前

    如果要全屏显示,不要将窗口最大化。 使用 this approach 相反。