Архитектура документа / представления MFC, sdi (точнее, несколько окон верхнего уровня).
В своем классе просмотра я установил свою «игровую площадку» (т. Е. Логическое пространство) с помощью SetScrollSizes ();Затем я хочу ограничить максимальный размер окна фрейма максимальным размером представления.
Вот что я делаю, но я думаю, что может быть лучшее решение, пожалуйста, совет:
Яреализация OnGetMinMaxInfo () в моем CMainFrame.Там я пытаюсь получить размеры прокрутки в активном представлении и соответственно установить 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 ())?Так что, может быть, должно быть какое-то более естественное решение?