Ajuda mesclagem de menus
Quando um objeto está ativo dentro de um recipiente, o menu mesclar o protocolo de documentos OLE permite o controle total do objeto do Ajuda menu.Como resultado, tópicos da Ajuda do contêiner não estão disponíveis a menos que o usuário desativa o objeto.As regras para menu in loco mesclagem para permitir que o recipiente e um documento ativo está ativo para compartilhar o menu expande a arquitetura de confinamento do documento ativo.As novas regras são convenções simplesmente adicionais sobre qual componente possui que parte do menu e como o menu compartilhado é construído.
A nova convenção é simple.Em documentos ativos, o Ajuda menu tem dois itens de menu de nível superior organizados da seguinte forma:
Help
Container Help >
Object Help >
Por exemplo, quando uma seção do Word está ativa no Office Binder, em seguida, a Ajuda menu apareceria da seguinte forma:
Help
Binder Help >
Word Help >
Ambos os itens de menu estão menus em cascata em que quaisquer itens de menu adicionais específicos para o recipiente e objeto são fornecidos para o usuário.Quais itens aparecem aqui irá variar com o contêiner e objetos envolvidos.
Para construir esse mesclado Ajuda menu, a arquitetura de confinamento do documento ativo modifica o procedimento de documentos OLE normal.De acordo com documentos OLE, a barra de menus mescladas pode ter seis grupos de menus, ou seja, arquivo, Editar, contêiner, Object, janela, Ajuda, em que ordem.Em cada grupo pode ser zero ou mais menus.Grupos de arquivo, contêiner, e janela pertencem ao recipiente e os grupos de 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 passa para o recipiente.O contêiner insere seus menus, chamando IOleInPlaceFrame::InsertMenus.O objeto também passa uma estrutura que é uma matriz de seis valores longos (OLEMENUGROUPWIDTHS).Depois de inserir os menus, o contêiner marca menus quantas ele adicionado 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 recipiente.Finalmente, o objeto passa a barra de menus mescladas e a matriz (que contém a contagem de menus em cada grupo) para OLE, que retorna um opaco "descritor de menu" manipular.Mais tarde o objeto passa esse identificador e a barra de menus mescladas para o recipiente via IOleInPlaceFrame::SetMenu.Neste momento, o contêiner exibe a barra de menus mescladas e também passa a alça para OLE, para que o OLE pode fazer a expedição adequada das mensagens de menu.
No procedimento do documento ativo modificado, o objeto deve primeiro iniciar o OLEMENUGROUPWIDTHS elementos para zero antes de passá-la para o contêiner.E o contêiner executa uma inserção menu normal com uma exceção: O contêiner insere um Ajuda menu como o último item e armazena um valor 1 na última entrada (o sexto) do OLEMENUGROUPWIDTHS matriz (isto é, largura [5], que pertence ao grupo de Ajuda do objeto).Isso Ajuda menu terá somente um item que é um submenu, o "contêiner ajuda >" menu em cascata conforme descrito anteriormente.
O objeto executa seu código de inserção menu normal, exceto que antes de inserir sua Ajuda menu, ele verifica a entrada sexta a OLEMENUGROUPWIDTHS matriz.Se o valor é 1 e o nome do último menu é Ajuda (ou apropriado seqüência localizada), em seguida, insere o objeto de sua Ajuda menu como submenu do recipiente do Ajuda menu.
O objeto, em seguida, define o elemento sexto de OLEMENUGROUPWIDTHS como zero e incrementa o elemento quinto por um.Isso permite OLE saber que o Ajuda menu pertence ao contêiner e as mensagens de menu correspondente ao menu (e seus submenus) devem ser roteadas para o recipiente.Em seguida, é responsabilidade do contêiner para encaminhar WM_INITMENUPOPUP, WM_SELECT, WM_COMMANDe outras mensagens relacionadas menu pertencentes à parte do objeto de Ajuda menu.Isso é realizado usando WM_INITMENU desmarcar um sinalizador que informa o contêiner se o usuário navegou para o objeto Ajuda menu.Então observa o recipiente WM_MENUSELECT para entrada ou saída de qualquer item de Ajuda menu recipiente não adicionou o próprio.Na entrada, isso significa que o usuário tenha navegado em um menu de objeto para o contêiner define o sinalizador "no menu de Ajuda do objeto" e usa o estado do sinalizador para encaminhar qualquer WM_MENUSELECT, WM_INITMENUPOPUP, e WM_COMMAND mensagens, como mínimo, para a janela de objeto.(Ao sair, o contêiner limpa o sinalizador e processa essas mesmas mensagens próprio.) O contêiner deve usar a janela retornada a partir do objeto IOleInPlaceActiveObejct::GetWindow funcionar como destino para essas mensagens.
Se o objeto detecta um zero no sexto elemento do OLEMENUGROUPWIDTHS, ele continuará de acordo com as regras de documentos OLE normais.Este procedimento abordará recipientes que participam Ajuda menu mesclar, bem como aqueles que não.
Quando o objeto chama IOleInPlaceFrame::SetMenu, antes de exibir mesclado barra de menus, as verificações de contêiner se o Ajuda menu tem um submenu adicional, além de que inseriu o recipiente.Se, o contêiner deixa seu Ajuda menu na barra de menu mesclado.Se o Ajuda menu não tem um submenu adicional, o contêiner removerá seus Ajuda menu na barra de menus mescladas.Este procedimento abordará objetos que participam Ajuda menu mesclar, bem como aqueles que não.
Finalmente, quando é hora de desmontar o menu, o objeto remove o inserido Ajuda menu, além de remover o outro inseridos menus.Quando o contêiner remove seus menus, ele removerá seus Ajuda menu, além de outros menus que foi inserido.