TN040: MFC/OLE sul posto il ridimensionamento e lo zoom

Questa nota discuterà le questioni relative alla modifica sul posto e come un server dovrebbe eseguire lo zoom corretta e ridimensionamento sul posto. Con l'attivazione sul posto, il concetto di WYSIWYG è preso un ulteriore passo avanti in quel contenitori e server di cooperare con gli altri e in particolare interpretare le specifiche OLE più o meno allo stesso modo.

A causa dell'interazione stretta tra un contenitore e server supporta l'attivazione sul posto ci sono un certo numero di aspettative da all'utente finale che dovrebbe essere mantenuto:

&Notanbsp;  Perché l'attivazione sul posto si applica solo agli elementi che sono incastonati (non linkati), lo zoom riguarda solo gli oggetti incorporati. Staremo a vedere le API in COleServerDoc e COleServerItem che vengono utilizzate per lo zoom. La ragione di questa dicotomia è che solo le funzioni che sono valide per gli elementi collegati e incorporati sono in COleServerItem (questo permette di avere un'implementazione comune) e le funzioni che sono valide solo per gli oggetti incorporati sono situate nella classe COleServerDoc (dal punto di vista del server, è il documento che è incorporato).

La maggior parte dell'onere è posto sull'implementatore del server, in quanto il server deve essere consapevole del fattore di zoom del contenitore e modificare l'interfaccia di modifica come appropriato. Ma come il server di determinare il fattore di zoom che utilizza il contenitore?

Supporto MFC per lo zoom

Il fattore di zoom corrente può essere determinato mediante la chiamata COleServerDoc::GetZoomFactor. Questo si chiama quando il documento non è attivo sul posto sempre si tradurrà in un fattore di zoom 100% (o rapporto 1:1). Chiamandola mentre attivo sul posto può restituire qualcosa di diverso da 100 %.

Per un esempio di zoom correttamente vedere l'esempio OLE di MFC HIERSVR. Lo zoom in HIERSVR è complicato dal fatto che visualizza il testo — e testo, in generale, non scala in modo lineare (suggerimenti, Convenzioni tipografiche, design larghezze e altezze tutti complicano la questione). Eppure, HIERSVR è un riferimento ragionevole per l'implementazione di zoom correttamente, e così è il Tutorial MFC SCARABOCCHIARE (passaggio 7).

COleServerDoc::GetZoomFactor determina il fattore di zoom in base al numero di diverse metriche disponibili dal contenitore o dall'implementazione di classi COleServerItem e COleServerDoc . In breve, il fattore di zoom corrente è determinato dalla seguente formula

Posizionare il rettangolo (PR) / contenitore misura (CE)

Il rettangolo di posizione è determinato dal contenitore. Viene restituito al server durante l'attivazione sul posto quando COleClientItem::OnGetItemPosition viene chiamato e viene aggiornato quando il contenitore chiama COleServerDoc::OnSetItemRects del server (con una chiamata a COleClientItem::SetItemRects).

L'estensione del contenitore è leggermente più difficile da calcolare. Se il contenitore è chiamato COleServerItem::OnSetExtent (con una chiamata a COleClientItem::SetExtent), poi nella misura del contenitore è questo valore convertito in pixel in base al numero di pixel per pollice logico. Se il contenitore non è chiamato SetExtent (che di solito è il caso), nella misura del contenitore è la dimensione restituita da COleServerItem::OnGetExtent. Così, se il contenitore non è chiamato SetExtent, il quadro si presuppone che se così fosse il contenitore sarebbe hanno chiamato con il 100% della portata naturale (il valore restituito da COleServerItem::GetExtent). O ha dichiarato un altro modo, il quadro si presuppone che il contenitore è la visualizzazione 100% (non di più, non meno) dell'elemento.

È importante notare che, anche se COleServerItem::OnSetExtent e COleServerItem::OnGetExtent hanno nomi simili, non esse manipolano lo stesso attributo dell'elemento. OnSetExtent è chiamato a fare il server di sapere quanto l'oggetto è visibile nel contenitore (indipendentemente dal fattore di zoom) e di OnGetExtent viene chiamato dal contenitore per determinare la dimensione ideale dell'oggetto.

Guardando ad ognuna delle API coinvolte qui è possibile ottenere un quadro più chiaro:

COleServerItem::OnGetExtent

