Nota
O acesso a esta página requer autorização. Podes tentar iniciar sessão ou mudar de diretório.
O acesso a esta página requer autorização. Podes tentar mudar de diretório.
Quando um objeto está ativo dentro de um contêiner, o protocolo de mesclagem de menu de documentos OLE dá 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 ativa expande as regras de mesclagem de menu no local para permitir que o contêiner e um documento que está 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 forma:
Help
Container Help >
Object Help >
Por exemplo, quando uma seção do Word está ativa no Office Binder, o menu Ajuda aparece 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 para o contêiner e o objeto são fornecidos ao usuário. Os itens que aparecem aqui variam de acordo com o contêiner e os objetos envolvidos.
Para construir esse menu Ajuda mesclado, a arquitetura de contenção de documentos ativa modifica o procedimento normal de documentos OLE. De acordo com a OLE Documents, a barra de menus mesclada pode ter seis grupos de menus, ou seja, Arquivo, Editar, Contêiner, Objeto, Janela, Ajuda, nessa ordem. Em cada grupo, pode haver zero ou mais menus. Os grupos File, Container e Window pertencem ao contêiner e os grupos Edit, Object e Help 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 adicionou em cada um de seus grupos e, em seguida, retorna. Em seguida, o objeto insere seus menus, prestando atenção à contagem de menus em cada grupo de contêineres. Finalmente, o objeto passa a barra de menus mesclada e a matriz (que contém a contagem de menus em cada grupo) para OLE, que retorna um identificador opaco de "descritor de menu". Mais tarde, o objeto passa essa alça e a barra de menus mesclada para o contêiner, via IOleInPlaceFrame::SetMenu. Neste momento, o contentor exibe a barra de menus mesclada e também passa o identificador para o OLE, para que este envie corretamente as 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, width[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 insere 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 em 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 seus submenus) 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 para o menu Ajuda do objeto. Em seguida, o contêiner observa WM_MENUSELECT para entrada ou saída de qualquer item no menu Ajuda que o contêiner não tenha adicionado. Na entrada, significa que o usuário navegou em um menu de objetos, de modo que o contêiner define o sinalizador "no menu Ajuda do objeto" e usa o estado desse sinalizador para encaminhar quaisquer mensagens WM_MENUSELECT, WM_INITMENUPOPUP e WM_COMMAND , no mínimo, para a janela do objeto. (Ao sair, o contêiner limpa o sinalizador e, em seguida, processa essas mesmas mensagens.) O contêiner deve usar a janela retornada pela função do IOleInPlaceActiveObejct::GetWindow objeto como destino para essas mensagens.
Se o objeto detetar um zero no sexto elemento de OLEMENUGROUPWIDTHS, ele prosseguirá de acordo com as regras normais de documentos OLE. Este procedimento abrange os 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. Em caso afirmativo, o contêiner deixa seu menu Ajuda na barra de menus mesclada. Se o menu Ajuda não tiver um submenu adicional, o contêiner removerá o menu Ajuda da barra de menus mesclada. Este procedimento abrange objetos que participam da mesclagem do menu Ajuda e aqueles que não participam.
Finalmente, 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 remove seus menus, ele removerá seu menu Ajuda além dos outros menus que inseriu.