TN028: Suporte a ajuda Contexto-Sensitive

Esta anotação descreve as regras para a atribuição de IDs de contextos de ajuda (ou seja, números de tópico) e outros problemas de ajuda no MFC 2.0. Suporte de ajuda sensível ao contexto requer o compilador da ajuda que está disponível no Visual C++ Professional.

Tipos de ajuda do suporte

Existem dois tipos de ajuda Contextoual implementada em aplicativos do Windows. A primeira, conhecida como "Ajuda F1" envolve iniciar WinHelp com o contexto apropriado com base no objeto ativo no momento. O segundo é o modo SHIFT + F1. Neste modo, o cursor do mouse muda para o cursor de ajuda (uma combinação seta + ponto de interrogação) e o usuário prossegue para clicar no objeto que gostaria de ajuda sobre. Nesse ponto, WinHelp é iniciado oferecendo ajuda para o objeto no qual o usuário clicou.

O Microsoft Foundation classes implementar ambas as formas de ajuda. Além disso, o framework oferece suporte a dois comandos de ajuda simples, índice remissivo da ajuda e uso de ajudar.

Arquivos de ajuda

O Microsoft Foundation classes assumem um único arquivo de ajuda. Que arquivo de ajuda deve ter o mesmo nome e caminho do aplicativo (.EXE - >.HLP).

Esta é uma variável de membro pública CWinApp chamada m_pszHelpFilePath que o usuário pode alterar se desejado.

Intervalos de contexto de ajuda

0 x 00000000 - 0x0000FFFF: definido pelo usuário

0x00010000 - 0x0001FFFF: comandos (botões menus/comando)

   0X00010000 + ID _

nbsp;  (Nota: 0x18000 - > 0x1FFFF é alcance prático, uma vez que as identificações de comando são > = 0 x 8000)

0x00020000 - 0x0002FFFF: windows e caixas de diálogo

   0X00020000 + IDR _

nbsp;  (Nota: 0x20000 - > 0x27FFF é alcance prático desde IDRs são < = 0x7FFF)

0x00030000 - 0x0003FFFF: mensagens de erro (com base na ID de seqüência de caracteres de erro)

   0X00030000 + IDP_

0x00040000 - 0x0004FFFF: finalidade especial (áreas de não-cliente)

   0x00040000 + área HitTest

0x00050000 - 0x0005FFFF: controles (aqueles que não são comandos)

   0X00040000 + IDW_

Essas regras são codificados na implementação padrão do Microsoft Foundation classes. Eles podem ser substituídos, fornecendo implementações diferentes de várias funções de membro de ajuda-relacionados.

Comandos simples de "Ajuda"

Há dois comandos simples de ajuda que são implementados pelo Microsoft Foundation classes:

Estes dois comandos simplesmente mostram no índice da ajuda do aplicativo e visualizar a ajuda do usuário no usando o programa WinHelp, respectivamente.

Ajuda Contextoual (ajuda de F1)

Esta é a primeira forma de ajuda Contextoual (normalmente referida como ajuda F1). O usuário pressionar F1 para obter ajuda sobre a tarefa à mão (o ativo janela ou item de menu). Nenhum especial "modo de ajuda" está envolvida.

A tecla F1 é geralmente traduzida para um comando com uma identificação de ID_HELP por um acelerador colocado na tabela de teclas aceleradoras da janela principal. O comando ID_HELP também pode ser gerado por um botão com uma identificação de ID_HELP na caixa de diálogo ou janela principal. Além disso, quando uma caixa de diálogo ou um menu está ativa e o usuário pressiona F1, o pressionamento de tecla é codificado para traduzir em um comando ID_HELP.

No entanto, o comando ID_HELP é gerado, ele será encaminhado como um comando normal até que ele atinja um manipulador de comando (para obter mais informações sobre arquitetura de roteamento de comando do Microsoft Foundation classes, consulte técnico Anotação 21.) Se o aplicativo for que Help habilitado, o comando ID_HELP será manipulado pela função de CWinApp:: OnHelp . Desde que o roteamento de comando padrão não é adequado para determinar o contexto mais específico o comando em vez disso sempre é roteado para o objeto application e, em seguida, passa por roteamento personalizado para obter ajuda.

CWinApp:: OnHelp tenta iniciar WinHelp na seguinte ordem

  1. Verifica se há um ativo chamar AfxMessageBox com um ID de ajuda. Se uma caixa de mensagem está atualmente ativa, WinHelp é iniciado com o contexto apropriado para essa caixa de mensagem.

  2. Se nenhuma caixa de mensagem está ativa, CWinApp:: OnHelp envia um WM_EXITHELPMODE (uma mensagem privada para o Microsoft Foundation classes) para a janela ativa. Se essa janela não responder através do lançamento de WinHelp, a mesma mensagem, em seguida, é enviada para o pai dessa janela, até que a mensagem é processada ou a atual janela é uma janela de alto nível (e, portanto, não tem uma janela pai).

  3. Se a mensagem permanece não transformada, a ajuda padrão é chamada. Isso é feito enviando um comando ID_DEFAULT_HELP à janela principal. Este comando geralmente é mapeado para CWinApp:: OnHelpIndex.

