首页 文章

在辅助监视器中恢复到最大化时,MFC Feature Pack应用程序的大小错误

提问于
浏览
0

我注意到,在辅助监视器中从最小化恢复到最大化时,使用MFC Feature Pack(VS2008)开发的应用程序的大小就像它们在主监视器中一样,为Windows任务栏留出空间 .

我在我自己的程序中发现了这种行为,但在MFC Feature Pack示例中也是如此,所以我猜这是MFC Feature Pack类中的一些错误 .

因此,例如,我构建Visual Studio示例,运行它,将其移动到辅助监视器,在那里最大化它,最小化它,恢复它,我得到这个:

Check the gap under the window on the secondary monitor

这有什么已知的解决方法吗?它已经解决了更新版本的MFC?

UPDATE:

它似乎只有在辅助监视器位于主监视器的右侧时才会发生,但如果它位于左侧监视器的右侧则不会发生 .

1 回答

  • 2

    回答我自己的问题,以备将来参考:

    经过进一步的研究,我发现它似乎是一个bug并且has already been reported to Microsoft

    这是由于CFrameImpl :: OnGetMinMaxInfo使用窗口矩形来确定应该使用哪个监视器来确定最大化的大小 . 当窗口最小化时,GetWindowRect返回的矩形的左上角为(-32000,-32000) . 当此矩形用于确定监视器时,将返回最左侧的监视器 .

    它说“已解决 - 它将无法修复”,所以我找了一个解决方法,发现这似乎有效:

    void CMainFrame::OnSize(UINT nType, int cx, int cy)
    {
        CMDIFrameWndEx::OnSize(nType, cx, cy);
    
        if (nType == SIZE_MAXIMIZED)
        {
            CRect rectWindow;
            GetWindowRect(&rectWindow);
    
            CRect rect(0, 0, 0, 0);
    
            MONITORINFO mi;
            mi.cbSize = sizeof(MONITORINFO);
    
            if (GetMonitorInfo(MonitorFromWindow(this->m_hWnd, MONITOR_DEFAULTTONEAREST), &mi))
            {
                rect = mi.rcWork;
            }
            else
            {
                ::SystemParametersInfo(SPI_GETWORKAREA, 0, &rect, 0);
            }
    
            MoveWindow(rect);
        }
    }
    

相关问题