Freigeben über


TN040: MFC/OLE direkte Größenanpassung und Zoomen

Hinweis

Der folgende technische Hinweis wurde seit dem ersten Erscheinen in der Onlinedokumentation nicht aktualisiert. Daher können einige Verfahren und Themen veraltet oder falsch sein. Um aktuelle Informationen zu erhalten, wird empfohlen, das gewünschte Thema im Index der Onlinedokumentation zu suchen.

In diesem Hinweis werden die Probleme im Zusammenhang mit der direkten Bearbeitung und der Korrektheit der Größe eines Servers erläutert. Mit der direkten Aktivierung wird das WYSIWYG-Konzept einen Schritt weiter unternommen, da Container und Server miteinander zusammenarbeiten und insbesondere die OLE-Spezifikation auf die gleiche Weise interpretieren.

Aufgrund der engen Interaktion zwischen einem Container und einem Server, der die direkte Aktivierung unterstützt, gibt es eine Reihe von Erwartungen des Endbenutzers, die Standard tained werden sollten:

  • Die Präsentationsanzeige (die in der COleServerItem::OnDraw Außerkraftsetzung gezeichnete Metadatei) sollte genauso aussehen wie beim Zeichnen für die Bearbeitung (außer dass Bearbeitungstools nicht sichtbar sind).

  • Wenn der Container vergrößert wird, sollte auch das Serverfenster!

  • Sowohl der Container als auch der Server sollten Objekte zum Bearbeiten mit denselben Metriken anzeigen. Dies bedeutet, dass ein Zuordnungsmodus basierend auf der Anzahl der logischen Pixel pro Zoll verwendet wird , nicht physische Pixel pro Zoll, wenn auf dem Anzeigegerät gerendert wird.

Hinweis

Da die direkte Aktivierung nur für Eingebettete (nicht verknüpfte) Elemente gilt, gilt das Zoomen nur für eingebettete Objekte. Es werden SOWOHL APIs als auch COleServerDocCOleServerItem apIs angezeigt, die zum Zoomen verwendet werden. Der Grund für diese Dichotomie ist, dass sich nur Funktionen befinden, die sowohl für verknüpfte als auch für eingebettete Elemente COleServerItem gültig sind (dies ermöglicht Es Ihnen, eine gemeinsame Implementierung zu haben) und Funktionen, die nur für eingebettete Objekte gültig sind, in der COleServerDoc Klasse (aus der Perspektive des Servers ist es das Dokument , das eingebettet ist).

Die meisten Lasten werden auf den Serverimplementierer gelegt, da der Server den Zoomfaktor des Containers kennen und seine Bearbeitungsschnittstelle entsprechend ändern muss. Wie bestimmt der Server jedoch den Zoomfaktor, den der Container verwendet.

MFC-Unterstützung für Zoomen

Der aktuelle Zoomfaktor kann durch Aufrufen COleServerDoc::GetZoomFactorbestimmt werden. Das Aufrufen dieses Dokuments, wenn das Dokument nicht aktiv ist, führt immer zu einem Zoomfaktor von 100 % (oder einem Verhältnis von 1:1). Das Aufrufen während der aktiven In-Situ-Funktion kann etwas anderes als 100 % zurückgeben.

Ein Beispiel zum korrekten Zoomen finden Sie im MFC OLE-Beispiel HIERSVR. Das Zoomen in HIERSVR ist kompliziert durch die Tatsache, dass text angezeigt wird, und Text wird im Allgemeinen nicht linear skaliert (Hinweise, typografische Konventionen, Designbreiten und Höhen erschweren die Angelegenheit). Dennoch ist HIERSVR ein vernünftiger Verweis für die korrekte Implementierung von Zoomen, und so ist das MFC-Lernprogramm SCRIBBLE (Schritt 7).

COleServerDoc::GetZoomFactor bestimmt den Zoomfaktor basierend auf einer Reihe verschiedener Metriken, die entweder aus dem Container oder aus der Implementierung Ihrer COleServerItem und COleServerDoc Klassen verfügbar sind. Kurz gesagt wird der aktuelle Zoomfaktor durch die folgende Formel bestimmt:

