Fusion des menus Aide
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 au menu Aide . Par conséquent, les rubriques d'aide du conteneur ne sont pas disponibles à moins que l'utilisateur désactive l'objet. L'architecture de la relation contenant-contenu de document actif examine les règles de la fusion de menus sur place afin d'autoriser le conteneur et un document actif à partager le menu. Les nouvelles règles sont simplement des conventions supplémentaires sur quel composant possède quelle partie du menu et comment le menu partagé est créé.
La nouvelle convention est simple. Dans les documents actifs, le menu Aide comporte deux éléments de menu de niveau supérieur organisés comme suit :
Help
Container Help >
Object Help >
Par exemple, lorsqu’une section Word est active dans le classeur Bureau, le menu d’aide s’affiche comme suit :
Help
Binder Help >
Word Help >
Les deux éléments de menu sont des menus en cascade dans lesquels tous les éléments de menu supplémentaires spécifiques au conteneur et l'objet sont accessibles à l'utilisateur. Les éléments affichés ici varie avec le conteneur et les objets concernés.
Pour construire ce menu d’aide fusionné, l’architecture d’isolement de document actif modifie la procédure OLE Documents normale. Selon OLE Documents, la barre de menus fusionnée peut avoir six groupes de menus, à savoir Fichier, Modifier, Conteneur, Objet, Fenêtre, Aide, dans cet ordre. À chaque groupe, il peut y avoir zéro menus ou plus. Les groupes File, Container et Window appartiennent au conteneur et aux groupes Edit, Object et Help appartiennent à l’objet. Lorsque l'objet souhaite réaliser 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 transmet également une structure qui est un tableau de six valeurs LONG (OLEMENUGROUPWIDTHS). Après avoir inséré les menus, le conteneur marque le nombre de menus qu'il a ajoutés dans chacun de ses groupes, puis effectue un retour. L'objet insère ses menus, en tenant compte du nombre de menus dans chaque groupe de conteneurs. Enfin, l'objet passe la barre de menus fusionnée et le tableau (contenant le nombre de menus dans chaque groupe) à OLE, qui retourne un handle opaque "descripteur de menu". Plus tard, l’objet passe ce handle 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 le handle à l’objet OLE, afin que ce dernier puisse distribuer des messages de menu approprié.
Dans la procédure de document active modifiée, l’objet doit d’abord initialiser les éléments OLEMENUGROUPWIDTHS sur zéro avant de le transmettre au conteneur. Ensuite, le conteneur effectue une insertion de menu normale avec une exception : le conteneur insère un menu d’aide en tant que dernier élément et stocke une valeur de 1 dans la dernière (sixième) entrée du tableau OLEMENUGROUPWIDTHS (autrement dit, width[5], qui appartient au groupe d’aide de l’objet). Ce menu d’aide n’aura qu’un seul élément qui est un sous-menu, le menu cascade « Aide> du conteneur » 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 d’aide, il case activée la sixième entrée du tableau OLEMENUGROUPWIDTHS. Si la valeur est 1 et que le nom du dernier menu est Aide (ou la chaîne localisée appropriée), l’objet insère son menu Aide en tant que sous-menu de l’aide du conteneur.
L’objet définit ensuite le sixième élément d’OLEMENUGROUPWIDTHS sur zéro et incrémente le cinquième élément par un. Cela permet à OLE de savoir que le menu d’aide appartient au conteneur et que les messages de menu correspondant à ce menu (et son sous-menu) doivent être routés vers le conteneur. Il incombe ensuite au conteneur de transférer WM_INITMENUPOPUP, WM_SELECT, WM_COMMAND et d’autres messages liés au menu qui appartiennent à la partie de l’objet du menu Aide. Pour ce faire, utilisez WM_INITMENU pour effacer un indicateur qui indique au conteneur si l’utilisateur a accédé au menu d’aide de l’objet. Le conteneur surveille ensuite WM_MENUSELECT d’entrée ou de sortie d’un élément dans le menu d’aide que le conteneur n’a pas ajouté lui-même. Lors de l’entrée, cela signifie que l’utilisateur a accédé à un menu objet. Par conséquent, le conteneur définit l’indicateur « menu Aide sur l’objet » et utilise l’état de cet indicateur pour transférer les WM_MENUSELECT, les WM_INITMENUPOPUP et les messages WM_COMMAND , au minimum, à la fenêtre d’objet. (À la sortie, le conteneur efface l’indicateur, puis traite ces mêmes messages lui-même.) Le conteneur doit utiliser la fenêtre retournée par la fonction de IOleInPlaceActiveObejct::GetWindow
l’objet comme destination pour ces messages.
Si l’objet détecte un zéro dans le sixième élément d’OLEMENUGROUPWIDTHS, il se poursuit en fonction des règles OLE Documents normales. Cette procédure couvre les conteneurs qui participent à la fusion de menus d’aide ainsi qu’à ceux qui ne le font pas.
Lorsque l’objet appelle IOleInPlaceFrame::SetMenu
, avant d’afficher la barre de menus fusionnée, le conteneur case activée indique si le menu d’aide a un sous-menu supplémentaire, en plus de ce que le conteneur a inséré. Si c’est le cas, le conteneur quitte son menu d’aide dans la barre de menus fusionnée. Si le menu d’aide n’a pas de sous-menu supplémentaire, le conteneur supprime son menu d’aide de la barre de menus fusionnée. Cette procédure couvre les objets qui participent à la fusion de menus d’aide ainsi que ceux qui ne le font pas.
Enfin, quand il est temps de désassembler le menu, l’objet supprime le menu d’aide inséré en plus de supprimer les autres menus insérés. Lorsque le conteneur supprime ses menus, il supprime son menu d’aide en plus des autres menus qu’il a insérés.