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

Posted

技术标签:

【中文标题】MFC Feature Pack 应用程序在辅助监视器中恢复为最大化时大小错误【英文标题】:MFC Feature Pack applications have wrong size when restored to maximized in secondary monitor 【发布时间】:2012-05-14 11:03:19 【问题描述】:

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

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

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

是否有任何已知的解决方法?更新版本的 MFC 是否已解决此问题?

更新:

这似乎只有在辅助显示器位于主显示器右侧时才会发生,但如果它位于左侧则不会。

【问题讨论】:

【参考方案1】:

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

经过进一步研究,我发现它似乎是一个错误和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);
    

【讨论】:

这个解决方案有一个问题:如果Windows任务栏处于自动隐藏模式,当鼠标悬停在其上时,最大化的应用程序不会留下任务栏显示所需的2像素间隙,所以任务栏不会显示

以上是关于MFC Feature Pack 应用程序在辅助监视器中恢复为最大化时大小错误的主要内容,如果未能解决你的问题,请参考以下文章

如何在 vc 2008 上使用“Visual C++ 2008 Feature Pack”?

我在哪里可以找到 Series 40 第 5 版 SDK,Feature Pack 1 Lite 以供下载?

将 MainApp 从 MFC 应用程序转换为辅助对话框

Azure Pack 是不是支持使用 WASABi 自动缩放 Web 和辅助角色?

在哪里可以找到 iOS“配音”功能的 emoji 辅助功能文本?

MFC_Thread