Position Rectangle (PR) / Container Extent (CE)

Das POSITIONSRECHTECK wird vom Container bestimmt. Sie wird während der direkten Aktivierung COleClientItem::OnGetItemPosition beim Aufruf an den Server zurückgegeben und aktualisiert, wenn der Container die Server COleServerDoc::OnSetItemRects aufruft (mit einem Aufruf von COleClientItem::SetItemRects).

Der CONTAINER-UMFANG ist etwas komplexer zu berechnen. Wenn der Container aufgerufen COleServerItem::OnSetExtent wurde (mit einem Aufruf von COleClientItem::SetExtent), ist der CONTAINER EXTENT dieser Wert basierend auf der Anzahl der Pixel pro logischem Zoll in Pixel konvertiert. Wenn der Container "SetExtent" (in der Regel der Fall) nicht aufgerufen hat, ist container EXTENT die zurückgegebene COleServerItem::OnGetExtentGröße. Wenn der Container also "SetExtent" nicht aufgerufen hat, geht das Framework davon aus, dass der Container es mit 100 % des natürlichen Umfangs (der zurückgegebene COleServerItem::GetExtentWert) aufgerufen hätte. Anders angegeben, geht das Framework davon aus, dass der Container 100 % (nicht mehr, nicht weniger) des Elements anzeigt.

Es ist wichtig zu beachten, dass sie dasselbe Attribut des Elements nicht bearbeiten, obwohl COleServerItem::OnSetExtent sie ähnliche Namen haben und COleServerItem::OnGetExtent ähnliche Namen haben. OnSetExtent wird aufgerufen, um dem Server mitzuteilen, wie viel des Objekts im Container (unabhängig vom Zoomfaktor) sichtbar ist und OnGetExtent vom Container aufgerufen wird, um die ideale Größe des Objekts zu bestimmen.

Wenn Sie sich die einzelnen APIs ansehen, können Sie ein klareres Bild erhalten:

COleServerItem::OnGetExtent

Diese Funktion sollte die "natürliche Größe" in HIMETRIC-Einheiten des Elements zurückgeben. Die beste Möglichkeit, die "natürliche Größe" zu betrachten, besteht darin, sie als größe zu definieren, die beim Drucken angezeigt werden kann. Die hier zurückgegebene Größe ist eine Konstante für einen bestimmten Elementinhalt (ähnlich der Metadatei, die für ein bestimmtes Element konstant ist). Diese Größe ändert sich nicht, wenn das Zoomen auf das Element angewendet wird. Es ändert sich in der Regel nicht, wenn der Container das Element durch Aufrufen OnSetExtentmehr oder weniger Platz erhält. Ein Beispiel für eine Änderung kann die eines einfachen Text-Editors ohne "Margin"-Funktion sein, die Text basierend auf dem letzten Umfang, der vom Container gesendet wurde, umschlossen hat. Wenn sich ein Server ändert, sollte der Server wahrscheinlich das OLEMISC_RECOMPOSEONRESIZE Bit in der Systemregistrierung festlegen (weitere Informationen zu dieser Option finden Sie in der OLE SDK-Dokumentation).

COleServerItem::OnSetExtent

Diese Funktion wird aufgerufen, wenn der Container "mehr oder weniger" des Objekts anzeigt. Die meisten Container rufen dies überhaupt nicht auf. Die Standardimplementierung speichert den letzten Wert, der vom Container in "m_sizeExtent" empfangen wurde, der beim Berechnen des oben beschriebenen CONTAINER-ERWEITERUNGswerts verwendet COleServerDoc::GetZoomFactor wird.

COleServerDoc::OnSetItemRects

Diese Funktion wird nur aufgerufen, wenn das Dokument aktiv ist. Sie wird aufgerufen, wenn der Container entweder die Position des Elements oder das auf das Element angewendete Clipping aktualisiert. Das POSITIONSRECHTECK stellt, wie oben beschrieben, den Zähler für die Berechnung des Zoomfaktors bereit. Ein Server kann anfordern, dass die Elementposition durch Aufrufen COleServerDoc::RequestPositionChangegeändert wird. Der Container kann oder nicht auf diese Anforderung antworten, indem er (mit einem Anruf anCOleServerItem::SetItemRects) aufruft OnSetItemRects .

