DetailPage-MSS-KB

Base de Dados de Conhecimento

Artigo: 100770 - Última revisão: terça-feira, 21 de Novembro de 2006 - Revisão: 3.1

 

Sumário

Muitas aplicações utilizam uma caixa de diálogo modal como janela da aplicação principal. As aplicações que utilizam esta técnica podem também incluir um menu principal na caixa de diálogo. Normalmente, um ou mais dos itens de menu tem uma tecla de atalho associada. Este artigo descreve os passos necessários adicionar aceleradores de menus e teclado a uma aplicação de baseado na caixa de diálogo do Assistente de aplicação MFC.

Mais Informação

Uma aplicação normal que é desenvolvido para o sistema operativo Microsoft Windows utilizando o Visual C++ e o Software Development Kit (SDK) do Microsoft Windows e que utilize aceleradores de teclado chama a função TranslateAccelerator() no respectivo ciclo de mensagem principal. No entanto, quando utilizar uma caixa de diálogo modal como janela principal, a aplicação não tem um ciclo de mensagem principal; em vez disso, a aplicação utiliza o ciclo de mensagem do Gestor do diálogo caixa (incorporado no Windows) para converter e envio de mensagens. Obviamente, porque este ciclo de mensagem não foi concebido para processar aceleradores, não chama a função TranslateAccelerator() .

Para processar combinações de teclas numa caixa de diálogo modal no MFC, tem de substituir a função CWinApp::ProcessMessageFilter() . A estrutura chama ProcessMessageFilter() antes de processar uma mensagem.

Para modificar um tipo de aplicação baseada na caixa de diálogo Assistente de aplicação MFC no Visual C++ .NET para processar correctamente as teclas de atalho, siga estes passos:
  1. No Visual Studio. NET, crie uma nova aplicação MFC. No painel esquerdo do Assistente de aplicação MFC, clique em Tipo de aplicação e, em seguida, certifique-se de que tipo de aplicação está definida para caixa de diálogo com base .
  2. Na vista de recurso, faça duplo clique o recurso de diálogo para abrir o editor de recursos de diálogo. O ID de recurso do recurso diálogo é semelhante a IDD_ MYPROJECT _DIALOG (onde MYPROJECT é o nome que deu o projecto de aplicação quando é criada).
  3. Com o recurso de diálogo Abrir no editor de recursos de diálogo, localize a janela Propriedades. Edite a caixa de diálogo Propriedades do limite e especificar o estilo de limite fino . Este passo é necessário 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 com o nome & ficheiro e um menu item chamado & Exit\tCTRL + E (CTRL+X está normalmente associado cortar texto, por isso CTRL + E é utilizado em vez disso).
  5. No editor de menu, prima a opção de menu Sair recém-criada. Na janela Propriedades, certifique-se de que a propriedade ID do item de menu de saída está definida para ID_FILE_EXIT .
  6. Associa o novo menu com a caixa de diálogo, introduzindo o ID de menu no recurso de diálogo Propriedades do menu . Abra o editor de diálogo para o recurso de diálogo e localize a propriedade de menu na janela Propriedades. Defina-o ao ID de recurso que criou para o menu no passo 4. Para o fazer, clique na lista pendente na linha de propriedade de menu e, em seguida, clique para seleccionar o ID de recurso para o menu na lista.
  7. No editor de menu, clique com o botão direito do rato & Exit\tCTRL + E e, em seguida, clique em Adicionar o processador de eventos .
  8. Em eventos rotina de tratamento do assistente, seleccione o tipo de mensagem COMMAND . Na lista classe , seleccione a classe principal CDialog derivada para o processador a ser gerado no. Certificar de que o nome da rotina de tratamento de função é adequado e, em seguida, clique em Adicionar e editar para criar o processador de eventos item de menu.
  9. Inserir a linha seguinte na função Sair menu item rotina de tratamento de método de evento que gerou no passo 8:
    PostMessage(WM_COMMAND, IDOK, 0L);
    					
    isto produz o mesmo efeito que clicar em OK quando o utilizador clica Sair no menu ficheiro . Clicar em OK fecha a aplicação de caixa de diálogo.

  10. Criar um novo recurso de acelerador e associar CTRL + E chave juntamente com ID_FILE_EXIT . Guarde as alterações.
  11. Edite o ficheiro Stdafx.h para declarar as variáveis globais que se seguem depois as instruções # include :
    extern HWND    ghDlg;          // Handle to main dialog box.
    extern HACCEL  ghAccelTable;   // Handle to accelerator table.
    					
  12. No ficheiro .cpp com CWinApp classe derivada de implementação (normalmente o .cpp ficheiro com o mesmo nome base do nome do projecto), adicione as seguintes inicializações variáveis globais:
    HWND    ghDlg = 0;          // Handle to main dialog box.
    HACCEL  ghAccelTable = 0;   // Handle to accelerator table.
    					
  13. A principal CDialog derivada classe (não o diálogo classe que implementa predefinido caixa de diálogo Acerca ), localizar o método OnInitDialog() . Se necessário, pode adicionar uma substituição para o método OnInitDialog() . Para o fazer, clique para seleccionar a classe CDialog derivada na janela Vista de classe e, em seguida, clique em Ignorar na janela Propriedades. Localize a linha OnInitDialog e clique em coluna da direita. Se OnInitDialog() não é substituído por esta classe, terá a opção para criar uma substituição.
  14. Editar a função que adicionou anteriormente a incluir a seguinte linha de código:
    ghDlg = m_hWnd;
    					
  15. O ficheiro .cpp que contém a implementação CWinApp derivada, 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));
    					
    Nota : O ID de recurso é aqui utilizado (IDR_ACCELERATOR1) é o ID do recurso de tabela aceleradora que é adicionado no passo 10.

  16. Adicione uma substituição à classe CWinApp derivada para o método de classe ProcessMessageFilter() . Para tal, na janela Vista de classe, seleccione a classe CWinApp derivado do projecto. Em seguida, na janela Propriedades, clique em Ignorar . Localize a linha ProcessMessageFilter na janela Propriedades e seleccione a coluna mais à direita da linha. Clique na seta pendente e, em seguida, clique na opção para adicionar uma substituição para o método ProcessMessageFilter .
  17. Editar a substituição do método ProcessMessageFilter() , para que tem a seguinte implementação:
    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 a aplicação. Note que tem um menu. Quando clicar em Sair no menu ficheiro ou prima CTRL + E, fecha a aplicação, como previsto.

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áticaTraduçã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 revisto ou traduzido por humanos. A Microsoft tem artigos traduzidos por aplicações (MT) e artigos traduzidos por tradutores profissionais. O objectivo é simples: oferecer em Português a totalidade dos artigos existentes na base de dados do suporte. Sabemos no entanto que a tradução automática não é sempre perfeita. Esta pode conter erros de vocabulário, sintaxe ou gramática… erros semelhantes aos que um estrangeiro realiza ao falar em Português. A Microsoft não é responsável por incoerências, erros ou estragos realizados na sequência da utilização dos artigos MT por parte dos nossos clientes. A Microsoft realiza actualizações frequentes ao software de tradução automática (MT). Obrigado.
Clique aqui para ver a versão em Inglês deste artigo: 100770  (http://support.microsoft.com/kb/100770/en-us/ )
Partilhar
Opções de suporte adicionais
Fóruns de Suporte da Comunidade Microsoft
Contacte-nos directamente
Encontre um parceiro certificado Microsoft
Loja Microsoft