Globalmente substituir os valores de base de ID (0x10000 para comandos, 0x20000 para recursos como caixas de diálogo e assim por diante), o aplicativo deve substituir CWinApp::WinHelp. Na verdade isso na implementação das aplicações ClassWizard e AppWizard-se, por exemplo, uma vez que ambos partilham um único arquivo de ajuda.

Para substituir essa funcionalidade e a maneira que um contexto da ajuda é determinado, um aplicativo deve manipular a mensagem de WM_EXITHELPMODE (veja abaixo). Você pode desejar fornecer mais específico ajuda do roteamento do que o framework fornece, como ela só vai tão profundo como a janela de filho MDI atual. Ou você pode desejar fornecer ajuda mais específica para uma determinada janela ou caixa de diálogo — talvez baseado sobre o estado interno do objeto ou o controle ativo dentro de caixa de diálogo.

WM_EXITHELPMODE

afx_msg LRESULT CWnd::OnCommandHelp (WPARAM, LPARAM lParam)

WM_EXITHELPMODE é uma mensagem de Windows particular MFC que é recebida pela janela ativa quando a ajuda é solicitada. Quando a janela recebe essa mensagem, ele pode chamar CWinApp::WinHelp com o contexto que coincide com o estado interno da janela.

lParam

contém o contexto de ajuda disponível no momento. lParam é zero se nenhum contexto ajuda tiver sido determinado ainda. Uma implementação de OnCommandHelp pode usar o ID de contexto na lParam para determinar um contexto de "melhor" ou apenas pode passá-lo para CWinApp::WinHelp.

wParam

não é usado e será zero.

Se a função de OnCommandHelp chama CWinApp::WinHelp, ela deve retornar TRUE. Retornando TRUE interrompe o roteamento deste comando para outras classes (classes base) e para outras janelas.

Modo de ajuda (Shift + F1 Ajuda)

Esta é a segunda forma de ajuda sensível ao contexto. Geralmente, esse modo é inserido, pressionando SHIFT + F1 ou através da barra de ferramentas/menu. Ele é implementado como um comando (ID_CONTEXT_HELP). O gancho de filtro de mensagem não é usado para traduzir este comando enquanto uma caixa de diálogo restrita ou menu está ativo, por conseguinte, este comando só está disponível para o usuário quando o aplicativo está em execução a bomba de mensagem principal (CWinApp::Run).

Depois de entrar neste modo, o cursor do mouse de ajuda é exibido ao longo de todas as áreas do aplicativo, mesmo se o aplicativo normalmente iria exibir seu próprio cursor para essa área (como a borda de dimensionamento ao redor da janela). O usuário é capaz de usar o mouse ou o teclado para selecionar um comando. Em vez de executar o comando, ajuda em que o comando é exibida. O usuário pode também clicar em um objeto visível na tela, como um botão na barra de ferramentas e a ajuda será exibida para esse objeto. Este modo de ajuda é fornecido por CWinApp::OnContextHelp.

Durante a execução deste ciclo, todos os entrada do teclado está inativo, exceto para as chaves que acessar o menu. Além disso, tradução de comando ainda é executada através de PreTranslateMessage para permitir que o usuário pressione uma tecla aceleradora e receber ajuda sobre o comando.

Se não houver nomeadamente as traduções ou ações que ocorrem em PreTranslateMessage função que não deve ter lugar durante o modo de tecla SHIFT + F1 Ajuda, você deve verificar o membro m_bHelpMode de CWinApp antes de executar essas operações. A implementação de CDialog de PreTranslateMessage verifica isso antes de chamar IsDialogMessage, por exemplo. Isso desativa o "diálogo" navegação em caixas de diálogo sem janela restrita durante o modo SHIFT + F1. Além disso, CWinApp::OnIdle ainda é chamado durante esse loop.

Se o usuário escolhe um comando de menu, ela é tratada como obter ajuda sobre o comando (através do WM_EXITHELPMODE, veja abaixo). Se o usuário clica em uma área visível da janela aplicativos, uma determinação é feita para saber se é um clique não cliente ou a um cliente. OnContextHelp lida com mapeamento de cliques não cliente para cliente cliques automaticamente. Se for um cliente clique, em seguida, envia um WM_HELPHITTEST para a janela que foi clicada. Se essa janela retorna um valor diferente de zero, esse valor é usado como o contexto para obter ajuda. Se ela retorna zero, OnContextHelp tenta janela pai (e na sua falta, seu pai e assim por diante). Se um contexto da ajuda não pode ser determinado, o padrão é enviar um ID_DEFAULT_HELP comandos para a janela principal, que (geralmente) é então mapeada para CWinApp:: OnHelpIndex.

