Freigeben über


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

HinweisHinweis

Im Folgenden technischen Hinweis ist nicht aktualisiert wurde, seitdem er erstmals in der Onlinedokumentation enthalten waren.Folglich können mehrere Prozeduren und Themen veraltet oder falsch.Die aktuellsten Informationen wird empfohlen, zum Thema Onlinedokumentations im Index finden.

Dieser Hinweis wird die Probleme in Bezug auf die direkte Bearbeitung und wie ein Server das richtige Zoomen und direktes Ändern der Größe erreichen sollte.Wenn eine direkte Aktivierung wird das WYSIWYG-Konzept einen weiteren Schritt darin unternommen, dass Container und Server untereinander kooperieren, und insbesondere die OLE-Spezifikation auf ähnliche Weise interpretiert.

Aufgrund der schließende Interaktion zwischen einem Container und einem Server, die direkte Aktivierung dort unterstützen, müssen Sie einige Erwartungen vom Endbenutzer, der gespeichert werden soll:

  • Die Präsentations wird (die Metadatei gezeichnet COleServerItem::OnDraw in der Überschreibung) sollte identisch mit genau sehen, wenn sie für die Bearbeitung gezeichnet werden (außer dass Tools bearbeiten, sind nicht sichtbar).

  • Wenn der Container zooms, das Fenster Server sollten auch!

  • Der Container und Server, Anzeige-Objekte zur Bearbeitung mithilfe derselben Metriken wenn.Dies bedeutet mithilfe eines Zuordnungsmodus auf Grundlage der Anzahl von logischen Pixeln pro Zoll) — keine physischen Pixel pro Zoll beim Rendern auf dem Anzeigegerät.

HinweisHinweis

Da die direkte Aktivierung nur für Elemente angewendet wird, die nicht verknüpft () eingebettet sind, zoomend gilt nur für eingebettete Objekte an.Sie sehen sowohl APIs in COleServerItem und COleServerDoc, die zum Zoomen verwendet werden.Der Grund für diese Dichotomie ist, dass nur Funktionen, die für die verknüpfte und eingebettete Elemente gültig sind, in COleServerItem (diese Weise können Sie eine gängige Implementierung zu verwenden) und Funktionen, die nur für eingebettete Objekte gültig sind, sind in der COleServerDoc-Klasse sind (aus Sicht des Servers, ist es document, die eingebettet ist).

Die meisten Laden wird für die Implementierung des Servers und so platziert, dass der Server den Zoomfaktor des Containers nach Bedarf bearbeiten und dessen bewusst sein - Schnittstelle ändern muss.Aber wie bestimmt der Server den Zoomfaktor, dass der Container verwendet?

MFC-Unterstützung für das Zoomen

Der aktuelle Zoomfaktor kann bestimmt werden, indem COleServerDoc::GetZoomFactor aufruft.Durch das Aufrufen diese, wenn das Dokument nicht direkt aktiviert ist, führt immer einen Zoomfaktor 100% (oder 1:1-Verhältnis).Das Aufrufen direkt, wenn es aktiviert, wird möglicherweise etwas Anderes als 100% (null) zurück.

Ein Beispiel für die ordnungsgemäße finden Sie im Beispiel HIERSVR MFC OLE.Das Zoomen in HIERSVR wird durch die Tatsache erschwert, dem angegebenen Text anzeigt, und Text im Allgemeinen skaliert nicht in eine lineare Weise (typografischen Hinweise, dass Entwurf, Konventionen und Höhe erschweren den Stoff).Eine HIERSVR ist ein angemessener Verweis zum Implementieren und zoomen ordnungsgemäß Referenten- MFC- und ist SCRIBBLE (Schritt 7).

COleServerDoc::GetZoomFactor bestimmt den Zoomfaktor basierend auf verschiedene verfügbare Metriken vom Container oder der Implementierung der COleServerItem und COleServerDoc-Klassen.Kurz gesagt wird die aktuelle zoomfaktor durch die folgende Formel bestimmt:

Position Rectangle (PR) / Container Extent (CE)

