Nota:
El acceso a esta página requiere autorización. Puede intentar iniciar sesión o cambiar directorios.
El acceso a esta página requiere autorización. Puede intentar cambiar los directorios.
Cuando un objeto está activo dentro de un contenedor, el protocolo de combinación de menús de documentos OLE proporciona al objeto control completo del menú Ayuda . Como resultado, los temas de Ayuda del contenedor no están disponibles a menos que el usuario desactive el objeto. La arquitectura de contención del documento activo amplía las reglas de fusión de menús en contexto para permitir que el contenedor y un documento activo puedan compartir el menú. Las nuevas reglas son simplemente convenciones adicionales sobre qué componente posee qué parte del menú y cómo se construye el menú compartido.
La nueva convención es sencilla. En los documentos activos, el menú Ayuda tiene dos elementos de menú de nivel superior organizados de la siguiente manera:
Help
Container Help >
Object Help >
Por ejemplo, cuando una sección de Word está activa en el enlazador de Office, el menú Ayuda aparecerá de la siguiente manera:
Help
Binder Help >
Word Help >
Ambos elementos de menú son menús en cascada en los que se proporcionan al usuario los elementos de menú adicionales específicos del contenedor y el objeto. Los elementos que aparecen aquí variarán con el contenedor y los objetos implicados.
Para construir este menú de Ayuda combinado, la arquitectura de contención del documento activo modifica el procedimiento normal de los documentos OLE. Según documentos OLE, la barra de menús combinada puede tener seis grupos de menús, a saber , Archivo, Editar, Contenedor, Objeto, Ventana, Ayuda, en ese orden. En cada grupo, puede haber cero o más menús. Los grupos File, Container y Window pertenecen al contenedor y los grupos Edit, Object y Help pertenecen al objeto . Cuando el objeto desea realizar la combinación de menús, crea una barra de menús en blanco y la pasa al contenedor. A continuación, el contenedor inserta sus menús mediante una llamada a IOleInPlaceFrame::InsertMenus. El objeto también pasa una estructura que es una matriz de seis valores LONG (OLEMENUGROUPWIDTHS). Después de insertar los menús, el contenedor marca cuántos menús ha agregado en cada uno de sus grupos y, a continuación, devuelve. A continuación, el objeto inserta sus menús, prestando atención al recuento de menús de cada grupo de contenedores. Por último, el objeto pasa la barra de menús combinada y la matriz (que contiene el recuento de menús de cada grupo) a OLE, que devuelve un identificador "descriptor de menú" opaco. Más adelante, el objeto pasa ese manipulador y la barra de menús combinada al contenedor, a través de IOleInPlaceFrame::SetMenu. En este momento, el contenedor muestra la barra de menús combinada y también pasa el identificador a OLE, para que OLE pueda realizar el envío adecuado de mensajes de menú.
En el procedimiento de documento activo modificado, el objeto primero debe inicializar los elementos OLEMENUGROUPWIDTHS en cero antes de pasarlos al contenedor. A continuación, el contenedor realiza una inserción de menú normal con una excepción: el contenedor inserta un menú Ayuda como último elemento y almacena un valor de 1 en la última entrada (sexta) de la matriz OLEMENUGROUPWIDTHS (es decir, width[5], que pertenece al grupo ayuda del objeto). Este menú ayuda solo tendrá un elemento que es un submenú, el menú en cascada "Ayuda del contenedor>", como se ha descrito anteriormente.
A continuación, el objeto ejecuta su código de inserción de menú normal, excepto que antes de insertar su menú Ayuda , comprueba la sexta entrada de la matriz OLEMENUGROUPWIDTHS . Si el valor es 1 y el nombre del último menú es Ayuda (o la cadena localizada adecuada), el objeto inserta su menú Ayuda como submenú del menú Ayuda del menú Ayuda del contenedor.
A continuación, el objeto establece el sexto elemento de OLEMENUGROUPWIDTHS en cero e incrementa el quinto elemento por uno. Esto permite a OLE saber que el menú Ayuda pertenece al contenedor y los mensajes de menú correspondientes a ese menú (y su submenú) deben enrutarse al contenedor. A continuación, es responsabilidad del contenedor reenviar WM_INITMENUPOPUP, WM_SELECT, WM_COMMAND y otros mensajes relacionados con menús que pertenecen a la parte del objeto del menú Ayuda . Esto se logra mediante WM_INITMENU para borrar una marca que indica al contenedor si el usuario ha navegado al menú Ayuda del objeto. A continuación, el contenedor inspecciona WM_MENUSELECT para la entrada o salida de cualquier elemento del menú Ayuda que el propio contenedor no agregó. En la entrada, significa que el usuario ha navegado a un menú de objetos, por lo que el contenedor establece la marca "en el menú Ayuda de objeto" y usa el estado de esa marca para reenviar los mensajes de WM_MENUSELECT, WM_INITMENUPOPUP y WM_COMMAND , como mínimo, a la ventana del objeto. (Al salir, el contenedor borra la marca y, a continuación, procesa estos mismos mensajes). El contenedor debe usar la ventana devuelta desde la función del IOleInPlaceActiveObejct::GetWindow objeto como destino para estos mensajes.
Si el objeto detecta un cero en el sexto elemento de OLEMENUGROUPWIDTHS, continúa según las reglas normales de documentos OLE. Este procedimiento cubre los contenedores que participan en la combinación del menú Ayuda, así como aquellos que no lo hacen.
Cuando el objeto llama a IOleInPlaceFrame::SetMenu, antes de mostrar la barra de menús combinada, el contenedor comprueba si el menú Ayuda tiene un submenú adicional, además de lo que el contenedor ha insertado. Si es así, el contenedor deja su menú Ayuda en la barra de menús combinada. Si el menú Ayuda no tiene un submenú adicional, el contenedor quitará su menú Ayuda de la barra de menús combinada. Este procedimiento cubre los objetos que participan en la combinación del menú Ayuda, así como aquellos que no lo hacen.
Por último, cuando es el momento de desensamblar el menú, el objeto quita el menú Ayuda insertado además de quitar los otros menús insertados. Cuando el contenedor quita sus menús, quitará su menú Ayuda además de los demás menús que ha insertado.