Partager via


Fusion de menu ?

Lorsqu'un objet est actif dans un conteneur, le protocole de fusion de menus de documents OLE donne le contrôle complet de l'objet dans le menu de Aide .Par conséquent, les rubriques d'aide du conteneur sont pas disponibles à moins que l'utilisateur désactive l'objet.L'architecture de relation contenant-contenu de document actif examine les règles pour la fusion de menus sur place autorise le conteneur et un document actif qui est actif pour partager le menu.Les nouvelles règles sont les conventions simplement supplémentaires sur le composant possède quelle partie du menu et comment le menu partagé est construit.

La nouvelle convention est simple.Dans les documents actifs, le menu de Aide a deux éléments de menu de niveau supérieur organisés de la façon suivante :

Help

Container Help >

Object Help >

Par exemple, lorsqu'une section de Word est actif dans le classeur Office, puis le menu de Aide apparaîtrait comme suit :

Help

Binder Help >

Word Help >

Les deux éléments de menu sont des menus en cascade sous lequel tous les éléments de menu supplémentaires spécifiques au conteneur et à l'objet sont fournis à l'utilisateur.Les éléments apparaissent ici varie avec le conteneur et les objets concernés.

Pour construire ce menu fusionné de Aide , l'architecture de relation contenant-contenu de document actif modifie la notion de procédure normale de documents.En fonction de documents OLE, la barre de menus fusionnée peut avoir six groupes de menus, à savoir Fichier, Edit, Container, Object, Fenêtre, Aide, dans cet ordre.À chaque groupe, il peut y avoir plusieurs menus ou plus.Les groupes Fichier, Container, et Fenêtre appartiennent au conteneur et les groupes Edit, Object, et Aide appartiennent à l'objet.Lorsque l'objet souhaite effectuer la fusion de menus, il crée une barre de menus vide et la passe au conteneur.Le conteneur insère ensuite ses menus, en appelant IOleInPlaceFrame::InsertMenus.L'objet passe également une structure qui est un tableau de six LONGUES valeurs (OLEMENUGROUPWIDTHS).Après avoir inséré les menus, le conteneur marque le nombre de menus il a ajoutés dans chacun de ses groupes, puis retourne.L'objet insère ses menus, prêtant l'attention au nombre de menus à chaque groupe de conteneur.Enfin, l'objet passe la barre de menus fusionnée et tableau (qui contient le nombre de menus à chaque groupe) OLE, qui retourne un handle opaque « du descripteur de menu ».Ultérieurement les opérations d'objet qui gèrent et la barre de menus fusionnée au conteneur, via IOleInPlaceFrame::SetMenu.À ce stade, le conteneur affiche la barre de menus fusionnée et passe également le handle vers OLE, afin qu'OLE puisse faire distribuer approprié des messages de menu.

Dans la procédure de modification de document actif, l'objet doit d'abord initialiser les éléments d' OLEMENUGROUPWIDTHS à zéro avant de les passer au conteneur.Le conteneur exécute une insertion normale de menu avec une exception : Le conteneur insère un menu de Aide comme le dernier élément et stocke une valeur de 1 dans la dernière (sixième) entrée de la matrice d' OLEMENUGROUPWIDTHS (autrement dit, largeur [5], qui appartient à un groupe de l'utilisation de l'objet).Ce menu de Aide reste qu'un élément qui est un sous-menu, le menu de cascade « de > deContainer Help  » comme décrit précédemment.

L'objet exécute ensuite son code d'insertion de menu normal, sauf qu'avant d'insérer son menu de Aide , il vérifie la sixième entrée de la matrice d' OLEMENUGROUPWIDTHS .Si la valeur est 1 et le nom du dernier menu est Aide (ou la chaîne localisée appropriée), l'objet insère le menu de Aide comme sous-menu du menu de Aide du conteneur.

L'objet ensuite définit du sixième élément d' OLEMENUGROUPWIDTHS à zéro et incrémente le cinquième élément par un.Cela fait OLE savoir que le menu de Aide appartient au conteneur et les messages de menu correspondant à ce menu (et à ses sous-menus) doivent être routés au conteneur.C'est la responsabilité du conteneur de transférer WM_INITMENUPOPUP, WM_SELECT, WM_COMMAND, et d'autres messages menu-mis en relation qui appartiennent à la partie de l'objet dans le menu de Aide .Cela est accompli à l'aide de WM_INITMENU pour désactiver un indicateur qui spécifie le conteneur si l'utilisateur a navigué dans le menu de Aide de l'objet.Le conteneur recherche ensuite WM_MENUSELECT pour l'entrée ou la sortie de n'importe quel élément dans le menu de Aide que le conteneur n'a pas ajouté lui-même.Lors de l'entrée, qui signifie que l'utilisateur a navigué dans un menu d'objet, donc le conteneur définit l'indicateur « dans d'objet menu ? » et utilise l'état de cet indicateur pour transférer tous WM_MENUSELECT, WM_INITMENUPOPUP, et messages de WM_COMMAND , comme un minimum, dans la fenêtre d'objet.(Dans la sortie, le conteneur désactive la balise puis traite ces mêmes messages elle-même.) Le conteneur doit utiliser la fenêtre retournée par la fonction d' IOleInPlaceActiveObejct::GetWindow de l'objet comme destination pour ces messages.

Si l'objet détecte un zéro du sixième élément d' OLEMENUGROUPWIDTHS, il se poursuit selon les règles OLE normales de documents.Cette procédure décrit les conteneurs qui participent à la fusion de menus du Aide ainsi que ceux qui ne le font pas.

Lorsque l'objet appelle IOleInPlaceFrame::SetMenu, avant d'afficher la barre de menus fusionnée, le conteneur vérifie si le menu de Aide a un sous-menu supplémentaire, en plus de ce que le conteneur est inséré.Si tel est le cas, le conteneur permet de son menu de Aide dans la barre de menus fusionnées.Si le menu de Aide n'a pas de sous-menu supplémentaire, le conteneur supprime son menu de Aide de la barre de menus fusionnées.Cette procédure décrit les objets qui participent à la fusion de menus du Aide ainsi que ceux qui ne le font pas.

Enfin, lorsqu'il est temps pour désassembler le menu, l'objet supprime le menu inséré de Aide en plus de supprimer les autres menus insérés.Lorsque le conteneur supprime ses menus, il supprime son menu de Aide en plus de les autres menus qu'il a inséré.

Voir aussi

Concepts

Conteneur de documents actifs