Das POSITIONS-RECHTECK wird vom Container bestimmt.Es wird zum Server während der direkten Aktivierung zurückgegeben, wenn COleClientItem::OnGetItemPosition aufgerufen wird und wird aktualisiert, wenn der Container COleServerDoc::OnSetItemRects des Servers aufruft (mit einem Aufruf von COleClientItem::SetItemRects).

Der CONTAINER-BLOCK ist etwas komplizierter zu berechnen.Wenn der Container COleServerItem::OnSetExtent (mit einem Aufruf von COleClientItem::SetExtent) aufgerufen hat, ist der Wert dieser CONTAINER-BLOCK der Pixel auf der Grundlage der Anzahl der Pixel pro Zoll logischen konvertiert wird.Wenn der Container SetExtent nicht aufgerufen wurde (das normalerweise der Fall ist), dann ist der CONTAINER-BLOCK die Größe, die von COleServerItem::OnGetExtent zurückgegeben wurde.Wenn der Container nicht SetExtent aufgerufen hat, nimmt das Framework an, dass der Container, tat wenn er mit 100% des natürlichen Blocks aufgerufen hätte (der Wert zurückgegeben von COleServerItem::GetExtent).Gab eine andere Möglichkeit, das Framework davon ausgeht, dass der Container keine nicht mehr (100%) weniger des Elements anzeigt.

Beachten Sie unbedingt, dass, obwohl COleServerItem::OnSetExtent und COleServerItem::OnGetExtent ähnliche Namen aufweisen, sie nicht das gleiche Attribut des Elements bearbeiten.OnSetExtent wird aufgerufen, um dem Server mitzuteilen, welchen des Objekts im Container (unabhängig von den Zoomfaktor) angezeigt wird und OnGetExtent wird vom Container aufgerufen, um optimale Größe des Objekts zu bestimmen.

Mit jedem der beteiligten API berücksichtigen, können Sie ein klareres Bild abgerufen werden:

COleServerItem::OnGetExtent

Diese Funktion sollte kein "natürliche Größe" in den HIMETRIC-Einheiten des Elements zurückgeben.Die beste Möglichkeit, auf die "natürliche Größe" betrachtet wird, sie zu definieren, da die Größe kann es gedruckt wird.Die Größe, die hier zurückgegeben wird, ist für Inhalt eines bestimmten Zeitraums konstant (ähnlich wie die Metadatei, die für ein bestimmtes Element eine Konstante ist.)Diese Größe wird nicht beim Zoom auf das Element angewendet wird.normalerweise ändert sich nicht, wenn der Container das Element mehr oder weniger Platz vorhanden ist, indem er OnSetExtent aufruft.Ein Beispiel für eine Änderung kann das eines einfachen Text-Editor ohne "Rand" - Funktion, die den Text auf Grundlage den letzten - Block einband, der vom Container gesendet wurde.Wenn ein Server ändert, sollte der Server das OLEMISC_RECOMPOSEONRESIZE-Bit wahrscheinlich in der Systemregistrierung festgelegt werden (siehe Dokumentation SDK OLE Weitere Informationen über diese Option).

COleServerItem::OnSetExtent

Diese Funktion wird aufgerufen, wenn der Container "mehr oder weniger" des Objekts anzeigt.Die meisten Container rufen dies nicht vorhanden.Die Standardimplementierung speichert den letzten Wert, der vom Container in "m_sizeExtent" empfangen wird, das in COleServerDoc::GetZoomFactor verwendet wird, wenn der Wert der berechneten CONTAINER-BLOCK oben beschrieben wird.

COleServerDoc::OnSetItemRects

Diese Funktion wird nur aufgerufen, wenn das Dokument direkt aktiviert ist.Sie wird aufgerufen, wenn der Container bei der die Position oder das Clipping Elements aktualisiert, die auf das Element angewendet wurden.Das POSITIONS-RECHTECK, wie oben beschrieben, wird der Zähler für den Zoomfaktor Berechnung des bereit.Ein Server kann anfordern, dass die Position des Elements geändert wird, indem COleServerDoc::RequestPositionChange aufruft.Der Container antwortet möglicherweise auf diese Anforderung, indem er OnSetItemRects aufruft (mit einem Aufruf von COleServerItem::SetItemRects).

