Visual c++ 如何限制基于视图的帧大小调整';s码?MFC文档/视图体系结构

Visual c++ 如何限制基于视图的帧大小调整';s码?MFC文档/视图体系结构,visual-c++,mfc,Visual C++,Mfc,MFC文档/视图体系结构,sdi(更准确地说是多个顶级窗口) 在我的视图类中,我使用SetScrollSizes()设置我的“游乐场”(即逻辑空间);然后我想将最大帧窗口大小限制为视图的最大大小 以下是我正在做的事情,但我认为可能有更好的解决方案,请提供建议: 我正在CMainFrame中实现OnGetMinMaxInfo()。在那里,我尝试获取活动视图的滚动大小,并适当地设置lpMMI->ptMaxTrackSize。代码如下: void CMainFrame::OnGetMinMaxInfo

MFC文档/视图体系结构,sdi(更准确地说是多个顶级窗口)

在我的视图类中,我使用SetScrollSizes()设置我的“游乐场”(即逻辑空间);然后我想将最大帧窗口大小限制为视图的最大大小

以下是我正在做的事情,但我认为可能有更好的解决方案,请提供建议:

我正在CMainFrame中实现OnGetMinMaxInfo()。在那里,我尝试获取活动视图的滚动大小,并适当地设置lpMMI->ptMaxTrackSize。代码如下:

void CMainFrame::OnGetMinMaxInfo(MINMAXINFO* lpMMI)
{
    // Call base version:

    CFrameWndEx::OnGetMinMaxInfo(lpMMI);

    // Get active view:

    CScrollView *pScrollView = (CScrollView *)GetActiveView();

    if (pScrollView && pScrollView->IsKindOf(RUNTIME_CLASS(CMyFckinView)))
    {
        // Get total size of playground:

        CSize sizePlayground = pScrollView->GetTotalSize();

        // Test if the size is non-zero, i.e. there is at least one node displayed:

        if (sizePlayground.cx && sizePlayground.cy/* && !IsPrintPreview()*/)
        {
            // Set maximum window size to match our playground size:

            CRect rectClient, rectWindow;

            pScrollView->GetClientRect(&rectClient);
            this->GetWindowRect(&rectWindow);

            if (rectWindow.top > -5000 && rectWindow.left > -5000) // Avoid when minimized...
            {
                lpMMI->ptMaxTrackSize.x = sizePlayground.cx + (rectWindow.Width() -  rectClient.Width());
                lpMMI->ptMaxTrackSize.y = sizePlayground.cy + (rectWindow.Height() - rectClient.Height());

                return;
            }
        }
    }
}
这是可行的,但有一个问题:当显示打印预览(标准MFC打印预览)时,我显然希望允许自由调整窗口大小,因此我使用运行时信息GetActiveView()->IsKindOf(…)来确定活动视图实际上是我的视图,而不是打印预览的视图(即CPreviewViewEx)。但当我关闭打印预览时,不会调用OnGetMinMaxInfo,因此我无法再次根据视图调整帧大小。一旦我移动窗口,OnGetMinMaxInfo将再次被调用并正确调整帧大小,但不手动移动窗口,旧的大小(打印预览的大小为)将被保留,并有丑陋的伪影

我能做什么?基本上,如果我能捕捉到打印预览关闭的时刻,我可以使用以下技巧:

// Trigger the WM_MINMAXINFO message:

CFrameWnd *pFrame = GetParentFrame();
RECT rectWindow;
pFrame->GetWindowRect(&rectWindow);
pFrame->MoveWindow(&rectWindow);
但我不知道如何捕捉打印预览关闭


我试图完成的似乎相当标准:谁会希望框架窗口的大小大于视图的逻辑大小(由SetScrollSizes()设置)?因此,可能会有更自然的解决方案?

在您的
CMyFckinView
中,处理打印预览关闭时可靠发送的消息,然后将用户消息发布到主机,这将触发您的“强制最小值”代码。也许
WM\u FOCUS
WM\u ACTIVATE

在您的
CMyFckinView
中,处理打印预览关闭时可靠发送的消息,然后将用户消息发布到主机,这将触发您的“强制最小值”代码。可能是
WM\u FOCUS
WM\u ACTIVATE

从我的视图的OnSize处理程序中触发WM\u MINMAXINFO for frame with MoveWindow实现了该技巧。从我的视图的OnSize处理程序中触发WM\u MINMAXINFO for frame with MoveWindow实现了该技巧。