Nota
L'accesso a questa pagina richiede l'autorizzazione. È possibile provare ad accedere o modificare le directory.
L'accesso a questa pagina richiede l'autorizzazione. È possibile provare a modificare le directory.
Annotazioni
La libreria Microsoft Foundation Classes (MFC) continua a essere supportata. Tuttavia, non aggiungiamo più funzionalità né aggiorniamo la documentazione.
Annotazioni
La nota tecnica seguente non è stata aggiornata perché è stata inclusa per la prima volta nella documentazione online. Di conseguenza, alcune procedure e argomenti potrebbero non essere aggiornati o non corretti. Per le informazioni più recenti, è consigliabile cercare l'argomento di interesse nell'indice della documentazione online.
Questa nota illustra i problemi relativi alla modifica sul posto e al modo in cui un server deve eseguire correttamente lo zoom e il ridimensionamento sul posto. Con l'attivazione sul posto, il concetto WYSIWYG fa un ulteriore passo avanti in quanto i contenitori e i server collaborano tra loro e in particolare interpretano la specifica OLE quasi nello stesso modo.
A causa dell'interazione ravvicinata tra un contenitore e un server che supporta l'attivazione sul posto, l'utente finale deve mantenere una serie di aspettative:
La visualizzazione della presentazione (il metafile disegnato nell'override
COleServerItem::OnDraw) dovrebbe essere esattamente uguale a quando viene disegnata per la modifica (ad eccezione del fatto che gli strumenti di modifica non sono visibili).Quando il contenitore esegue lo zoom, anche la finestra del server dovrebbe farlo.
Sia il contenitore che il server devono visualizzare gli oggetti per la modifica usando le stesse metriche. Questo significa usare una modalità di mapping basata sul numero di pixel logici per pollice, non sui pixel fisici per pollice, durante il rendering nel dispositivo di visualizzazione.
Annotazioni
Poiché l'attivazione sul posto si applica solo agli elementi incorporati (non collegati), lo zoom si applica solo agli oggetti incorporati. Vedrai le API sia in COleServerDoc che in COleServerItem che vengono utilizzate per lo zoom. Il motivo di questa dicotomia è che solo le funzioni valide per gli elementi collegati e incorporati si trovano in COleServerItem (ciò consente di avere un'implementazione comune) e le funzioni valide solo per gli oggetti incorporati si trovano nella COleServerDoc classe (dal punto di vista del server, è il documento incorporato).
La maggior parte del carico è posta sull'implementatore del server, in quanto il server deve essere a conoscenza del fattore di zoom del contenitore e modificare l'interfaccia di modifica in base alle esigenze. Ma come fa il server a determinare il fattore di zoom usato dal contenitore
Supporto MFC per lo zoom
Il fattore di zoom corrente può essere determinato chiamando COleServerDoc::GetZoomFactor. La chiamata a questa operazione quando il documento non è attivo sul posto comporterà sempre un fattore di zoom di 100% (o rapporto 1:1). La chiamata al metodo mentre è attiva in loco può restituire un valore diverso da 100%.
Per un esempio di zoom corretto, vedere l'esempio OLE MFC HIERSVR. Lo zoom in HIERSVR è complicato dal fatto che visualizza testo, e il testo, in generale, non si ridimensiona in modo lineare (suggerimenti, convenzioni tipografiche, larghezze e altezze del design complicano la questione). Comunque, HIERSVR è un riferimento ragionevole per implementare correttamente lo zoom, e anche l'esercitazione MFC SCRIBBLE (passaggio 7).
COleServerDoc::GetZoomFactor determina il fattore di zoom basato su una serie di metriche diverse disponibili dal contenitore o dall'implementazione delle COleServerItem classi e COleServerDoc . In breve, il fattore di zoom corrente è determinato dalla formula seguente:
Position Rectangle (PR) / Container Extent (CE)
Il rettangolo di posizione è determinato dal contenitore. Viene restituito al server durante l'attivazione in situ quando COleClientItem::OnGetItemPosition viene chiamato e viene aggiornato quando il contenitore chiama il COleServerDoc::OnSetItemRects del server (con una chiamata a COleClientItem::SetItemRects).
L'ESTENSIONE DEL CONTENITORE è leggermente più complessa da calcolare. Se il contenitore ha chiamato COleServerItem::OnSetExtent (con una chiamata a COleClientItem::SetExtent), allora il CONTAINER EXTENT è questo valore convertito in pixel sulla base del numero di pixel per pollice logico. Se il contenitore non ha chiamato SetExtent (che in genere è il caso), il CONTENITORE EXTENT equivale alla dimensione restituita da COleServerItem::OnGetExtent. Pertanto, se il contenitore non ha chiamato SetExtent, il framework presume che, se lo avesse fatto, il contenitore avrebbe utilizzato un valore pari al 100% dell'extent naturale (il valore restituito da COleServerItem::GetExtent). In altre parole, il framework presuppone che il contenitore visualizzi 100% (non più, non meno) dell'oggetto.
È importante notare che anche se COleServerItem::OnSetExtent e COleServerItem::OnGetExtent hanno nomi simili, non modificano lo stesso attributo dell'elemento.
OnSetExtent viene chiamato per informare il server della quantità di oggetto visibile nel contenitore (indipendentemente dal fattore di zoom) e OnGetExtent viene chiamato dal contenitore per determinare le dimensioni ideali dell'oggetto.
Esaminando ognuna delle API coinvolte, è possibile ottenere un'immagine più chiara:
COleServerItem::OnGetExtent
Questa funzione deve restituire le "dimensioni naturali" nelle unità HIMETRIC dell'elemento. Il modo migliore per considerare le "dimensioni naturali" è definirlo come le dimensioni che potrebbe apparire quando viene stampato. La dimensione restituita qui è costante per un particolare contenuto dell'elemento (molto simile al metafile, che è costante per un determinato elemento). Questa dimensione non cambia quando viene applicato lo zoom all'elemento. In genere non cambia quando il contenitore assegna all'elemento più o meno spazio chiamando OnSetExtent. Un esempio di modifica potrebbe essere quello di un semplice editor di testo senza funzionalità "margin" che ha eseguito il wrapping del testo in base all'ultimo extent inviato dal contenitore. Se un server cambia, il server dovrebbe probabilmente impostare il bit di OLEMISC_RECOMPOSEONRESIZE nel Registro di sistema (vedere la documentazione di OLE SDK per altre 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 lo chiamerà affatto. L'implementazione predefinita archivia l'ultimo valore ricevuto dal contenitore in "m_sizeExtent", che viene utilizzato in COleServerDoc::GetZoomFactor durante il calcolo del valore di estensione del contenitore descritto in precedenza.
COleServerDoc::OnSetItemRects
Questa funzione viene chiamata solo quando il documento è attivo sul posto. Viene chiamato quando il contenitore aggiorna la posizione dell'elemento o il ritaglio applicato all'elemento. Il RETTANGOLO DI POSIZIONE, come illustrato in precedenza, fornisce il numeratore per il calcolo del fattore di zoom. Un server può richiedere che la posizione dell'elemento venga modificata chiamando COleServerDoc::RequestPositionChange. Il contenitore può rispondere o meno a questa richiesta chiamando OnSetItemRects (con una chiamata a COleServerItem::SetItemRects).
COleServerDoc::OnDraw
È importante tenere presente che il metafile creato eseguendo l'override di COleServerItem::OnDraw produce esattamente lo stesso metafile, indipendentemente dal fattore di zoom corrente. Il contenitore ridimensiona il metafile in base alle esigenze. Questa è una distinzione importante tra OnDraw della visualizzazione e OnDraw dell'elemento del server. La visualizzazione gestisce lo zoom, l'elemento crea solo un metafile zoomabile e lo lascia al contenitore per eseguire lo zoom appropriato.
Il modo migliore per assicurarsi che il server si comporti correttamente consiste nell'usare l'implementazione di COleServerDoc::GetZoomFactor se il documento è attivo in loco.
Supporto MFC per il ridimensionamento In-Place
MFC implementa completamente l'interfaccia di ridimensionamento in loco come descritto nella specifica OLE 2. L'interfaccia utente è supportata dalla COleResizeBar classe , da un messaggio personalizzato WM_SIZECHILD e dalla gestione speciale di questo messaggio in COleIPFrameWnd.
È possibile implementare una gestione diversa di questo messaggio rispetto a quella fornita dal framework. Come descritto in precedenza, il framework delega la gestione dei risultati del ridimensionamento in loco al contenitore — il server risponde alla modifica del fattore di zoom. Se il contenitore reagisce impostando sia CONTAINER EXTENT che POSITION RECTANGLE durante l'elaborazione del relativo COleClientItem::OnChangeItemPosition (chiamato come risultato di una chiamata a COleServerDoc::RequestPositionChange), il ridimensionamento sul posto comporterà la visualizzazione di "più o meno" dell'elemento nella finestra di modifica. Se il contenitore reagisce impostando semplicemente POSITION RECTANGLE durante l'elaborazione di COleClientItem::OnChangeItemPosition, il fattore di zoom cambierà e l'elemento verrà visualizzato "ingrandito o ridotto".
Un server può controllare (in qualche modo) cosa accade durante questa negoziazione. Un foglio di calcolo, ad esempio, potrebbe decidere di visualizzare più o meno celle quando l'utente ridimensiona la finestra durante la modifica diretta dell'elemento. Un elaboratore di testo potrebbe scegliere di modificare i "margini della pagina" in modo che corrispondano alla finestra e riscrivano il testo nel nuovo margine. I server implementano questa impostazione modificando l'extent naturale (le dimensioni restituite da COleServerItem::OnGetExtent) al termine del ridimensionamento. In questo modo, sia POSITION RECTANGLE che CONTAINER EXTENT cambiano in base alla stessa quantità, determinando lo stesso fattore di zoom, ma un'area di visualizzazione più grande o più piccola. Inoltre, più o meno del documento sarà visibile nel metafile generato da OnDraw. In questo caso, il documento stesso cambia quando l'utente ridimensiona l'elemento, anziché solo l'area di visualizzazione.
È possibile implementare il ridimensionamento personalizzato e sfruttare comunque l'interfaccia utente fornita COleResizeBar eseguendo l'override del messaggio di WM_SIZECHILD nella COleIPFrameWnd classe. Per altre informazioni sulle specifiche di WM_SIZECHILD, vedere La nota tecnica 24.