TN040: Ridimensionamento sul posto e zoom di MFC/OLE
[!NOTA]
La seguente nota tecnica non è stata aggiornata dalla prima volta che viene inclusa nella documentazione online.Di conseguenza, alcune procedure e argomenti potrebbero non essere aggiornati o errati.Per le informazioni più recenti, è consigliabile cercare l'argomento di interesseindice della documentazione online.
Questa nota verrà descritto i problemi relativi alla modifica sul posto e nel server deve eseguire lo zoom corretto e il ridimensionamento sul posto.Per l'attivazione sul posto, il concetto WYSIWYG è intrapreso un'azione ulteriormente in quanto i contenitori e i server prevedono tra loro e in particolare interpreta la specifica OLE nello stesso modo.
A causa dell'interazione vicina tra un contenitore e un server che supportano l'attivazione sul posto vi sia una serie di aspettative dall'utente finale che dovrebbe essere gestito:
La visualizzazione di presentazione (metafile contenuti in un override di COleServerItem::OnDraw ) deve essere esattamente lo stesso di quando vengono create per la modifica (eccetto per modificare gli strumenti non è visibile).
Quando il contenitore viene ingrandita, la finestra server deve anche!
Sia il contenitore che il server è necessario visualizzare gli oggetti per modificare utilizzando la stessa metrica.Ciò significa che utilizza una modalità di mapping in base al numero di pixel logici per pollice — pixel non fisici per pollice quando eseguono il rendering dello schermo.
[!NOTA]
Poiché l'attivazione sul posto si applica solo agli elementi incorporati (non connessi), eseguendo l'ingrandimento si applica solo agli oggetti incorporati.Si vedranno le API in entrambe le COleServerDoc e COleServerItem utilizzati per zoom.Lo scopo di questa dicotomia è che solo le funzioni valide per gli elementi collegati che sono incorporati in COleServerItem (ciò consente di avere un'implementazione comune) e funzioni che sono validi solo per gli oggetti incorporati si trovano nella classe di COleServerDoc (dalla prospettiva del server, è document incorporato).
La maggior parte del carico è posizionato sull'implementatore server, in quanto il server deve essere consapevole del fattore di zoom del contenitore e impostare la relativa interfaccia di modifica in base alle proprie esigenze.Ma come server determina il fattore di zoom che il contenitore utilizza?
Supporto MFC per zoom
il fattore di zoom corrente può essere determinato chiamando COleServerDoc::GetZoomFactor.Chiamare questo metodo quando il documento non è sempre risultato attivo sul posto di verrà avviata in un fattore di zoom 100% (o nel rapporto di 1:1).Chiamarlo come attivo sul posto può restituire un risultato diverso da 100%.
Per un esempio di zoom correttamente vedere l'esempio HIERSVROLE MFC.Ingrandimento HIERSVR è complicata dal fatto che visualizza il testo e testo, in genere non viene ridimensionato in modo lineare (suggerimenti, le convenzioni tipografiche, la larghezza di progettazione e le altezze tutte complicano la questione).Tuttavia, HIERSVR è un riferimento ragionevole per implementare zoom correttamente e pertanto è MFC SCRIBBLE l'esercitazione (passaggio 7).
COleServerDoc::GetZoomFactor determina il fattore di zoom basato su diversi parametri differente disponibile dal contenitore o dall'implementazione delle classi di COleServerDoc e di COleServerItem .In breve, il fattore di zoom corrente è determinato dalla seguente formula:
Position Rectangle (PR) / Container Extent (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'AMBITO CONTAINER è leggermente più complesso calcolare.Se il contenitore ha chiamato COleServerItem::OnSetExtent (con una chiamata a COleClientItem::SetExtent), pertanto l'AMBITO CONTAINER è il valore convertito in pixel in base al numero di pixel per pollice logico.Se il contenitore non ha chiamato SetExtent coma in genere il caso), pertanto l'AMBITO CONTAINER è la dimensione restituita da COleServerItem::OnGetExtent.Quindi, se il contenitore non ha chiamato SetExtent, il framework si presuppone che si apporta il contenitore lo ha chiamato con 100% dell'ambito naturale (il valore restituito da COleServerItem::GetExtent).Indica un altro modo, il framework si presuppone che il contenitore visualizzato 100% (nessun altro elemento, non inferiore) dell'elemento.
È importante notare che mentre COleServerItem::OnSetExtent e COleServerItem::OnGetExtent abbiano nomi simili, non modificano lo stesso attributo dell'elemento.OnSetExtent viene chiamato per consentire al server sapere quanto oggetto è visibile nel contenitore (indipendentemente dal fattore di zoom) e OnGetExtent viene chiamato dal contenitore per determinare la dimensione ideale dell'oggetto.
Esaminando ognuna delle API utilizzate, è possibile ottenere un più semplice immagine:
COleServerItem::OnGetExtent
Questa funzione deve restituire “la dimensione naturale„ in unità di HIMETRIC dell'elemento.Il modo migliore per stabilire “alle relative dimensioni standard„ è di in quando la dimensione può verificarsi quando viene stampata.La dimensione restituita è costante per il contenuto di un elemento di oggetto particolare (molto simile a un metafile, che rappresentano costanti per un particolare elemento).Questa dimensione non cambia quando eseguendo l'ingrandimento viene applicata all'elemento.In genere non cambia quando il contenitore offre all'elemento più o meno spazio chiamando OnSetExtent.Un esempio di una modifica potrebbe essere quello di un editor di testo semplice senza funzionalità “del margine„ che ha eseguito il wrapping del testo in base all'ultimo ambito inviato dal contenitore.Se un server cambia, il server consigliabile impostare il bit di OLEMISC_RECOMPOSEONRESIZE nel Registro di sistema (vedere la documentazione 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 chiamano questo oggetto.L'implementazione predefinita archivia l'ultimo valore ricevuto dal contenitore “in m_sizeExtent„, utilizzato in COleServerDoc::GetZoomFactor quando si calcola il valore di AMBITO CONTAINER descritto in precedenza.
COleServerDoc::OnSetItemRects
Questa funzione viene chiamata solo quando il documento attivo sul posto.Viene chiamato quando il contenitore aggiorna la posizione o l'area di visualizzazione degli elementi applicata all'elemento.Il RETTANGOLO di POSIZIONE, come descritto in, fornisce il numeratore per il calcolo di fattore di zoom.Un server può richiedere che la posizione dell'elemento venga modificata chiamando COleServerDoc::RequestPositionChange.Il contenitore può rispondere alla richiesta chiamando OnSetItemRects (con una chiamata a COleServerItem::SetItemRects).
COleServerDoc::OnDraw
È importante tenere presente che i metafile create eseguendo l'override di COleServerItem::OnDraw producono le stesse metafile, indipendentemente dal fattore di zoom corrente.Il contenitore è un metafile in base alle proprie esigenze.Ciò è un'importante distinzione tra OnDraw di visualizzazione e OnDrawserver dell'elemento.La visualizzazione gestisce lo zoom, l'elemento viene creato solo metafile zoomable e i nodi foglia fino al contenitore per eseguire lo zoom appropriato.
Il modo migliore per garantire che il server si comporti correttamente è di utilizzare l'implementazione di COleServerDoc::GetZoomFactor se il documento attivo sul posto.
Supporto MFC per il ridimensionamento sul posto
MFC supporta Il implementa l'interfaccia sul posto di ridimensionamento come descritto nella specifica OLE 2.L'interfaccia utente è supportata dalla classe di COleResizeBar , un messaggio WM_SIZECHILDpersonalizzate e da una gestione speciale di questo messaggio in COleIPFrameWnd.
Può essere opportuno implementare la gestione diversa del messaggio che a quello offerto dal framework.Come descritto in precedenza, il framework consente ai risultati di ridimensionamento sul posto fino al contenitore — il server risponde alla modifica nel fattore di zoom.Se il contenitore risponde impostando sia l'AMBITO CONTAINER che il RETTANGOLO di POSIZIONE durante l'elaborazione del COleClientItem::OnChangeItemPosition (definito come risultato di una chiamata a COleServerDoc::RequestPositionChange) e del sul posto dimensioni risulteranno nella rappresentazione “più o meno„ elemento nella finestra di modifica.Se il contenitore risponde semplicemente impostando il RETTANGOLO di POSIZIONE durante l'elaborazione di COleClientItem::OnChangeItemPosition, il fattore di zoom cambierà e l'elemento verrà visualizzato “eseguito lo zoom avanti o indietro.„
Un server può controllare (in qualche misura) che si verifica durante questo negoziazione.Un foglio di calcolo, ad esempio possibile senza visualizzare più o meno celle quando l'utente ridimensiona la finestra durante la modifica l'elemento sul posto.Un wordprocessor potrebbe senza per modificare “i margini di pagina„ pertanto sono gli stessi della finestra e di rewrap il testo al nuovo margine.I server implementano questo modifica l'ambito naturale (la dimensione restituita da COleServerItem::OnGetExtent) quando il ridimensionamento viene eseguito.In questo modo il RETTANGOLO di POSIZIONE che l'AMBITO CONTAINER a modifiche dallo stesso importo, con conseguente stesso fattore di zoom, ma una più grande o più piccola area di visualizzazione.Inoltre, più o meno il documento saranno visibile) in generate da OnDraw.In questo caso, il documento stesso viene modificato quando l'utente ridimensiona l'elemento, anziché solo dell'area di visualizzazione.
È possibile implementare il ridimensionamento personalizzato e continuare a utilizzare l'interfaccia utente fornita da COleResizeBar eseguendo l'override del messaggio di WM_SIZECHILD nella classe di COleIPFrameWnd .Per ulteriori informazioni sulle specifiche di WM_SIZECHILD, vedere nota tecnica 24.