TN040: MFC/OLE In-Place Größenänderung und Zoom

Dieser Hinweis diskutieren über Fragen in Bezug auf Bearbeitung direkte und wie ein Server sollte richtig Zoomen zu erreichen und in-Place-Größenänderung. Mit vor-Ort-Aktivierung das WYSIWYG-Konzept stammt noch einen Schritt weiter in die Container und Server miteinander zusammenzuarbeiten, und insbesondere die OLE-Spezifikation in viel die gleiche Weise interpretieren.

Aufgrund der engen Interaktion zwischen einem Container und einem Server, der direkte Aktivierung unterstützt gibt es eine Reihe von Erwartungen an die Endbenutzer, der beibehalten werden sollte:

Hinweis&Nbsp;  Da direkte Aktivierung gilt nur für Objekte, die eingebettet sind (nicht verbunden), gilt die Zoomen nur für eingebettete Objekte. Sie sehen in COleServerDoc und COleServerItem APIs, die für zoomen verwendet werden. Der Grund für diese Dichotomie ist, dass nur die Funktionen, die für sowohl verknüpfte als auch eingebettete Elemente gelten in COleServerItem (Dadurch können Sie eine gängige Implementierung haben) und in die Klasse COleServerDoc befinden sich Funktionen, die nur für eingebettete Objekte gültig sind (aus Sicht des Servers ist das Dokument , das eingebettet ist).

Die meisten der Belastung liegt auf der Server-Implementierung, dass der Server muss den Container Zoomfaktor bewusst sein und seine Bearbeitung Schnittstelle entsprechend ändern. Aber wie bestimmt der Server den Zoom-Faktor, den der Container verwendet?

MFC-Unterstützung für Zoomen

Der aktuelle Zoomfaktor kann bestimmt werden, durch Aufrufen von COleServerDoc::GetZoomFactor. Diese aufrufen, wenn das Dokument nicht in-Place aktiv ist führt immer ein 100 % Zoom-Faktor (oder 1:1-Verhältnis). Nennen es, während in-Place aktiv, etwas anderes als 100 zurückgeben kann %.

Ein Beispiel der richtig Zoomen finden Sie im MFC-OLE-Beispiel HIERSVR. HIERSVR Einzoomen wird erschwert durch die Tatsache, dass es Text anzeigt – und Text, in der Regel nicht in einer linearen Weise (Hinweise, typografische Konventionen, breiten und Höhen alle erschweren die Sache Design) skalierbar. Dennoch HIERSVR ist eine angemessene Referenz für Zoomen korrekt implementieren, und so ist das MFC-Tutorial Skizze (Schritt 7).

COleServerDoc::GetZoomFactor bestimmt den Zoomfaktor, basierend auf einer Reihe von verschiedenen Metriken zur Verfügung entweder aus dem Container oder zur Durchführung von COleServerItem und COleServerDoc Klassen. Kurz gesagt, wird der aktuelle Zoomfaktor nach folgender Formel bestimmt

Positionieren Sie Rechteck (PR) / Container Maße (CE)

Die POSITION-Rechteck wird durch die Container bestimmt. Es ist an den Server während der direkten Aktivierung zurückgegeben Wenn COleClientItem::OnGetItemPosition aufgerufen wird und aktualisiert wird, wenn der Container der Server COleServerDoc::OnSetItemRects (mit einem Aufruf von COleClientItem::SetItemRects Ruft).

Der CONTAINER ist etwas komplexer zu berechnen. Wenn der Container COleServerItem::OnSetExtent (mit einem Aufruf von COleClientItem::SetExtent), dann das Ausmaß der CONTAINER aufgerufen hat ist dieser Wert in Pixel, die basierend auf der Anzahl der Pixel pro logischen Zoll konvertiert. Wenn der Container nicht SetExtent bezeichnet hat (was normalerweise der Fall ist), ist das Ausmaß der CONTAINER die Größe von COleServerItem::OnGetExtentzurückgegeben. Also, wenn der Container nicht SetExtent aufgerufen hat, nimmt Rahmen, dass wenn es nicht der Container es mit 100 % natürlichen Umfang (die von COleServerItem::GetExtentzurückgegebenen Wert) bezeichnet haben würde. Oder anders, das Framework setzt voraus, dass der Container 100 % (nicht mehr und nicht weniger) des Elements angezeigt wird.

Es ist wichtig zu beachten, dass obwohl COleServerItem::OnSetExtent und COleServerItem::OnGetExtent ähnliche Namen haben, sie nicht das gleiche Attribut des Elements bearbeiten. OnSetExtent wird aufgerufen, um den Server wissen, wie viel das Objekt im Container (unabhängig von der Zoom-Faktor) sichtbar ist und OnGetExtent wird aufgerufen, durch den Container, um die ideale Größe des Objekts zu bestimmen.

Indem Sie sich jedes der hier APIs erhalten Sie ein klareres Bild:

COleServerItem::OnGetExtent

