Sdílet prostřednictvím


TN040: MFC/OLE místní změny velikosti a přiblížení

[!POZNÁMKA]

Následující technické poznámce nebyly aktualizovány od byla poprvé zahrnuta v dokumentaci online.Proto některé postupy a témata mohou být nesprávné nebo zastaralé.Nejnovější informace je vhodné vyhledat téma zájmu v dokumentaci online index.

Tato poznámka bude projednávat otázky týkající se úpravy na místě a server by měl dosáhnout správné zvětšování a místo změny velikosti.Místní aktivace pojem WYSIWYG je přijata jeden krok dále dané kontejnery a servery vzájemně spolupracovat a zejména interpretovat specifikaci OLE velmi stejným způsobem.

Z důvodu úzké interakce mezi kontejneru a server podporující místní aktivace jsou počet očekávání od koncového uživatele, která by měla být zachována:

  • Zobrazení prezentace (metafile v COleServerItem::OnDraw přepsat) by vypadat přesně stejně jako při kreslení pro úpravy (s výjimkou, že nástroje pro úpravy nejsou viditelné).

  • Když se přiblíží kontejneru, okna serveru by příliš!

  • Objekty pro úpravy pomocí stejné metriky by zobrazení kontejneru i server.To znamená, že pomocí mapování režimu na základě počtu logické pixelů na palec – nikoli fyzických obrazových bodů na palec, při vykreslování na zobrazovacím zařízení.

[!POZNÁMKA]

Protože místní aktivace se vztahuje pouze na položky, které jsou vložené (není propojený), zvětšování platí pouze pro vložené objekty.Zobrazí rozhraní API v obou COleServerDoc a COleServerItem používané pro přiblížení.Důvod této dichotomy je, že jsou pouze funkce, které jsou platné pro připojené a vložené položky v COleServerItem (to umožňuje mít společné provádění) a funkce, které jsou platné pouze pro vložené objekty jsou umístěny v COleServerDoc třídy (z pohledu na server je document které vložené).

Většina zatížení je umístěn na rozhodující server, server musí být vědomi lupy na kontejner a upravit podle potřeby jeho úpravy rozhraní.Ale jak server určit lupy používající kontejneru?

Podpora MFC pro přiblížení

Aktuální velikost lupy lze určit voláním COleServerDoc::GetZoomFactor.Volání tohoto dokumentu není aktivní v místě vždy výsledkem bude faktor zvětšení 100 % (nebo poměru 1: 1).Volání je při aktivní v místě může vrátit něco jiného než 100 %.

Příklad správně přiblížení naleznete ukázkové MFC OLE HIERSVR.Přiblížení HIERSVR ztěžuje skutečnost, že zobrazí text a text, obecně není měřítko lineárně (Tipy, typografické, návrh šířky a výšky zkomplikovat věci).Stále, HIERSVR odkaz přiměřené pro provádění zvětšování správně, a tak je kurz MFC KLIKYHÁKY (krok 7).

COleServerDoc::GetZoomFactorUrčuje faktor zvětšení, založené na různé metriky dostupné z kontejneru nebo z provádění své COleServerItem a COleServerDoc tříd.V krátkém aktuální lupy se stanoví podle vzorce:

Position Rectangle (PR) / Container Extent (CE)

Kontejner je určen polohy obdélníku.Během aktivace na místě je vrácena na server při COleClientItem::OnGetItemPosition se nazývá a je aktualizována, když kontejner volá na serveru COleServerDoc::OnSetItemRects (s voláním COleClientItem::SetItemRects).

ROZSAH KONTEJNERU je poněkud složitější vypočítat.Pokud byla volána kontejneru COleServerItem::OnSetExtent (s voláním COleClientItem::SetExtent), pak rozsah KONTEJNERU, je tato hodnota převedena na obrazové body na základě počet pixelů na logický palec.Pokud kontejner nevolala SetExtent (což je obvykle případ) je kontejner rozsahu k velikosti vrácená z COleServerItem::OnGetExtent.Tedy pokud kontejner nevolala SetExtent, rámci předpokládá, že pokud stejně kontejner by vyzvaly je 100 % přírodní rozsahu (hodnota vrácená z COleServerItem::GetExtent).Jiným způsobem uvedeno rámci předpokládá kontejneru zobrazuje položky 100 % (ne více, ani méně).

Je důležité poznamenat, že ačkoli COleServerItem::OnSetExtent a COleServerItem::OnGetExtent mají podobné názvy jsou stejného atributu položky nesmí manipulovat.OnSetExtentaby server vědět, kolik objekt zobrazený v kontejneru (bez ohledu na velikost lupy), se nazývá a OnGetExtent se nazývá kontejnerem ideální velikost objektu.