WM_HELPHITTEST

afx_msg LRESULT CWnd::OnHelpHitTest (WPARAM, LPARAM lParam)

WM_HELPHITTEST é uma mensagem de windows particulares MFC, é recebida pela janela ativa clicada durante o modo de tecla SHIFT + F1 Ajuda. Quando a janela recebe essa mensagem, ele retorna uma DWORD ajudar identificação para uso por WinHelp.

LOWORD(lParam)

contém as coordenadas de dispositivo do eixo x onde o mouse foi clicado relativo para a área cliente da janela.

HIWORD(lParam)

contém as coordenadas do eixo y.

wParam

não é usado e será zero. Se o valor de retorno é diferente de zero, WinHelp é chamado com esse contexto. Se o valor de retorno é zero, o janela pai é consultado para obter ajuda.

Em muitos casos, você pode utilizar código ocorrência-testes, que você já pode ter. Consulte a implementação de CToolBar::OnHelpHitTest para um exemplo de manipulação de mensagem WM_HELPHITTEST (o código utiliza o código de teste de impacto usado nos botões e dicas de ferramentas no CControlBar).

Suporte do MFC AppWizard e MAKEHM

AppWizard cria os arquivos necessários para criar um arquivo de ajuda (arquivos. CNT e. hpj). Ele também inclui um número de pré-construídos.Arquivos RTF que são aceitos pelo Microsoft Help Compiler. Muitos dos tópicos estão completos, mas alguns talvez precise ser modificado para seu aplicativo específico.

Criação automática de um arquivo de "ajuda do mapeamento" é suportada por um utilitário chamado MAKEHM. O utilitário MAKEHM pode traduzir um recurso aplicativo.Arquivo. H para um arquivo de mapeamento de ajuda. Por exemplo:

# define IDD_MY_DIALOGnbsp;  2000
# define ID_MY_COMMA&ND 150

sejam traduzidos em:

HIDD_MY_DIALOGnbsp;   0x207d0
HID_MY_COMMA&ND 0X10096

Este formato é compatível com a instalação do compilador da ajuda, que mapeia o contexto IDs (os números do lado direito) com nomes de tópico (os símbolos do lado esquerdo).

O código-fonte para MAKEHM está disponível na amostra MFC Programming Utilties MAKEHM.

Adicionando suporte de ajuda depois de executar o AppWizard

A melhor maneira de adicionar ajuda para seu aplicativo é marcar a opção "Ajuda sensível do contexto" na caixa de diálogo de opções do AppWizard antes de criar seu aplicativo. Dessa forma AppWizard adiciona automaticamente as entradas de mapa de mensagem necessário ao seu CWinApp-classe derivada para oferecer suporte a ajuda.

Se você já tiver criado seu aplicativo sem suporte de ajuda e agora gostaria de adicioná-lo, consulte o Guia do programador do Visual C++.

Ajuda sobre caixas de mensagem

Ajuda em caixas de mensagem (às vezes chamado de alertas) é suportada através da função de AfxMessageBox , um wrapper para a API do Windows MessageBox.

Existem duas versões de AfxMessageBox, outra para uso com um ID de string e outra para uso com um ponteiro para seqüência de caracteres (LPCSTR):

int AFXAPI AfxMessageBox(LPCSTR lpszText, UINT nType, UINT nIDHelp);
int AFXAPI AfxMessageBox(UINT nIDPrompt, UINT nType, UINT nIDHelp)

Em ambos os casos, há uma identificação opcional da ajuda.

No primeiro caso, o padrão para nIDHelp é 0, que não indica nenhuma ajuda para esta caixa de mensagem. Se o usuário pressiona F1 enquanto tais como mensagem caixa estiver ativa, o usuário não receberá ajuda (mesmo se o aplicativo oferecer suporte a ajuda). Se isso não é desejável, uma identificação da ajuda deve prever-se nIDHelp.

No segundo caso, o valor padrão para nIDHelp é -1, que indica que a identificação da ajuda é o mesmo que nIDPrompt. Ajuda funcionará somente se o aplicativo estiver habilitado para ajuda, é claro). Você deve fornecer 0 para nIDHelp se você desejar que a caixa de mensagem não tem nenhum suporte de ajuda. Deve você deseja que a mensagem seja ajuda habilitada, mas desejo um ID de ajuda diferentes do que nIDPrompt, simplesmente fornecer um valor positivo para nIDHelp diferente da nIDPrompt.

Técnico anotações por número |nbsp; &Notas técnicas por categoria

Index