Compartir a través de


Combinación del menú Ayuda

Cuando un objeto está activo dentro de un contenedor, el protocolo de combinación de menús de DOCUMENTOS OLE proporciona al objeto el 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 se expande en las reglas de combinación de menús en el lugar para permitir que el contenedor y un documento activo que esté operante compartan 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 cuales los elementos de menú adicionales específicos del contenedor y el objeto se proporcionan al usuario. Los elementos que aparecen aquí variarán dependiendo el contenedor y los objetos implicados.

Para construir este menú Ayuda combinado, la arquitectura de contención de documentos activa modifica el procedimiento normal de documentos OLE. Según los documentos OLE, la barra de menús combinada puede tener seis grupos de menús, los cuales son Archivo, Edición, Contenedor, Objeto, Ventana, Ayuda, en ese orden. En cada grupo, puede haber cero o más menús. Los grupos Archivo, Contenedor y Ventana pertenecen al contenedor y los grupos Edición, Objecto y Ayuda pertenecen al objeto. Cuando el objeto desea realizar la combinación de los menús, crea una barra de menús en blanco y la pasa al contenedor. Entonces, 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 el número de menús que agregó en cada uno de sus grupos y después regresa. Entonces, 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 manipulador "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 manipulador a OLE, para que este pueda realizar el envío adecuado de mensajes del menú.

En el procedimiento del documento activo modificado, el objeto primero debe inicializar los elementos OLEMENUGROUPWIDTHS en cero antes de pasarlo al contenedor. Entonces, 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, salvo que antes de insertar su menú Ayuda, compruebe la sexta entrada de la matriz OLEMENUGROUPWIDTHS. Si el valor es 1 y el nombre del último menú es Ayuda (o la cadena localizada es adecuada), el objeto inserta su menú Ayuda como submenú del menú Ayuda del contenedor.

Entonces, 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 sus submenús) se deben enrutar al contenedor. A continuación, es responsabilidad del contenedor reenviar WM_INITMENUPOPUP, WM_SELECT, WM_COMMAND y otros mensajes relacionados con el menú 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. Entonces, el contenedor supervisa WM_MENUSELECT para la entrada o salida de cualquier elemento del menú Ayuda que el contenedor no se agregó por sí mismo. 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 objetos" y usa el estado de esa marca para reenviar cualquier mensaje WM_MENUSELECT, WM_INITMENUPOPUP y WM_COMMAND, como mínimo, en la ventana del objeto. (Al salir, el contenedor borra la marca y después procesa estos mismos mensajes). El contenedor debe usar la ventana devuelta de la función del objeto IOleInPlaceActiveObejct::GetWindow como destino de estos mensajes.

Si el objeto detecta un cero en el sexto elemento de OLEMENUGROUPWIDTHS, continúa según las reglas normales de los 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ú combinada, el contenedor comprueba si el menú Ayuda tiene un submenú adicional, además de lo que ha insertado el contenedor. Si es así, el contenedor deja su menú Ayuda en la barra de menú combinada. Si el menú Ayuda no tiene un submenú adicional, el contenedor quitará su menú Ayuda de la barra de menú 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 y también quita los otros menús insertados. Cuando el contenedor quita sus menús, quitará su menú Ayuda y también los demás menús que ha insertado.

Consulte también

Contenedores de documentos activos