Pohledem na každé dotyčné rozhraní API můžete získat jasnější obrázek:

COleServerItem::OnGetExtent

Tato funkce zpět v HIMETRIC jednotek zboží "fyzická velikost".Nejlépe představit "fyzická velikost" je definovat jako velikost, kterou může vypadat vytištěné.Velikost vrácené zde je konstantní obsah určitého zboží, (podobně jako metasoubor je konstantní určité položky).Tato velikost nezmění při zvětšování na položku.Obvykle nemění při kontejneru dává zboží více nebo méně místa voláním OnSetExtent.Příklad změny pravděpodobně, jednoduchý textový editor s žádné funkce "sazba", která obtékající text na základě rozsahu poslední odeslané kontejneru.Pokud server, server pravděpodobně nastaven OLEMISC_RECOMPOSEONRESIZE bit v registru systému (viz dokumentaci OLE SDK Další informace o této možnosti).

COleServerItem::OnSetExtent

Tato funkce je volána kontejneru zobrazí "více nebo méně" objektu.Většina kontejnerů není zavolá to vůbec.Výchozí implementace ukládá poslední hodnota přijatých z kontejneru "m_sizeExtent", které se používá v COleServerDoc::GetZoomFactor při výpočtu výše popsané hodnotu rozsahu KONTEJNERU.

COleServerDoc::OnSetItemRects

Tato funkce je volána pouze v případě, že dokument je aktivní v místě.Pokud kontejner aktualizuje umístění nebo ořezové použitý pro položku nazývá.POLOHU obdélníku, jak je popsáno výše, poskytuje čítači pro výpočet faktor zvětšení.Požadovat server změnit pozici položky voláním COleServerDoc::RequestPositionChange.Kontejner může nebo nemusí správně reagovat na tento požadavek voláním OnSetItemRects (s voláním COleServerItem::SetItemRects).

COleServerDoc::OnDraw

Je důležité si uvědomit, že metasoubor vytvořen přepsání COleServerItem::OnDraw vytváří přesně stejné metasoubor, bez ohledu na aktuální lupy.Kontejner změní měřítko metasoubor podle potřeby.Je důležité rozlišovat mezi v zobrazení OnDraw a položku server OnDraw.Zvětšování zobrazení úchytů zboží právě vytváří zoomable metafile a ponechá do kontejneru, proveďte příslušné přiblížení.

Nejlepší způsob, jak zajistit správné chování serveru je použití provádění COleServerDoc::GetZoomFactor -li v místě aktivního dokumentu.

Podpora MFC pro změnu velikosti na místě

MFC plně implementuje rozhraní změny velikosti v místě, jak je popsáno ve specifikaci OLE 2.Uživatelské rozhraní je podporován COleResizeBar třídy vlastní zpráva WM_SIZECHILDa zvláštní zpracování této zprávy v COleIPFrameWnd.

Můžete provádět různé zpracování této zprávy, než jakou rámcem.Podle výše uvedeného rámce opustí výsledky do kontejneru změny velikosti na místě – server odpovídá změně lupy.Pokud kontejner reaguje obě nastavení rozsahu KONTEJNERU a POLOHU obdélníku během zpracování jeho COleClientItem::OnChangeItemPosition (volána z volání COleServerDoc::RequestPositionChange) způsobí změnu velikosti v místě "více nebo méně" položky zobrazení v okně pro úpravy a potom.Pokud kontejner reaguje pouze nastavením polohy obdélníku během zpracování COleClientItem::OnChangeItemPosition, lupy se změní a budou zobrazeny položky "měřítku nebo."

Na serveru můžete řídit (do určité míry), co se stane během tohoto vyjednávání.Tabulky, může být například předsedu zobrazit více nebo méně buněk, když uživatel změní velikost okna při úpravě položky v místě.Textových procesorů může předsedu změnit "okraje stránky" a jsou stejné jako v okně text zalomit do nového okraje.Provedení těchto serverů změnou přirozené míry (velikost vrátil z COleServerItem::OnGetExtent) po ukončení změny velikosti.To způsobí OBDÉLNÍK POZICI i kontejner rozsahu změnit stejná částka vyplývající v stejné lupy, ale větší nebo menší oblasti zobrazení.Kromě, více či méně dokumentu se zobrazí v metasouboru generované OnDraw.V tomto případě samotného dokumentu je změna, když uživatel změní velikost položky namísto oblast zobrazení.

Můžete implementovat vlastní velikosti a nadále využívat uživatelské rozhraní služby COleResizeBar přepsáním WM_SIZECHILD zpráva ve vaší COleIPFrameWnd třídy.Další informace o specifické údaje o WM_SIZECHILD, viz Technická poznámka 24.

Viz také

Další zdroje

Technické poznámky podle čísla

Technické poznámky podle kategorie