Compartilhar via


Mescla do menu Ajuda

Quando um objeto está ativo dentro de um contêiner, o protocolo de mesclagem de menus de Documentos OLE fornece ao objeto controle completo do menu Ajuda . Como resultado, os tópicos da Ajuda do contêiner não estão disponíveis, a menos que o usuário desative o objeto. A arquitetura de contenção de documentos ativos se expande nas regras para a mesclagem de menu in-loco para permitir que o contêiner e um documento ativo que esteja ativo compartilhem o menu. As novas regras são simplesmente convenções adicionais sobre qual componente possui qual parte do menu e como o menu compartilhado é construído.

A nova convenção é simples. Em documentos ativos, o menu Ajuda tem dois itens de menu de nível superior organizados da seguinte maneira:

Help

Container Help >

Object Help >

Por exemplo, quando uma seção do Word estiver ativa no Associador do Office, o menu Ajuda aparecerá da seguinte maneira:

Help

Binder Help >

Word Help >

Ambos os itens de menu são menus em cascata sob os quais quaisquer itens de menu adicionais específicos ao contêiner e o objeto são fornecidos ao usuário. Os itens exibidos aqui variarão de acordo com o contêiner e os objetos envolvidos.

Para construir este menu Ajuda mesclado, a arquitetura de contenção de documentos ativos modifica o procedimento normal dos Documentos OLE. De acordo com documentos OLE, a barra de menus mesclada pode ter seis grupos de menus, ou seja, Arquivo, Edição, Contêiner, Objeto, Janela, Ajuda, nessa ordem. Em cada grupo, pode haver zero ou mais menus. Os grupos Arquivo, Contêiner e Janela pertencem ao contêiner e os grupos Editar, Objeto e Ajuda pertencem ao objeto. Quando o objeto deseja fazer a mesclagem de menus, ele cria uma barra de menus em branco e a passa para o contêiner. Em seguida, o contêiner insere seus menus chamando IOleInPlaceFrame::InsertMenus. O objeto também passa uma estrutura que é uma matriz de seis valores LONG (OLEMENUGROUPWIDTHS). Depois de inserir os menus, o contêiner marca quantos menus ele adicionou em cada um de seus grupos e retorna. Em seguida, o objeto insere seus menus, prestando atenção à contagem de menus em cada grupo de contêineres. Por fim, o objeto passa a barra de menus mesclada e a matriz (que contém a contagem de menus em cada grupo) para o OLE, que retorna um identificador opaco de "descritor de menu". Posteriormente, o objeto passa esse identificador e a barra de menus mesclada para o contêiner, por meio de IOleInPlaceFrame::SetMenu. Neste momento, o contêiner exibe a barra de menus mesclada e também passa o identificador para o OLE, para que o OLE possa fazer o envio adequado de mensagens de menu.

No procedimento de documento ativo modificado, o objeto deve primeiro inicializar os elementos OLEMENUGROUPWIDTHS para zero antes de passá-lo para o contêiner. Em seguida, o contêiner executa uma inserção de menu normal com uma exceção: o contêiner insere um menu ajuda como o último item e armazena um valor de 1 na última (sexta) entrada da matriz OLEMENUGROUPWIDTHS (ou seja, largura[5], que pertence ao grupo de Ajuda do objeto). Este menu ajuda terá apenas um item que é um submenu, o menu em cascata "Ajuda do Contêiner",> conforme descrito anteriormente.

Em seguida, o objeto executa seu código de inserção de menu normal, exceto que antes de inserir seu menu ajuda , ele verifica a sexta entrada da matriz OLEMENUGROUPWIDTHS . Se o valor for 1 e o nome do último menu for Ajuda (ou a cadeia de caracteres localizada apropriada), o objeto inserirá seu menu ajuda como submenu do menu Ajuda do contêiner.

Em seguida, o objeto define o sexto elemento de OLEMENUGROUPWIDTHS como zero e incrementa o quinto elemento por um. Isso permite que o OLE saiba que o menu Ajuda pertence ao contêiner e as mensagens de menu correspondentes a esse menu (e seu submenu) devem ser roteadas para o contêiner. Em seguida, é responsabilidade do contêiner encaminhar WM_INITMENUPOPUP, WM_SELECT, WM_COMMAND e outras mensagens relacionadas ao menu que pertencem à parte do objeto do menu Ajuda . Isso é feito usando WM_INITMENU para limpar um sinalizador que informa ao contêiner se o usuário navegou no menu ajuda do objeto. Em seguida, o contêiner observa WM_MENUSELECT para a entrada em ou saída de qualquer item no menu Ajuda que o contêiner não adicionou por si só. Na entrada, significa que o usuário navegou até um menu de objeto, de modo que o contêiner define o sinalizador "menu de Ajuda no objeto" e usa o estado desse sinalizador para, no mínimo, encaminhar quaisquer mensagens WM_MENUSELECT, WM_INITMENUPOPUP e WM_COMMAND para a janela do objeto. (Na saída, o contêiner limpa o sinalizador e processa essas mesmas mensagens por conta própria.) O contêiner deve usar a janela retornada pela função do objeto IOleInPlaceActiveObejct::GetWindow como o destino dessas mensagens.

Se o objeto detectar um zero no sexto elemento de OLEMENUGROUPWIDTHS, ele continuará de acordo com as regras normais de Documentos OLE. Este procedimento abrange contêineres que participam da mesclagem do menu ajuda , bem como aqueles que não participam.

Quando o objeto chama IOleInPlaceFrame::SetMenu, antes de exibir a barra de menus mesclada, o contêiner verifica se o menu ajuda tem um submenu adicional, além do que o contêiner inseriu. Nesse caso, o contêiner deixa o menu Ajuda na barra de menus mesclada. Se o menu Ajuda não tiver um submenu adicional, o contêiner removerá seu menu ajuda da barra de menus mesclada. Este procedimento abrange objetos que participam da mesclagem do menu Ajuda, assim como aqueles que não.

Por fim, quando é hora de desmontar o menu, o objeto remove o menu ajuda inserido, além de remover os outros menus inseridos. Quando o contêiner remover seus menus, ele removerá seu menu de Ajuda , além dos outros menus inseridos.

Consulte também

Contêineres de documentos ativos