Mescla do menu Ajuda
Quando um objeto está ativa em um contêiner, o menu de mesclagem do protocolo de documentos com OLE DB fornece controle completo do objeto no menu de Ajuda . No resultado, os tópicos da Ajuda do contêiner não estão disponíveis a menos que o usuário desativar o objeto. A arquitetura ativa de retenção de documentos expande nas regras do menu no local de mesclagem para permitir o contêiner e um documento ativo que está ativa compartilhar o menu. As novas regras são simplesmente convenções adicionais sobre o componente possui a partir do menu e como o menu compartilhado é construído.
A nova convenção é simples. Em documentos ativas, o menu de Ajuda tem dois itens de menu de nível superior organizados como segue:
Help
Container Help >
Object Help >
Por exemplo, quando uma seção do word está ativa na pasta do Office, o menu de Ajuda seria a seguinte maneira:
Help
Binder Help >
Word Help >
Ambos os itens de menu são os menus em cascata na qual todos os itens de menu adicionais específicos do contêiner e ao objeto são fornecidos para o usuário. Itens que são exibidos aqui variará com o contêiner e os objetos envolvidos.
Para construir esse menu mesclada de Ajuda , a arquitetura ativa de retenção de documentos altera o procedimento normal de documentos OLE. De acordo com documentos OLE, a barra de menus mesclada pode ter seis grupos de menus, isto é Arquivo, Editar, Contêiner, Object, 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 grupos Editar, Object, e Ajuda pertencem ao objeto. Quando o objeto desejar fazer o menu de mesclagem, cria uma barra de menus em branco e passá-la para o contêiner. O contêiner insere nos menus, chamando IOleInPlaceFrame::InsertMenus. O objeto também envia uma estrutura que é uma matriz de seis valores LONG (OLEMENUGROUPWIDTHS). Depois de inserir os menus, o contêiner marca quantos menus adicionou em cada um de seus grupos, e então retornará. O objeto insere os menus, pagando atenção à contagem de menus em cada grupo do contêiner. Finalmente, o objeto passa a barra de menus mesclada e a matriz (que contém a contagem de menus em cada grupo) ao OLE, que retorna um identificador de “opaca do descritor menu”. Posteriormente o objeto que manipulam 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, de modo que o OLE possa fazer o despacho apropriado de mensagens no menu.
No procedimento ativa alterado do documento, o objeto deverá primeiro inicializar os elementos de OLEMENUGROUPWIDTHS como zero antes de passá-lo para o contêiner. No contêiner executa uma inserção normal de menu com uma exceção: O contêiner insere um menu de Ajuda como o último item e armazena um valor de 1 () na sexta entrada a última versão de matriz de OLEMENUGROUPWIDTHS (ou seja, largura [5], que pertence ao grupo da ajuda do objeto). Esse menu de Ajuda terá apenas um item que é um submenu, “Container Help >” conectar-se o menu como descrito anteriormente.
O objeto é executado em seu código normal de inserção no menu, exceto que antes de inserir o menu de Ajuda , verifica a sexta entrada da matriz de OLEMENUGROUPWIDTHS . Se o valor for 1 e o nome do menu do último é Ajuda (ou a cadeia de caracteres localizada apropriado), o objeto insere o menu de Ajuda como o submenu do menu de Ajuda do contêiner.
O objeto depois defina o sexto elemento de OLEMENUGROUPWIDTHS como zero e incrementa o quinto por um elemento. Isso permite que o OLE saber quais o menu de Ajuda pertence ao contêiner e as mensagens de menu que correspondem a esse menu (e seus submenus) devem ser deirecionada ao contêiner. É a responsabilidade do contêiner encaminhar WM_INITMENUPOPUP, WM_SELECT, WM_COMMAND, e outras mensagens menu- relacionados que pertencem à parte do objeto no menu de Ajuda . Isso é feito usando WM_INITMENU para desmarcar um sinalizador que indica se o contêiner o usuário navegou em no menu de Ajuda do objeto. O contêiner inspeciona em WM_MENUSELECT para na entrada ou a saída de qualquer item do menu de Ajuda que o contêiner não adicionou próprio. Na entrada, significa que o usuário navegou em um menu do objeto, de modo que o contêiner define o sinalizador “no menu ajuda do objeto” e usa o estado desse sinalizador para encaminhar qualquer WM_MENUSELECT, WM_INITMENUPOPUP, e mensagens de WM_COMMAND , como um mínimo, a janela do objeto. (Na saída, o contêiner limpa o sinalizador e processa essas mesmas mensagens próprio.) O contêiner deve usar a janela retornado da função de IOleInPlaceActiveObejct::GetWindow do objeto como o destino dessas mensagens.
Se o objeto detecta um nulo no sexto elemento de OLEMENUGROUPWIDTHS, continua de acordo com as regras normais de documentos OLE. Esse procedimento abrange os contêineres que participam no menu de Ajuda que mescla bem como os que não oferecem.
Quando o objeto chama IOleInPlaceFrame::SetMenu, antes de exibir a barra de menus mesclada, o contêiner verifica se o menu de Ajuda tem um submenu adicional, além do que o contêiner foi inserido. Nesse caso, o contêiner permite que o menu de Ajuda na barra de menus mesclada. Se o menu de Ajuda não tem um submenu adicional, o contêiner removerá o menu de Ajuda na barra de menus mesclada. Esse procedimento abrange objetos que participam no menu de Ajuda que mescla bem como os que não oferecem.
Finalmente, quando está na hora de desmontar o menu, o objeto inserido remove o menu de Ajuda além do qual remover os outros menus inseridos. Quando o contêiner remove os menus, removerá o menu de Ajuda além dos outros menus que inseriu.