MFC doc / view架构,sdi(更准确地说是多个顶级窗口)。
在我的视图类中,我使用SetScrollSizes()设置我的“playground”(即逻辑空间);然后我想将最大帧窗口大小限制为视图的最大大小。
这是我正在做的事情,但我认为可能有更好的解决方案,请建议:
我正在我的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(...)来确定该活动视图实际上是我的视图,而不是print-preview的视图(这是CPreviewViewEx)。但是当我关闭打印预览时,OnGetMinMaxInfo没有被调用,所以我无法再根据我的视图调整帧大小。一旦我移动窗口OnGetMinMaxInfo再次被调用并正确调整帧大小,但没有手动移动窗口旧尺寸(打印预览的大小)保留并具有丑陋的工件。
我该怎么办?基本上如果我可以捕捉打印预览关闭的那一刻,我可以使用以下技巧:
// Trigger the WM_MINMAXINFO message:
CFrameWnd *pFrame = GetParentFrame();
RECT rectWindow;
pFrame->GetWindowRect(&rectWindow);
pFrame->MoveWindow(&rectWindow);
但我不知道如何捕获打印预览关闭。
我想要实现的目标看起来非常标准:谁希望框架窗口的大小调整大于视图的逻辑大小(由SetScrollSizes()设置)?那么应该有一些更自然的解决方案吗?
答案 0 :(得分:1)
在CMyFckinView
中,处理关闭打印预览时可靠发送的消息,然后将用户消息发布到主机上,这将触发“force minmax”代码。可能是WM_FOCUS
或WM_ACTIVATE
?