COleServerDoc::OnDraw

So erkennen ist wichtig, dass die Metadatei, die erstellt wird, indem von COleServerItem::OnDraw überschreibt, genau die gleiche Metadatei erzeugt, unabhängig vom aktuellen Zoomfaktor.Der Container die Metadatei skaliert.Dies ist ein wichtiger Unterschied zwischen OnDraw der Ansicht und OnDraw des Servers Elements.Die Ansicht behandelt das Zoomen, stellt das Element nur eine zoombare Metadatei her und ermöglicht es dem Container, bis das entsprechende Zoom verwenden.

Die beste Möglichkeit, versichern, dass der Server richtig verhält, ist die Implementierung von COleServerDoc::GetZoomFactor verwendet werden soll, wenn das Dokument direkt aktiviert ist.

MFC-Unterstützung für die direkte Größenanpassung

MFC implementierten Schnittstelle für die Größenanpassung der Symbolleiste vollständig, wie in der Spezifikation OLE 2 beschrieben.Die Benutzeroberfläche wird von der COleResizeBarWM_SIZECHILD für eine benutzerdefinierte Klasse, und spezielle Behandlung dieser Nachricht in COleIPFrameWnd unterstützt.

Sie können unterschiedliche Behandlung dieser Meldung als implementieren, was vom Framework bereitgestellt wird.Wie oben beschrieben, kann das Framework die Ergebnisse von änderns Größe des direkten — Container der Server reagiert auf die Änderung des Zoomfaktor.Wenn der Container reagiert, indem er festgelegt wird, führen CONTAINER-BLOCK und POSITIONS-RECHTECK während der Verarbeitung von seinem COleClientItem::OnChangeItemPosition (aufgrund eines Aufrufs von COleServerDoc::RequestPositionChange) dann die Größe des vorhandenen dem Ein- "mehr oder weniger" des Elements im Bearbeitungsfenster.Wenn der Container reagiert, indem er nur das POSITIONS-RECHTECK während der Verarbeitung von COleClientItem::OnChangeItemPosition festgelegt wird, wird der Zoomfaktor und das Element angezeigt wird, oder in "out" gezoomt.

Ein Server kann zu einem gewissen Grad steuern () was während dieser Aushandlung geschieht.Ein Arbeitsblatt, z. B. die ausgewählte möglicherweise mehr oder weniger Zellen anzuzeigen, wenn der Benutzer das Fenster während der Arbeit des direkten Elements ändert.Ein Wortprozessor ", um die ausgewählte Seitenrände" ändern, sodass sie auf die gleiche Weise wie das Fenster und das rewrap der Text bis zum neuen Rand.Dieser Server implementieren, indem sie den natürlichen - Block die Größe ändern (zurückgegeben von COleServerItem::OnGetExtent), wenn die Größenanpassung durchgeführt wird.Dadurch wird das POSITIONS-RECHTECK und den CONTAINER-BLOCK, um denselben Betrag, mit dem Ergebnis des Zoomfaktors, und zwar größer oder kleiner Sendegebiet.Darüber hinaus sind mehr oder weniger des Dokuments in der Metadatei angezeigt, die von OnDraw generiert wird.In diesem Fall wird das Dokument selbst, wenn der Benutzer die Größe des Elements geändert wird, und nicht nur das Sendegebiets.

Sie können benutzerdefinierte Größenänderung implementieren und die Benutzeroberfläche weiterhin nutzen, die von COleResizeBar bereitgestellt wird, indem Sie die WM_SIZECHILD Nachricht in der COleIPFrameWnd-Klasse überschreiben.Weitere Informationen über Merkmale der Mikroarchitekturen von WM_SIZECHILD finden Sie unter Technischer Hinweis 24.

Siehe auch

Weitere Ressourcen

Technische Hinweise durch Zahl

Technische Hinweise nach Kategorie