Como usar teclas de aceleração e um menu principal na caixa de diálogo no Visual C++

Traduções deste artigo Traduções deste artigo
ID do artigo: 100770 - Exibir os produtos aos quais esse artigo se aplica.
Expandir tudo | Recolher tudo

Sumário

Muitos aplicativos usam uma caixa de diálogo modal como a janela do aplicativo principal. Aplicativos que usam essa técnica também podem incluir um menu principal na caixa de diálogo. Normalmente, um ou mais dos itens de menu tem um acelerador de teclado associado a ele. Este artigo descreve as etapas que são necessárias para adicionar um aceleradores de menu e teclado para um aplicativo baseado em caixa de diálogo MFC Application Wizard.

Mais Informações

Um aplicativo típico que é desenvolvido para o sistema operacional Microsoft Windows usando o Visual C++ e o Microsoft Windows Software Development Kit (SDK) e que usa aceleradores de teclado chama a função TranslateAccelerator() em seu loop de mensagem principal. No entanto, quando você usa uma caixa de diálogo modal como a janela principal, o aplicativo não tem um loop de mensagem principal; em vez disso, o aplicativo usa o loop de mensagem diálogo caixa gerente (embutido no Windows) para converter e distribuir mensagens. Obviamente, como esse loop de mensagem não foi projetado para processar aceleradores, ele não chama a função TranslateAccelerator() .

Para processar teclas aceleradoras em uma caixa de diálogo modal na MFC, você deve substituir a função CWinApp::ProcessMessageFilter() . A estrutura chama ProcessMessageFilter() antes de ele processa uma mensagem.

Para modificar um tipo de aplicativo baseado em caixa de diálogo MFC Application Wizard no Visual C++ .NET para processar corretamente teclas aceleradoras, siga estas etapas:
  1. No Visual Studio. NET, crie um novo aplicativo MFC. No painel esquerdo do Assistente de aplicativo MFC, clique em Tipo de aplicativo e certifique-se tipo de aplicativo é definido para a caixa de diálogo com base .
  2. No modo de exibição recurso, clique duas vezes o recurso de diálogo para abrir o editor de recursos de diálogo. A identificação do recurso de diálogo do recurso é semelhante a IDD_ MYPROJECT _DIALOG (onde MYPROJECT é o nome que você deu a seu projeto de aplicativo ao criá-la).
  3. Com o recurso de diálogo aberto no editor de recursos de diálogo, localize a janela Propriedades. Edite a caixa de diálogo propriedade Border e especificar o estilo de borda fina . Essa etapa é necessária para uma caixa de diálogo que contém um menu.
  4. Criar um novo recurso de menu que contém uma entrada de nível superior chamada & arquivo e um menu item nomeado & Exit\tCTRL + E (CTRL+X é geralmente associado a recortando texto, CTRL+E é usado em vez disso).
  5. No editor de menu, clique no item menu Sair de recém-criado. Na janela Properties, verifique se que a propriedade de identificação para o item de menu Sair é definida como ID_FILE_EXIT .
  6. Associe o novo menu com a caixa de diálogo, inserindo a identificação de menu no recurso de diálogo propriedade do menu . Abra o editor de diálogo para o recurso de diálogo e localize a propriedade de menu na janela Properties. Defina-o para a identificação do recurso que você criou para o menu na etapa 4. Para fazer isso, clique na lista drop-down na linha de propriedade menu e clique para selecionar a identificação do recurso para o menu na lista.
  7. No menu editor, clique com o botão direito do mouse & Exit\tCTRL + E e clique em Adicionar manipulador de eventos .
  8. Em eventos manipulador assistente, selecione o tipo de mensagem de comando . Na lista classe , selecione a classe principal CDialog derivado de manipulador a ser gerado no. Verifique se o nome de manipulador de função é apropriado e clique em Adicionar e editar para criar o manipulador de eventos de item de menu.
  9. Insira a seguinte linha na função Sair menu item método manipulador de eventos que é gerado na etapa 8:
    PostMessage(WM_COMMAND, IDOK, 0L);
    					
    isso produz o mesmo efeito que clicar em OK quando o usuário clica em Sair no menu arquivo . Clicar em OK fecha o aplicativo de caixa de diálogo.

  10. Criar um novo recurso de aceleração e associar o CTRL+E combinação com ID_FILE_EXIT de teclas. Salve as alterações.
  11. Edite o arquivo stdafx.h para declarar as seguintes variáveis globais após as instruções # include :
    extern HWND    ghDlg;          // Handle to main dialog box.
    extern HACCEL  ghAccelTable;   // Handle to accelerator table.
    					
  12. No arquivo .cpp que contém o CWinApp implementação da classe derivada (geralmente o .cpp arquivo com o mesmo nome base de seu nome de projeto), adicione as seguintes inicializações de variáveis globais:
    HWND    ghDlg = 0;          // Handle to main dialog box.
    HACCEL  ghAccelTable = 0;   // Handle to accelerator table.
    					
  13. No principal CDialog derivada classe (não o diálogo classe que implementa a padrão caixa de diálogo sobre ), localize o método OnInitDialog() . Se necessário, você pode adicionar uma substituição para o método OnInitDialog() . Para fazer isso, clique para selecionar a classe CDialog derivado na janela Class View e, em seguida, clique em substituições na janela Properties. Localize a linha OnInitDialog e clique em coluna à direita. Se não for substituído OnInitDialog() para essa classe, você tem a opção para criar uma substituição.
  14. Editar a função que você adicionou anteriormente para incluir a linha de código a seguir:
    ghDlg = m_hWnd;
    					
  15. No arquivo .cpp que contém a implementação de CWinApp derivado, localize o método de classe InitInstance() . Adicione a seguinte linha imediatamente após a chamada para a classe base CWinApp::InitInstance() :
    ghAccelTable = LoadAccelerators(AfxGetInstanceHandle(),
    MAKEINTRESOURCE(IDR_ACCELERATOR1));
    					
    Observação : A identificação de recurso é usada aqui (IDR_ACCELERATOR1) é a identificação do recurso de tabela de aceleração é adicionado na etapa 10.

  16. Adicione uma substituição à classe CWinApp derivada para o método de classe ProcessMessageFilter() . Para fazer isso, na janela Class View, selecione a classe CWinApp derivada em seu projeto. Em seguida, na janela Properties, clique em substituições . Localize a linha ProcessMessageFilter na janela Properties e selecione a coluna mais à direita da linha. Clique na seta suspensa e, em seguida, clique na opção para adicionar uma substituição para o método ProcessMessageFilter .
  17. Edite a substituição do método ProcessMessageFilter() para que ele tem implementação a seguir:
    BOOL CMyProjectApp::ProcessMessageFilter(int code, LPMSG lpMsg)
           {
              if (code < 0)
                 CWinApp::ProcessMessageFilter(code, lpMsg);
    
              if (ghDlg && ghAccelTable)
                 {
                 if (::TranslateAccelerator(ghDlg, ghAccelTable, lpMsg))
                    return(TRUE);
                 }
    
             return CWinApp::ProcessMessageFilter(code, lpMsg);
          }
    					
  18. Compilar e executar o aplicativo. Observe que ela tem um menu. Quando você clicar em Sair no menu arquivo ou pressione CTRL+E, fecha o aplicativo, conforme o esperado.