COleServerDoc::OnDraw

Es ist wichtig zu erkennen, dass die Metadatei, die durch Überschreibung COleServerItem::OnDraw erstellt wurde, genau dieselbe Metadatei erzeugt, unabhängig vom aktuellen Zoomfaktor. Der Container skaliert die Metadatei entsprechend. Dies ist ein wichtiger Unterschied zwischen den Ansichten OnDraw und dem Serverelement OnDraw. Die Ansicht behandelt das Zoomen, das Element erstellt einfach eine zoombare Metadatei und lässt sie bis zum Container, um die entsprechende Zoomfunktion zu erledigen.

Die beste Möglichkeit, zu gewährleisten, dass sich Ihr Server ordnungsgemäß verhält, besteht darin, die Implementierung COleServerDoc::GetZoomFactor zu verwenden, wenn Ihr Dokument aktiv ist.

MFC-Unterstützung für direkte Größenänderung

MFC implementiert die direkte Größenänderungsschnittstelle vollständig, wie in der OLE 2-Spezifikation beschrieben. Die Benutzeroberfläche wird von der COleResizeBar Klasse, einer benutzerdefinierten Nachricht WM_SIZECHILD und einer speziellen Behandlung dieser Nachricht in COleIPFrameWndunterstützt.

Möglicherweise möchten Sie eine andere Behandlung dieser Nachricht implementieren als das, was vom Framework bereitgestellt wird. Wie oben beschrieben, lässt das Framework die Ergebnisse einer direkten Größenänderung bis zum Container zurück – der Server reagiert auf die Änderung des Zoomfaktors. Wenn der Container reagiert, indem er sowohl das CONTAINER-ERWEITERUNGs- als auch das POSITIONSRECHTECK während der Verarbeitung seiner COleClientItem::OnChangeItemPosition (als Ergebnis eines Aufrufs COleServerDoc::RequestPositionChangeaufgerufen) festlegt, führt die direkte Größenänderung dazu, dass im Bearbeitungsfenster "mehr oder weniger" des Elements angezeigt wird. Wenn der Container reagiert, indem nur das POSITIONSRECHTECK während der Verarbeitung COleClientItem::OnChangeItemPositionfestgelegt wird, ändert sich der Zoomfaktor, und das Element wird "vergrößert oder verkleinert" angezeigt.

Ein Server kann (bis zu einem gewissen Grad) steuern, was während dieser Aushandlung geschieht. Eine Kalkulationstabelle kann z. B. festlegen, dass mehr oder weniger Zellen angezeigt werden, wenn der Benutzer die Größe des Fensters beim Bearbeiten des Elements an der Stelle ändert. Ein Textverarbeitungsprogramm kann sich entscheiden, die "Seitenränder" so zu ändern, dass sie mit dem Fenster identisch sind und den Text an den neuen Rand umschreiben. Server implementieren dies, indem sie den natürlichen Umfang (die von COleServerItem::OnGetExtent) zurückgegebene Größe ändern, wenn die Größenänderung erfolgt. Dies führt dazu, dass sich sowohl das POSITIONSRECHTECK als auch der CONTAINERBEREICH um denselben Wert ändern, was zu demselben Zoomfaktor, aber einem größeren oder kleineren Anzeigebereich führt. Darüber hinaus wird mehr oder weniger des Dokuments in der metadatei angezeigt, die von OnDraw. In diesem Fall ändert sich das Dokument selbst, wenn der Benutzer die Größe des Elements und nicht nur den Anzeigebereich ändert.

Sie können benutzerdefinierte Größenänderungen implementieren und die Benutzeroberfläche COleResizeBar weiterhin nutzen, indem Sie die WM_SIZECHILD Nachricht in Ihrer COleIPFrameWnd Klasse überschreiben. Weitere Informationen zu den Besonderheiten von WM_SIZECHILD finden Sie in technischem Hinweis 24.

Siehe auch

Technische Hinweise – nach Nummern geordnet
Technische Hinweise – nach Kategorien geordnet