Condividi tramite


Unione dei menu

Quando un oggetto è attivo all'interno di un contenitore, il protocollo di fusione dei menu di documenti OLE fornisce all'oggetto il controllo completo del menu Guida 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 Aiuto include due voci di primo livello organizzate come segue:

Help

Container Help >

Object Help >

Ad esempio, quando una sezione di Word è attiva in Office Binder, il menu Guida 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 costituita da 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 l'handle e la barra dei menu combinata 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 Help come ultima voce e archivia un valore di 1 nell'ultima voce (sesto) della matrice OLEMENUGROUPWIDTHS, ovvero width[5], che appartiene al gruppo della Guida dell'oggetto. Questo menu Guida avrà una sola voce che è un sottomenu, il menu a cascata "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 suo menu Aiuto controlla la sesta voce della matrice OLEMENUGROUPWIDTHS. Se il valore è 1 e il nome dell'ultimo menu è Help o la stringa localizzata appropriata, l'oggetto inserisce il suo menu Help come sottomenu del menu Help del contenitore.

L'oggetto imposta quindi il sesto elemento di OLEMENUGROUPWIDTHS su zero e incrementa il quinto elemento di uno. In questo modo, OLE sa che il menu Aiuto appartiene al contenitore e i messaggi di menu corrispondenti a tale menu (e ai relativi sottomenu) devono essere indirizzati al contenitore. È quindi responsabilità del contenitore inoltrare WM_INITMENUPOPUP, WM_SELECT, WM_COMMAND e altri messaggi correlati al menu che appartengono alla parte dell'oggetto del menu Help Questa operazione viene eseguita usando WM_INITMENU per cancellare un flag che indica al contenitore se l'utente ha navigato nel menu Guida dell'oggetto. Il contenitore quindi controlla WM_MENUSELECT per l'ingresso o l'uscita da qualsiasi voce nel menu Help che non ha aggiunto da sé. In caso di ingresso, significa che l'utente è entrato in un menu oggetto, quindi il contenitore imposta il flag "nel menu Guida dell'oggetto" e utilizza lo stato di quel flag per inoltrare, come minimo, qualsiasi messaggio WM_MENUSELECT, WM_INITMENUPOPUP e WM_COMMAND 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 copre i contenitori che partecipano alla fusione del menu Aiuto e quelli che non partecipano.

Quando l'oggetto chiama IOleInPlaceFrame::SetMenu, prima di visualizzare la barra dei menu unita, il contenitore verifica se il menu Aiuto include un sottomenu aggiuntivo, oltre a quello che il contenitore ha inserito. In tal caso, il contenitore lascia il relativo menu Aiuto 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 copre gli oggetti che partecipano alla fusione del menu Aiuto così come quelli che non partecipano.

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 menu, rimuoverà il menu Help oltre agli altri menu inseriti.

Vedere anche

Contenitori di documenti attivi