Propriedades

ID do artigo: 100770 - Última revisão: terça-feira, 21 de novembro de 2006 - Revisão: 3.1
A informação contida neste artigo aplica-se a:
  • Microsoft Foundation Class Library 4.2 nas seguintes plataformas
    • Microsoft Visual C++ 2.0 Professional Edition
    • Microsoft Visual C++ 2.1
    • Microsoft Visual C++ 4.0 Standard Edition
    • Microsoft Visual C++ 5.0 Standard Edition
    • Microsoft Visual C++ 6.0 Service Pack 5
    • Microsoft Visual C# .NET 2002 Standard Edition
Palavras-chave: 
kbmt kbacceleratorkey kbhowto kbkeyaccel kbmenu kbui KB100770 KbMtpt
Tradução automática
IMPORTANTE: Este artigo foi traduzido por um sistema de tradução automática (também designado por Machine Translation ou MT), não tendo sido portanto traduzido ou revisto por pessoas. A Microsoft possui artigos traduzidos por aplicações (MT) e artigos traduzidos por tradutores profissionais, com o objetivo de oferecer em português a totalidade dos artigos existentes na base de dados de suporte. No entanto, a tradução automática não é sempre perfeita, podendo conter erros de vocabulário, sintaxe ou gramática. A Microsoft não é responsável por incoerências, erros ou prejuízos ocorridos em decorrência da utilização dos artigos MT por parte dos nossos clientes. A Microsoft realiza atualizações freqüentes ao software de tradução automática (MT). Obrigado.
Clique aqui para ver a versão em Inglês deste artigo: 100770

Submeter comentários

 

Contact us for more help

Contact us for more help
Connect with Answer Desk for expert help.
Get more support from smallbusiness.support.microsoft.com