Remarque
L’accès à cette page nécessite une autorisation. Vous pouvez essayer de vous connecter ou de modifier des répertoires.
L’accès à cette page nécessite une autorisation. Vous pouvez essayer de modifier des répertoires.
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, sauf si l’utilisateur désactive l’objet. L’architecture de contenu du document actif s’étend sur les règles de fusion de menus sur place pour permettre au conteneur et à un document actif actif de partager le menu. Les nouvelles règles sont simplement des conventions supplémentaires sur le composant propriétaire de la partie du menu et la façon dont le menu partagé est construit.
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 Office, le menu d’aide s’affiche comme suit :
Help
Binder Help >
Word Help >
Les deux éléments de menu sont des menus en cascade sous lesquels tous les éléments de menu supplémentaires spécifiques au conteneur et l’objet sont fournis à l’utilisateur. Les éléments qui apparaissent ici varient en fonction du conteneur et des objets impliqués.
Pour construire ce menu d’aide fusionné, l’architecture de conteneur de document actif modifie la procédure normale des OLE Documents. 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. Dans chaque groupe, il peut y avoir zéro ou plusieurs menus. Les groupes File, Container et Window appartiennent au conteneur et aux groupes Edit, Object et Help appartiennent à l’objet. Lorsque l’objet souhaite effectuer la fusion de menus, il crée une barre de menus vide et le transmet 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 retourne. Ensuite, l’objet insère ses menus, en faisant attention au nombre de menus dans chaque groupe de conteneurs. Enfin, l’objet passe la barre de menus fusionnée et le tableau (qui contient le nombre de menus dans chaque groupe) à OLE, qui retourne un handle « descripteur de menu » opaque. Par la suite, l'objet transmet 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 transmet également le handle à OLE, afin que OLE puisse effectuer une répartition appropriée des messages de menu.
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 vérifie 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 Aide de l’objet. Le conteneur surveille ensuite WM_MENUSELECT pour entrer ou quitter n’importe quel élément du menu 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 messages WM_MENUSELECT, WM_INITMENUPOPUP et 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 vérifie 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.