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

MFC功能包应用程序在辅助监视器中恢复为最大化时大小错误,mfc,mfc-feature-pack,Mfc,Mfc Feature Pack,我注意到,使用MFC功能包(VS2008)开发的应用程序在辅助监视器中从最小化恢复到最大化时,其大小与主监视器中的大小相同,为Windows任务栏留出了空间 我在自己的程序中发现了这种行为,但在MFC功能包示例中也发现了这种行为,所以我猜这是MFC功能包类中的一些错误 例如,我构建Visual Studio示例,运行它,将它移动到辅助监视器,在那里最大化它,最小化它,恢复它,我得到以下结果: 是否有任何已知的解决方法?MFC的最新版本已经解决了吗 更新: 只有当辅助监视器位于主监视器的右侧时,

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

我在自己的程序中发现了这种行为,但在MFC功能包示例中也发现了这种行为,所以我猜这是MFC功能包类中的一些错误

例如,我构建Visual Studio示例,运行它,将它移动到辅助监视器,在那里最大化它,最小化它,恢复它,我得到以下结果:

是否有任何已知的解决方法?MFC的最新版本已经解决了吗

更新:


只有当辅助监视器位于主监视器的右侧时,才会发生这种情况,但如果辅助监视器位于左侧,则不会发生这种情况。

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

经过进一步研究,我发现这似乎是一个bug,并且:

这是由于cframeinpl::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像素间隙,因此任务栏将不会显示