Как ограничить изменение размера кадра в зависимости от размера представления?MFC документ / вид архитектуры - PullRequest
1 голос
/ 18 января 2012

Архитектура документа / представления 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 ())?Так что, может быть, должно быть какое-то более естественное решение?

1 Ответ

1 голос
/ 19 января 2012

В вашем CMyFckinView обработайте сообщение, которое надежно отправлено, когда предварительный просмотр печати закрыт, и затем отправьте пользовательское сообщение на мэйнфрейм, который вызовет ваш код «force minmax».Возможно WM_FOCUS или WM_ACTIVATE?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...