Questa funzione deve restituire la dimensione"naturale" in unità HIMETRIC dell'elemento. Il modo migliore per pensare a "dimensione naturale" è quello di definirlo come la dimensione che potrebbe essere visualizzato quando viene stampato. La dimensione restituito qui è costante per un particolare elemento di contenuto (molto simile metafile, che è costante per un determinato elemento). Questa dimensione non cambia quando lo zoom viene applicato all'elemento. Di solito non cambia quando il contenitore dà l'elemento più o meno spazio chiamando OnSetExtent. Un esempio di un cambiamento potrebbe essere quella di un semplice editor di testo con alcuna capacità di "margine" avvolto testo basato sull'ultima misura inviata dal contenitore. Se un server cambia, il server deve probabilmente impostato il OLEMISC_RECOMPOSEONRESIZE bit nel Registro di sistema (vedere la documentazione di OLE SDK per ulteriori informazioni su questa opzione).

COleServerItem::OnSetExtent

Questa funzione viene chiamata quando il contenitore mostra "più o meno" dell'oggetto. La maggior parte dei contenitori non chiamerà questo a tutti. L'implementazione predefinita memorizza l'ultimo valore ricevuto dal contenitore in 'm_sizeExtent', che viene utilizzato in COleServerDoc::GetZoomFactor nel calcolo del valore di misura CONTAINER descritto sopra.

COleServerDoc::OnSetItemRects

Questa funzione viene chiamata solo quando il documento è attivo sul posto. Esso viene chiamato quando il contenitore aggiorna la posizione dell'elemento o il ritaglio applicato alla voce. Il rettangolo di posizione, come discusso in precedenza, fornisce il numeratore per il calcolo del fattore di zoom. Un server può richiedere che la posizione dell'elemento essere cambiato chiamando COleServerDoc::RequestPositionChange. Il contenitore può o non può rispondere a questa richiesta chiamando OnSetItemRects (con una chiamata a COleServerItem::SetItemRects).

COleServerDoc::OnDraw

È importante rendersi conto che l'oggetto metafile creato eseguendo l'override di COleServerItem::OnDraw produce esattamente lo stesso metafile, indipendentemente dal fattore di zoom corrente. Il contenitore scalerà metafile come appropriato. Questa è un'importante distinzione tra della visualizzazione OnDraw e dell'elemento server OnDraw. Le maniglie di vista lo zoom, la voce crea solo un zoomable metafile e lascia fino al contenitore di fare la zumata appropriato.

Il modo migliore per assicurare che il vostro server si comporta correttamente è quello di utilizzare l'implementazione di COleServerDoc::GetZoomFactor se il documento è attivo sul posto.

Supporto MFC per ridimensionamento sul posto

MFC completamente implementa l'interfaccia ridimensionamento sul posto come descritto nella specifica di OLE 2. L'interfaccia utente è supportato dalla classe COleResizeBar , un messaggio personalizzato WM_SIZECHILDe una gestione speciale di questo messaggio in COleIPFrameWnd.

Si desidera implementare diverse manipolazione di questo messaggio rispetto a quanto previsto dal quadro. Come descritto in precedenza, il quadro lascia i risultati del posto ridimensionamento fino al contenitore — il server risponde alla variazione del fattore di zoom. Se il contenitore reagisce impostando entrambe contenitore nella misura e ridimensionare rettangolo posizione durante l'elaborazione del suo COleClientItem::OnChangeItemPosition (chiamato come il risultato di una chiamata a COleServerDoc::RequestPositionChange) quindi il posto si tradurrà in mostra "più o meno" dell'elemento nella finestra di modifica. Se il contenitore reagisce solo impostando il rettangolo di posizione durante l'elaborazione di COleClientItem::OnChangeItemPosition, cambierà il fattore di zoom e verrà mostrato l'elemento "zoom in o out".

Un server può controllare (in una certa misura) cosa succede durante questa trattativa. Un foglio di calcolo, ad esempio potrebbe eleggere mostrare le cellule più o meno quando l'utente ridimensiona la finestra mentre si modifica la voce sul posto. Un Word-Processor potrebbe decidere di cambiare "margini di pagina", quindi sono lo stesso come finestra e riporre il testo al margine di nuovo. Server di implementare questa modificando l'estensione naturale (la dimensione restituita da COleServerItem::OnGetExtent) quando il ridimensionamento è fatto. Ciò causerà il rettangolo di posizione e nella misura del contenitore di cambiare la stessa quantità, con conseguente lo stesso fattore di zoom, ma un più grande o più piccola area di visualizzazione. Inoltre, più o meno del documento sarà visibile del metafile generato da OnDraw. In questo caso, il documento stesso sta cambiando quando l'utente ridimensiona l'elemento, invece di solo l'area di visualizzazione.

È possibile implementare il ridimensionamento personalizzato e sfruttare ancora l'interfaccia utente fornita dal COleResizeBar eseguendo l'override il messaggio WM_SIZECHILD nella classe COleIPFrameWnd . Per ulteriori informazioni sulle specifiche di WM_SIZECHILD, vedere tecnica nota 24.

&Note tecniche per numero |nbsp; Note tecniche per la categoria

Index