|
Seit VC++ 5.0 wird die Druckvorschau nicht mehr im MDI-Rahmen angezeigt, sondern sie ist ein MDI-Child. Daraus resultiert ein kleinerer Vorschaubereich, dessen Fläche nochmals verkleinert wird, wenn angedockte Toolbars verwendet werden und das Benutzerinterface während der Vorschau voll funktionsfähig ist. Die eigentliche Ursache besteht in der Berechnung der Fenstergröße. Diese ergibt sich unter V 4.2 wie folgt:
BOOL CView::DoPrintPreview(UINT nIDResource,
CView* pPrintView,
CRuntimeClass* pPreviewViewClass,
CPrintPreviewState* pState)
{
...
CFrameWnd* pParent = (CFrameWnd*)AfxGetThread()->m_pMainWnd;
ASSERT_VALID(pParent);
ASSERT_KINDOF(CFrameWnd, pParent);
...
}
Für VC++ 5.0 lautet der entsprechende Code:
BOOL CView::DoPrintPreview(UINT nIDResource,
CView* pPrintView,
CRuntimeClass* pPreviewViewClass,
CPrintPreviewState* pState)
{
...
CFrameWnd* pParent;
CWnd* pNaturalParent = pPrintView->GetParentFrame();
pParent = DYNAMIC_DOWNCAST(CFrameWnd, pNaturalParent);
if (pParent == NULL || pParent->IsIconic())
pParent = (CFrameWnd*)AfxGetThread()->m_pMainWnd;
...
}
Um zur alten Darstellung zurück zu gelangen, sind mehrere Schritte notwendig. Zunächst muß eine eigene DoPrintPreview() in der MDI View-Klasse implementiert werden. Im großen und ganzen ist die neue Methode eine Kopie der CView::DoPrintPreview() mit zwei Änderungen: Anstelle des MDI-Child verwendet die Methode den MDT-Rahmen.
BOOL CMDIView::DoPrintPreview(UINT nIDResource,
CView* pPrintView,
CRuntimeClass* pPreviewViewClass,
CPrintPreviewState* pState)
{
...
CFrameWnd* pParent = (CFrameWnd*)AfxGetThread()->m_pMainWnd;
ASSERT_VALID(pParent);
ASSERT_KINDOF(CFrameWnd, pParent);
Des weiteren ist das MDI-Child zu deaktivieren und das gewünschte Menü anzuzeigen. Dazu ist als erstes das Originalmenü zu sichern...
CChildFrame *pChildFrame = DYNAMIC_DOWNCAST (
CChildFrame, pParent->GetActiveFrame());
if (pChildFrame)
{
HMENU hMenuShared = pChildFrame->GetSharedMenu ();
...bevor das während der Vorschau gewünschte Menü angezeigt oder das Menü auf NULL gesetzt wird.
pChildFrame->SetSharedMenu (NULL);
Das Deaktivieren des MDI-Childs erfolgt über den Aufruf:
pChildFrame->SendMessage (WM_MDIACTIVATE, 0, 0);
Abschließend wird das gemeinsam benutzte Menü restauriert.
pChildFrame->SetSharedMenu (hMenuShared);
}
...
}
Als nächster Schritt ist eine Ableitung von CPreviewView zu bilden, da in CView::DoPrintPreview() viele geschützte Member CPreviewView benutzt werden, was aber in der neuen Methode DoPrintPreview() nicht mehr möglich ist.
Eine mögliche Lösung für dieses Problem besteht darin, eine Klasse CMDIView als friend von CMyPreviewView zu deklarieren.
|