TN040: změny velikosti a měřítka na místě v prostředích MFC/OLE
[!POZNÁMKA]
Následující technická poznámka nebyla aktualizována, protože byla poprvé zahrnuta v dokumentaci online.V důsledku toho některé postupy a témata mohou být nesprávné nebo zastaralé.Pro nejnovější informace je vhodné vyhledat téma zájmu v dokumentaci online index.
Tato poznámka popisuje otázky týkající se úpravy na místě a jak server by měl dosáhnout správného zvětšování a změna velikosti v místě.Pomocí aktivace v místě WYSIWYG koncepce se o krok dále v této nádoby a servery vzájemně spolupracovat a zejména interpretovat specifikaci OLE víceméně stejně.
Vzhledem k úzké interakci mezi kontejnerem a server podporuje aktivaci na místě jsou počet očekávání od koncového uživatele, který by měl být zachován:
Zobrazení prezentace (metasoubor nakreslenou COleServerItem::OnDraw přepsat) by měly vypadat přesně tak, jako při kreslení pro úpravy (kromě toho, že nejsou viditelné nástroje pro úpravy).
Při přiblížení kontejneru, okna serveru je příliš!
Kontejner i server by měl zobrazovat objekty pro úpravy pomocí stejné metriky.To znamená, že použití režimu mapování podle počtu logické pixelů na palec, ne fyzická obrazových bodů na palec, při vykreslování na zobrazovacím zařízení.
[!POZNÁMKA]
Vzhledem k tomu, že v místě aktivace se vztahuje pouze na zboží, které jsou vloženy (nepřipojené), přiblížení 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 pouze funkce, které jsou platné pro propojené a vložené položky v COleServerItem (to vám umožní mít společné provádění) a funkce, které jsou platné pouze pro vložené objekty jsou umístěny v COleServerDoc třída (z pohledu na server je document který je vložen).
Většinu zatížení je umístěna na serveru realizátor v tomto serveru musí být vědomi lupy kontejneru a jeho úprav rozhraní podle potřeby upravit.Ale jak server určit lupy, která používá kontejner?
Podporu knihovny MFC pro přiblížení
Aktuální velikost lupy lze určit voláním COleServerDoc::GetZoomFactor.Toto volání, pokud dokument není aktivní v místě bude vždy výsledkem faktor zvětšení 100 % (nebo poměru 1:1).Volání je, zatímco aktivní v místě může vrátit něco jiného než 100 %.
Příklad správně přiblížení naleznete ukázkové knihovny MFC OLE HIERSVR.Zvětšení HIERSVR ztěžuje skutečnost, že zobrazí text a text, obecně není adekvátní lineárně (tipy, typografické znaky, návrh šířky a výšky všechny věci zkomplikovat).Stále, HIERSVR odkaz na přiměřené prováděcí zvětšování správně a tak je výukový program knihovny MFC KLIKYHÁKY (krok 7).
COleServerDoc::GetZoomFactorUrčuje velikost lupy na základě počtu různých metrik dostupné z kontejneru nebo z provádění své COleServerItem a COleServerDoc třídy.Stručně řečeno aktuální velikost lupy se stanoví podle následujícího vzorce:
Position Rectangle (PR) / Container Extent (CE)
Kontejner je určeno POLOHU obdélníku.Je vrácen na server během aktivace na místě po COleClientItem::OnGetItemPosition se nazývá a je aktualizován, když kontejner volá na serveru COleServerDoc::OnSetItemRects (s voláním COleClientItem::SetItemRects).
Je poněkud složitější k výpočtu míry KONTEJNERU.Pokud kontejner volal COleServerItem::OnSetExtent (pomocí volání COleClientItem::SetExtent), pak rozsah KONTEJNERU je tato hodnota převedena na obrazové body na základě počtu pixelů na logický palec.Pokud kontejneru nebyla volána SetExtent, (což je obvykle případ), pak je rozsah kontejner velikost vrácené z COleServerItem::OnGetExtent.Tak, pokud kontejneru nebyla volána SetExtent, rámci předpokládá, že pokud stejně kontejneru by mít volány je 100 % přírodní rozsahu (hodnota vrácená z COleServerItem::GetExtent).Jiným způsobem uvedeno rozhraní předpokládá, že kontejner je zobrazení 100 % (ne více, ne méně) zboží.
Je důležité si uvědomit, že ačkoli COleServerItem::OnSetExtent a COleServerItem::OnGetExtent mají podobné názvy jsou stejného atributu položky není 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 pro určení ideální velikosti objektu.
Prohlédnutím všech zúčastněných API, můžete získat lepší přehled:
COleServerItem::OnGetExtent
Tato funkce by měl vrátit "fyzická velikost" v HIMETRIC jednotek zboží.Nejlepší způsob, jak představit "fyzická velikost" je definována jako velikost, může se zobrazí při tisku.Velikost vrácené zde je konstantní pro určité položky obsahu, (podobně jako metasoubor, který je konstantní pro určité zboží).Velikost se nemění při přiblížení k položce.Obvykle nemění při kontejneru nabízí zboží více nebo méně místa voláním OnSetExtent.Příkladem změny může být, jednoduchý textový editor s žádné "rozpětí" schopnost, která zalomený text podle rozsahu poslední odeslané kontejneru.Pokud změníte server, server pravděpodobně nastaven OLEMISC_RECOMPOSEONRESIZE bit v registru systému (v dokumentaci OLE SDK Další informace o této možnosti).
COleServerItem::OnSetExtent
Tato funkce je volána při kontejneru zobrazí "více nebo méně" objektu.Většina kontejnery nebude volat to vůbec.Výchozí implementace ukládá poslední hodnota přijatých z kontejneru v "m_sizeExtent", která se používá v COleServerDoc::GetZoomFactor při výpočtu hodnoty rozsahu KONTEJNERU popsané výše.
COleServerDoc::OnSetItemRects
Tato funkce je volána pouze v případě, že dokument je aktivní na místě.Je volána při kontejneru aktualizuje umístění nebo oříznutí použitý pro položku.POLOHU obdélníku, jak je popsáno výše, poskytuje Čitatel pro výpočet koeficientu zvětšení.Serveru mohou požadovat změnu pozice 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 třeba si uvědomit, že metasoubor vytvořen přepsání COleServerItem::OnDraw vytváří přesně stejné metasoubor, bez ohledu na aktuální velikost lupy.Metasoubor podle potřeby změní měřítko kontejneru.To je důležité rozlišení zobrazení OnDraw a položku serveru OnDraw.Zvětšování zobrazení úchytů zboží pouze vytvoří zoomable metasoubor a nechávají provést přiblížení vhodné nádoby.
Nejlepším způsobem, jak zajistit, že server pracuje správně, je použití provádění COleServerDoc::GetZoomFactor -li v místě aktivního dokumentu.
Podporu knihovny MFC pro změnu velikosti na místě
Knihovna MFC implementuje rozhraní pro změnu velikosti v místě plně, jak je popsáno ve specifikaci OLE 2.Uživatelské rozhraní je podporován COleResizeBar třídy, vlastní zprávy 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ž je zadán v rámci.Jak je popsáno výše, rámci opustí výsledky na místě velikosti do kontejneru – server reaguje na změnu lupy.Pokud kontejner reaguje obě nastavením rozsahu KONTEJNERU a POLOHU obdélníku během zpracování jeho COleClientItem::OnChangeItemPosition (jen v důsledku volání COleServerDoc::RequestPositionChange) a pak změnit velikost v místě má za následek "více nebo méně" položky zobrazení v okně pro úpravy.Pokud kontejner reaguje pouze během zpracování pomocí nastavení polohy obdélníku COleClientItem::OnChangeItemPosition, lupy se změní a budou zobrazeny položky "v měřítku nebo."
Na serveru můžete řídit (do určité míry), co se stane, že během tohoto vyjednávání.Tabulky, může například zvolit 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 změnit "okraje stránky", jsou stejné jako okno a zalomit text na okraji nového předsedu.Implementace serverů změnou přirozené míry (velikost vrácené z COleServerItem::OnGetExtent) po dokončení změny velikosti.To způsobí POLOHU obdélníku a rozsahu kontejner o stejnou částku, výsledkem stejné lupy, ale větší nebo menší oblasti zobrazení změnit.Kromě toho, více či méně dokumentu bude viditelný v metasouboru generované OnDraw.V tomto případě samotného dokumentu je změna, když uživatel změní velikost položky namísto právě zobrazené oblasti.
Můžete implementovat vlastní velikosti a i nadále využívat uživatelské rozhraní služby COleResizeBar přepsáním WM_SIZECHILD zprávy ve vaší COleIPFrameWnd třídy.Další informace o specifikacích WM_SIZECHILD, viz Technická poznámka: 24.