TN040: změny velikosti a měřítka na místě v prostředích MFC/OLE
Poznámka
Následující technická poznámka se od prvního zahrnutí do online dokumentace neaktualizovala. V důsledku toho můžou být některé postupy a témata zastaralé nebo nesprávné. Nejnovější informace doporučujeme vyhledat v online indexu dokumentace, které vás zajímá.
Tato poznámka bude diskutovat o problémech souvisejících s místní úpravou a o tom, jak má server provést správnou změnu velikosti přiblížení a místní změny velikosti. Při místní aktivaci je koncept WYSIWYG ještě o krok dále v tom, že kontejnery a servery vzájemně spolupracují, a zejména interpretují specifikaci OLE podobným způsobem.
Vzhledem k úzké interakci mezi kontejnerem a serverem podporujícím místní aktivaci existuje řada očekávání od koncového uživatele, které by se měly zachovat:
Zobrazení prezentace (metasoubor nakreslený v
COleServerItem::OnDraw
přepsání) by mělo vypadat přesně stejně jako při kreslení pro úpravy (s tím rozdílem, že nástroje pro úpravy nejsou viditelné).Když se kontejner přiblíží, mělo by se také okno serveru!
Kontejner i server by měly zobrazovat objekty pro úpravy pomocí stejných metrik. To znamená použití režimu mapování na základě počtu logických pixelů na paleč , nikoli fyzických pixelů na paleč při vykreslování na zobrazovacím zařízení.
Poznámka
Vzhledem k tomu, že místní aktivace se vztahuje pouze na vložené položky (ne propojené), přiblížení se vztahuje pouze na vložené objekty. Rozhraní API se zobrazí v obou COleServerDoc
případech a COleServerItem
používají se k přiblížení. Důvodem této dichotomy je, že se nacházejí COleServerItem
pouze funkce platné pro propojené i vložené položky (to umožňuje mít společnou implementaci) a funkce, které jsou platné pouze pro vložené objekty, jsou umístěny ve COleServerDoc
třídě (z pohledu serveru se jedná o dokument , který je vložený).
Většina zátěže je umístěna na implementátor serveru v tom, že server musí vědět o faktoru přiblížení kontejneru a podle potřeby upravit jeho rozhraní pro úpravy. Jak ale server určí faktor přiblížení, který kontejner používá.
Podpora MFC pro přiblížení
Aktuální faktor přiblížení lze určit voláním COleServerDoc::GetZoomFactor
. Když dokument není aktivní na místě, vyvolá se vždy 100% faktor přiblížení (nebo poměr 1:1). Volání v době, kdy je aktivní na místě, může vrátit něco jiného než 100 %.
Příklad správné lupy naleznete v ukázce MFC OLE HIERSVR. Přiblížení HIERSVR je složité tím, že zobrazuje text a text obecně nešší lineárním způsobem (rady, typografické konvence, šířky návrhu a výšky komplikují záležitost). HiERSVR je přesto rozumnou referencí pro správnou implementaci přiblížení, a tak je SCRIBBLE kurzu MFC (krok 7).
COleServerDoc::GetZoomFactor
určuje faktor přiblížení na základě řady různých metrik dostupných buď z kontejneru, nebo z implementace vašich COleServerItem
a COleServerDoc
tříd. Stručně řečeno, aktuální faktor přiblížení je určen následujícím vzorcem:
Position Rectangle (PR) / Container Extent (CE)
Obdélník POZICE je určen kontejnerem. Při volání se vrátí na server během místní aktivace COleClientItem::OnGetItemPosition
a aktualizuje se, když kontejner volá server COleServerDoc::OnSetItemRects
(s voláním COleClientItem::SetItemRects
).
Rozsah kontejneru je pro výpočet o něco složitější. Pokud kontejner volal COleServerItem::OnSetExtent
(s voláním COleClientItem::SetExtent
), pak je tato hodnota převedena na pixely na základě počtu pixelů na logický paleč. Pokud kontejner nemá název SetExtent (což je obvykle případ), pak parametr CONTAINER EXTENT je velikost vrácená z COleServerItem::OnGetExtent
. Pokud tedy kontejner nemá název SetExtent, architektura předpokládá, že pokud by kontejner zavolal s 100% přirozeným rozsahem (hodnota vrácená z COleServerItem::GetExtent
). Uvedl jiný způsob, architektura předpokládá, že kontejner zobrazuje 100 % (více, ne méně) položky.
Je důležité si uvědomit, že i když COleServerItem::OnSetExtent
a COleServerItem::OnGetExtent
mají podobné názvy, manipulují se stejným atributem položky. OnSetExtent
je volána, aby server věděl, kolik objektu je viditelné v kontejneru (bez ohledu na faktor přiblížení) a OnGetExtent
je volána kontejnerem k určení ideální velikosti objektu.
Když se podíváte na jednotlivá rozhraní API, můžete získat jasnější obrázek:
COleServerItem::OnGetExtent
Tato funkce by měla vrátit "přirozenou velikost" v jednotkách HIMETRIC položky. Nejlepším způsobem, jak si představit "přirozenou velikost", je definovat ji tak, jak se může při tisku objevit. Vrácená velikost je konstantní pro určitý obsah položky (podobně jako metasoubor, což je konstantní pro určitou položku). Tato velikost se při použití lupy u položky nezmění. Obvykle se nezmění, když kontejner dává položku více nebo méně místa voláním OnSetExtent
. Příkladem změny může být jednoduchý textový editor bez možnosti okraje, která zalomila text na základě posledního rozsahu odeslaného kontejnerem. Pokud se server změní, měl by server pravděpodobně nastavit OLEMISC_RECOMPOSEONRESIZE bit v systémovém registru (další informace o této možnosti najdete v dokumentaci k sadě OLE SDK).
COleServerItem::OnSetExtent
Tato funkce se volá, když kontejner zobrazuje objekt "více nebo méně". Většina kontejnerů to vůbec nebude volat. Výchozí implementace ukládá poslední hodnotu přijatou z kontejneru v m_sizeExtent, která se používá při COleServerDoc::GetZoomFactor
výpočtu hodnoty CONTAINER EXTENT popsané výše.
COleServerDoc::OnSetItemRects
Tato funkce se volá pouze v případě, že je dokument aktivní. Volá se, když kontejner aktualizuje pozici položky nebo výřez použitý u položky. Obdélník POZICE, jak je popsáno výše, poskytuje čitatel pro výpočet faktoru přiblížení. Server může požádat, aby pozice položky byla změněna voláním COleServerDoc::RequestPositionChange
. Kontejner může nebo nemusí na tuto žádost reagovat 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ím COleServerItem::OnDraw
vytvoří přesně stejný metasoubor bez ohledu na aktuální faktor přiblížení. Kontejner podle potřeby škáluje metasoubor. Toto je důležitý rozdíl mezi zobrazením OnDraw
a položkou OnDraw
serveru . Zobrazení zpracovává přiblížení, položka pouze vytvoří zoomable metasoubor a ponechá ho v kontejneru, aby udělal odpovídající přiblížení.
Nejlepším způsobem, jak zajistit, aby se váš server chová správně, je použít implementaci COleServerDoc::GetZoomFactor
, pokud je dokument na místě aktivní.
Podpora mfc pro místní změnu velikosti
MFC plně implementuje místní rozhraní pro změnu velikosti, jak je popsáno ve specifikaci OLE 2. Uživatelské rozhraní je podporováno COleResizeBar
třídou, vlastní zprávou WM_SIZECHILD a speciálním zpracováním této zprávy v COleIPFrameWnd
.
Je možné, že budete chtít implementovat jiné zpracování této zprávy, než jaké poskytuje architektura. Jak je popsáno výše, architektura ponechá výsledky místní změny velikosti až do kontejneru – server reaguje na změnu faktoru přiblížení. Pokud kontejner reaguje nastavením kontejneru rozsahu a POZICE OBDÉLNÍKu během zpracování jeho COleClientItem::OnChangeItemPosition
(volaného v důsledku volání COleServerDoc::RequestPositionChange
) pak místní změna velikosti způsobí, že se v okně pro úpravy zobrazí "více nebo méně" položky. Pokud kontejner reaguje pouhým nastavením POZICE OBDÉLNÍK během zpracování COleClientItem::OnChangeItemPosition
, zoom faktor se změní a položka se zobrazí "přiblížení nebo oddálení".
Server může řídit (do určité míry) to, co se stane během tohoto vyjednávání. Tabulka se například může rozhodnout zobrazit více nebo méně buněk, když uživatel změní velikost okna při úpravě položky na místě. Word-processor se může rozhodnout změnit "okraje stránky", aby byly stejné jako okno a přebalit text na nový okraj. Servery to implementují změnou přirozeného rozsahu (velikost vrácená z COleServerItem::OnGetExtent
) při změně velikosti. To způsobí, že se obdélník POZICE i ROZSAH KONTEJNERu změní o stejnou velikost, což způsobí stejný faktor zvětšení, ale větší nebo menší oblast zobrazení. Kromě toho bude více nebo méně dokumentu viditelné v metasouboru generovaném OnDraw
. V tomto případě se samotný dokument mění, když uživatel změní velikost položky místo jenom oblasti zobrazení.
Můžete implementovat vlastní změnu velikosti a stále využívat uživatelské rozhraní poskytované přepsáním COleResizeBar
WM_SIZECHILD zprávy ve vaší COleIPFrameWnd
třídě. Další informace o specifikách WM_SIZECHILD naleznete v technické poznámce 24.
Viz také
Technické poznámky podle čísel
Technické poznámky podle kategorií