0

MFC Feature Pack (VS2008) を使用して開発されたアプリケーションが、セカンダリ モニターで最小化から最大化に復元されると、プライマリ モニターに表示されているかのようにサイズが変更され、Windows タスクバー用のスペースが空くことに気付きました。

私自身のプログラムだけでなく、MFC Feature Pack のサンプルでもこの​​動作を見つけたので、MFC Feature Pack クラスのバグだと思います。

たとえば、Visual Studio のサンプルをビルドして実行し、セカンダリ モニターに移動して最大化し、最小化して元に戻すと、次のようになります。

セカンダリモニターで窓の下の隙間を確認

これに対する既知の回避策はありますか? 最近のバージョンの MFC では解決されましたか?

アップデート:

セカンダリ モニターがメイン モニターの右側にある場合にのみ発生するようですが、左側にある場合は発生しません。

4

1 に答える 1

2

将来の参考のために、私自身の質問に答えます:

さらに調査したところ、これはバグのようであり、すでに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);
    }
}
于 2012-05-14T14:03:42.033 に答える