Unione di menu della Guida
Quando un oggetto è attivo all'interno di un contenitore, il protocollo di unione di menu di DOCUMENTI OLE fornisce all'oggetto il controllo completo del menu ? Di conseguenza, gli argomenti della Guida del contenitore non sono disponibili a meno che l'utente non disattiva l'oggetto. L'architettura di contenimento del documento attivo si espande sulle regole per l'unione dei menu sul posto per consentire al contenitore e a un documento attivo attivo di condividere il menu. Le nuove regole sono semplicemente convenzioni aggiuntive sul componente proprietario di quale parte del menu e su come viene costruito il menu condiviso.
La nuova convenzione è semplice. Nei documenti attivi, il menu ? include due voci di menu di primo livello organizzate come segue:
Help
Container Help >
Object Help >
Ad esempio, quando una sezione di Word è attiva in Office Binder, il menu ? verrà visualizzato come segue:
Help
Binder Help >
Word Help >
Entrambe le voci di menu sono menu a cascata in cui vengono fornite tutte le voci di menu aggiuntive specifiche del contenitore e l'oggetto all'utente. Gli elementi visualizzati qui variano in base al contenitore e agli oggetti coinvolti.
Per costruire questo menu della Guida unito, l'architettura di contenimento dei documenti attiva modifica la normale routine DOCUMENTI OLE. In base ai documenti OLE, la barra dei menu unita può avere sei gruppi di menu, ovvero File, Modifica, Contenitore, Oggetto, Finestra, Guida, in tale ordine. In ogni gruppo possono essere presenti zero o più menu. I gruppi File, Contenitore e Finestra appartengono al contenitore e i gruppi Modifica, Oggetto e Guida appartengono all'oggetto . Quando l'oggetto vuole eseguire l'unione di menu, crea una barra dei menu vuota e la passa al contenitore. Il contenitore inserisce quindi i relativi menu chiamando IOleInPlaceFrame::InsertMenus
. L'oggetto passa anche una struttura che è una matrice di sei valori LONG (OLEMENUGROUPWIDTHS). Dopo aver inserito i menu, il contenitore contrassegna il numero di menu aggiunti in ognuno dei relativi gruppi e quindi restituisce. L'oggetto inserisce quindi i relativi menu, prestando attenzione al numero di menu in ogni gruppo di contenitori. Infine, l'oggetto passa la barra dei menu unita e la matrice (che contiene il conteggio dei menu in ogni gruppo) a OLE, che restituisce un handle opaco "descrittore di menu". Successivamente l'oggetto passa tale handle e la barra dei menu unita al contenitore, tramite IOleInPlaceFrame::SetMenu
. Al momento, il contenitore visualizza la barra dei menu unita e passa anche l'handle a OLE, in modo che OLE possa eseguire l'invio corretto dei messaggi di menu.
Nella procedura di documento attiva modificata, l'oggetto deve prima inizializzare gli elementi OLEMENUGROUPWIDTHS su zero prima di passarlo al contenitore. Il contenitore esegue quindi un normale inserimento di menu con un'eccezione: il contenitore inserisce un menu ? come ultima voce e archivia un valore pari a 1 nell'ultima voce (sesto) della matrice OLEMENUGROUPWIDTHS , ovvero width[5], che appartiene al gruppo della Guida dell'oggetto. Questo menu ? avrà una sola voce che è un sottomenu, il menu a catena "Guida> contenitore" come descritto in precedenza.
L'oggetto esegue quindi il normale codice di inserimento del menu, ad eccezione del fatto che prima di inserire il relativo menu ? controlla la sesta voce della matrice OLEMENUGROUPWIDTHS . Se il valore è 1 e il nome dell'ultimo menu è ? o la stringa localizzata appropriata, l'oggetto inserisce il relativo menu Guida come sottomenu del menu ? del contenitore.
L'oggetto imposta quindi il sesto elemento di OLEMENUGROUPWIDTHS su zero e incrementa il quinto elemento di uno. In questo modo OLE è possibile sapere che il menu ? appartiene al contenitore e i messaggi di menu corrispondenti a tale menu (e i relativi sottomenu) devono essere indirizzati al contenitore. È quindi responsabilità del contenitore inoltrare WM_INITMENUPOPUP, WM_edizione Standard LECT, WM_COMMAND e altri messaggi correlati al menu che appartengono alla parte dell'oggetto del menu ? Questa operazione viene eseguita usando WM_INITMENU per cancellare un flag che indica al contenitore se l'utente è stato spostato nel menu ? dell'oggetto. Il contenitore controlla quindi WM_MENUedizione Standard LECT per l'ingresso o l'uscita da qualsiasi elemento nel menu ? che il contenitore non ha aggiunto. In caso di immissione, significa che l'utente è stato spostato in un menu oggetto, quindi il contenitore imposta il flag "nel menu della Guida dell'oggetto" e usa lo stato del flag per inoltrare qualsiasi WM_MENUedizione Standard LECT, WM_INITMENUPOPUP e WM_COMMAND messaggi, come minimo, alla finestra dell'oggetto. Al termine, il contenitore cancella il flag e quindi elabora questi stessi messaggi. Il contenitore deve usare la finestra restituita dalla funzione dell'oggetto IOleInPlaceActiveObejct::GetWindow
come destinazione per questi messaggi.
Se l'oggetto rileva uno zero nel sesto elemento di OLEMENUGROUPWIDTHS, procede in base alle normali regole OLE Documents. Questa procedura illustra i contenitori che fanno parte del menu ? e quelli che non lo fanno.
Quando l'oggetto chiama IOleInPlaceFrame::SetMenu
, prima di visualizzare la barra dei menu unita, il contenitore verifica se il menu ? include un sottomenu aggiuntivo, oltre a quello che il contenitore ha inserito. In tal caso, il contenitore lascia il relativo menu ? nella barra dei menu unita. Se il menu ? non dispone di un sottomenu aggiuntivo, il contenitore rimuoverà il relativo menu ? dalla barra dei menu unita. Questa procedura illustra gli oggetti che partecipano al merge del menu ? e quelli che non lo fanno.
Infine, quando è il momento di disassemblare il menu, l'oggetto rimuove il menu Della Guida inserito oltre a rimuovere gli altri menu inseriti. Quando il contenitore rimuove i relativi menu, rimuoverà il menu ? oltre agli altri menu inseriti.