Diese Funktion sollte die "natürliche Größe" in HIMETRIC-Einheiten des Elements zurück. Der beste Weg, um die "natürliche Größe" denken ist zu definieren als die Größe, die es beim Drucken erscheinen mag. Die Größe, hier wird für ein bestimmtes Element-Inhalt (ähnlich wie die Metadatei, die für ein bestimmtes Element konstant ist) konstant zurückgegeben. Diese Größe wird nicht geändert, wenn Zoomen auf das Element angewendet wird. Es wird in der Regel nicht geändert, wenn der Container dem Element mehr oder weniger Raum gibt durch Aufrufen von OnSetExtent. Ein Beispiel einer Änderung möglicherweise, die von einer einfachen Text-Editor mit keine "Spanne" Funktion, die Text basierend auf den letzten Umfang per Container verpackt. Wenn ein Server ändert, sollte der Server wahrscheinlich das OLEMISC_RECOMPOSEONRESIZE-Bit in der Systemregistrierung festlegen (siehe die OLE-SDK-Dokumentation für weitere Informationen zu dieser Option).

COleServerItem::OnSetExtent

Diese Funktion wird aufgerufen, wenn der Container "mehr oder weniger" des Objekts zeigt. Den meisten Containern werden dies überhaupt nicht aufrufen. Die Standardimplementierung speichert den letzten Wert aus dem Container in 'M_sizeExtent', die in COleServerDoc::GetZoomFactor verwendet wird, wenn Sie den oben beschriebenen CONTAINER Maße-Wert berechnen.

COleServerDoc::OnSetItemRects

Diese Funktion wird aufgerufen, nur, wenn das Dokument in-Place aktiv ist. Es wird aufgerufen, wenn der Container Position des Elements oder der Ausschnitt auf das Element angewendet aktualisiert. Das Rechteck POSITION bietet wie oben beschrieben den Zähler für die Berechnung der Zoom-Faktor. Ein Server kann verlangen, dass die Position des Elements geändert werden, indem Sie COleServerDoc::RequestPositionChangeaufrufen. Der Container kann oder reagiert möglicherweise nicht mehr auf diese Anforderung durch den Aufruf OnSetItemRects (mit einem Aufruf von COleServerItem::SetItemRects).

COleServerDoc::OnDraw

Es ist wichtig zu erkennen, dass die Metadatei erstellt durch Überschreiben der COleServerItem::OnDraw genau die gleiche Metafile, unabhängig von der aktuellen Zoomfaktor produziert. Der Container wird die Metadatei entsprechend skaliert. Dies ist eine wichtige Unterscheidung zwischen OnDraw der Ansicht und das Serverelement OnDraw. Die Griffe Ansicht zoomen, erstellt das Element nur eine Zoombare Metafile und überlässt es den Container zu tun, die entsprechenden Zoomen.

Der beste Weg um sicherzustellen, dass Ihre Server korrekt verhält ist die Umsetzung des COleServerDoc::GetZoomFactor zu verwenden, wenn Ihr Dokument in-Place aktiv ist.

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

MFC implementiert vollständig die Größenänderung vor-Ort-Schnittstelle in der OLE-2-Spezifikation beschrieben. Die Benutzer-Schnittstelle wird von der COleResizeBar -Klasse, eine benutzerdefinierte Meldung WM_SIZECHILDund besondere Behandlung dieser Nachricht in COleIPFrameWnd unterstützt.

Sie können implementieren unterschiedliche Handhabung dieser Nachricht als was über das Framework bereitgestellt wird. Wie oben beschrieben, der Rahmen lässt die Ergebnisse der in-Place-Größe bis zu den Container – der Server reagiert auf die Änderung in der Zoom-Faktor. Wenn der Container reagiert durch Festlegen der beiden CONTAINER-Maße und POSITION Rechteck während der Verarbeitung der COleClientItem::OnChangeItemPosition (aus einem Aufruf von COleServerDoc::RequestPositionChangegenannt), dann der in-Place Größe führt "mehr oder weniger" des Elements im Bearbeitungsfenster angezeigt. Wenn der Container reagiert, indem nur das Rechteck POSITION während der Verarbeitung des COleClientItem::OnChangeItemPositionfestlegen, wird der Zoomfaktor ändern und das Element wird angezeigt "vergrößert oder verkleinert."

Ein Serversteuerelement kann (zu einem gewissen Grad) was passiert während dieser Verhandlungen. Eine Kalkulationstabelle, könnte z. B. um mehr oder weniger Zellen anzuzeigen, wenn der Benutzer die Fenstergröße beim Bearbeiten des Elements in-Place-wählen. Ein Textverarbeitungsprogramm könnte die "Seitenränder" ändern, so dass sie die gleichen wie die Fenster sind und umbrochen den Text der neuen Marge wird Elektr. Implementieren diese Server durch ändern den natürlichen Umfang (die von COleServerItem::OnGetExtentzurückgegebene Größe) Wenn die Größenänderung erfolgt. Dies bewirkt, dass das Rechteck POSITION sowohl CONTAINER soweit, um den gleichen Betrag, was zu der gleichen Zoomfaktor, aber einen größeren oder kleineren Anzeigebereich ändern. Darüber hinaus, mehr oder weniger des Dokuments werden sichtbar in der Metadatei von OnDrawgeneriert. In diesem Fall ist das Dokument selbst ändern, wenn der Benutzer das Element, statt nur den Anzeigebereich ändert.

Sie können Implementieren benutzerdefinierter Größenanpassung und Nutzen von COleResizeBar durch Überschreiben der WM_SIZECHILD -Nachricht in der Klasse von COleIPFrameWnd bereitgestellte Benutzeroberfläche. Weitere Informationen zu den Besonderheiten des WM_SIZECHILDfinden Sie unter technischer Hinweis 24.

Technische Hinweise von &Nummer |nbsp; Technische Hinweise nach Kategorie

Index