Descrição das diferenças mnemónica entre 4.0 MFC e 4.0 do Visual Basic

Traduções de Artigos Traduções de Artigos
Artigo: 145698 - Ver produtos para os quais este artigo se aplica.
Este artigo foi arquivado. Este artigo é oferecido "tal como está" e deixará de ser actualizado.
Nota Microsoft Visual C++ .NET 2002 e Microsoft Visual C++ .NET 2003 suportam o modelo de código gerido que é fornecido pelo Microsoft .NET Framework e o modelo de código do Microsoft Windows nativo não gerido. As informações neste artigo aplicam-se apenas ao código de Visual C++ não gerido.Microsoft Visual C++ 2005 suporta o modelo de código gerido que é fornecido pelo Microsoft .NET Framework e o modelo de código do Microsoft Windows nativo não gerido.
Expandir tudo | Reduzir tudo

Nesta página

Sintomas

Uma tabela de acelerador fornecida através de COleControl::OnGetControlInfo que descreve mnemónica chaves um controlo OLE não funciona no MFC 4.0 e do Visual Basic 4.0 OLE controlo contentores.

Causa

4.0 Do Visual Basic e MFC 4.0 fornecem diferente mnemónica processamento implementações, pelo que requerem aceleração diferentes entradas da tabela.

Resolução

Atalho crie entradas de tabela que permitirão mnemónicas de um controlo a ser processado no contentor de controlo de um 4.0 do Visual Basic e MFC 4.0 OLE.

Ponto Da Situação

Este comportamento ocorre por predefinição.

Mais Informação

Um controlo OLE substitui o método COleControl::OnGetControlInfo virtual para permitir o respectivo contentor obter uma descrição das chaves mnemónica do controlo. O método OnGetControlInfo devolve uma estrutura preenchido do tipo CONTROLINFO contém, entre outras coisas, um identificador para uma tabela de atalho. Esta tabela de atalho é utilizada pelo contentor para efectuar verificações para chaves mnemónica. Quando o contentor determina que um controlo é mnemónico tecla foi premida, chama IOleControl::OnMnemonic o controlo método. Isto faz com que a estrutura MFC chamar o método COleControl::OnMnemonic virtual, que pode substituir o controlo para efectuar um processamento especial.

As implementações de processamento mnemónica de controlo do Visual Basic 4.0 e MFC 4.0 OLE tem requisitos diferentes para as entradas na tabela aceleradora devolvida através de OnGetControlInfo.

Uma tecla de atalho utilizada numa tabela aceleradora é definida pela estrutura de ATALHO. O ATALHO estrutura tem a seguinte definição:
   typedef struct tagACCEL
   {
       BYTE   fVirt;
       WORD   key;
       WORD   cmd;
   } ACCEL;
				
o membro fVirt Especifica os sinalizadores de atalho. Este membro pode ser uma combinação dos seguintes valores:
   Value       Meaning
   ---------------------------------------------------------------------
   FALT        The ALT key must be held down when the accelerator key is
               pressed.

   FCONTROL    The CTRL key must be held down when the accelerator key
               is pressed.

   FNOINVERT   Specifies that no top-level menu item is highlighted when
               the accelerator is used. If this flag is not specified, a
               top-level menu item will be highlighted, if possible,
               when the accelerator is used.

   FSHIFT      The SHIFT key must be held down when the accelerator key
               is pressed.

   FVIRTKEY    The key member specifies a virtual-key code. If this flag
               is not specified, key is assumed to specify an ASCII
               character code.
				
o membro chave especifica a tecla de atalho. Este membro pode ser um código chave virtual ou um código de carácter ASCII.

O membro cmd Especifica o identificador de atalho. Este valor é colocado a palavra de ordem inferior do parâmetro wParam da mensagem WM_COMMAND ou WM_SYSCOMMAND quando é premido o acelerador de.

Visual Basic 4.0 tem os requisitos seguintes para entradas de tabela aceleradora utilizados para processamento mnemónico:

  • O membro fVirt tem de ser uma combinação de (FVIRTKEY | FALT) ou (FVIRTKEY | FALT | FSHIFT).
  • O membro chave tem de ser em maiúsculas.
  • O membro cmd não deve ser igual a 0.
MFC 4.0 tem os seguintes requisitos para entradas de tabela aceleradora utilizados para processamento mnemónico:

  • O membro fVirt tem de ser FALT ou 0.
  • O membro chave tem de ser em minúsculas.
  • O membro cmd é ignorado.
MFC 4.0 OLE controlo contentores diferem também Visual Basic 4.0 da forma que processam processamento mnemónica quando um controlo é interface de utilizador activo. Quando processa contentores MFC entradas do teclado, verifique primeiro se controlar um OLE tem o foco. Se for o caso, a estrutura chama o método IOleInPlaceActiveObject::TranslateAccelerator. No COleControl implementação deste método PreTranslateMessage função do controlo chama-se. De forma a um controlo OLE para que a função de mnemónicas correctamente quando o controlo de interface de utilizador activo, o controlo OLE tem de substituir PreTranslateMessage e procure as combinações de teclas especiais.

Nota : não é necessária se o controlo é gerado com o Visual C++ 5.0 ou superior porque OnMnemonic será chamado quando o controlo é UI activa através de SendMnemonic em COccManager::IsDialogMessage PreTranslateMessage a substituir.

O código de exemplo seguinte mostra um substituído OnGetControlInfo, PreTranslateMessage e OnMnemonic permitir mnemónicas de um controlo funcione correctamente no tanto um contentor de MFC 4.0 OLE controlo, bem como um contentor de Visual Basic 4.0.

Código de exemplo

/* Compile options needed: None
*/ 
#define NUM_ENTRIES 4
void CMnemonicCtrl::OnGetControlInfo(LPCONTROLINFO lpi)
{
  HACCEL hAccel = NULL;
  TCHAR ch = 'm';   // Hard code the mnemonic key to 'm' for this
                    // example.
  ACCEL accKey[NUM_ENTRIES];
  // Accel table entries 0 and 1 are to work with Visual Basic 4.0 as a
  // container. Visual Basic 4.0 has the following requirements for
  // accel table entries for a control's mnemonics:
  // 
  //  (fVirt == FVIRTKEY | FALT) || (fVirt == FVIRTKEY | FALT | FSHIFT)
  //  key must be uppercase
  //  (cmd != 0)
  accKey[0].fVirt = FVIRTKEY | FALT;
  accKey[1].fVirt = FVIRTKEY | FALT | FSHIFT;
  accKey[0].key = accKey[1].key = LOBYTE(VkKeyScan(ch));
  accKey[0].cmd = accKey[1].cmd = 1;
  // Accel table entries 2 and 3 are to work with MFC 4.0 containers.
  // MFC containers have the following requirements for accel table
  // entries for a control's mnemonics:
  // 
  //  (fVirt == FALT) || (fVirt == 0)
  //  key should be lowercase
  //  cmd is ignored
  accKey[2].fVirt = FALT;
  accKey[3].fVirt = 0;
  accKey[2].key = accKey[3].key = ch;
  accKey[2].cmd = accKey[3].cmd = 1;
  // Create the accel table.
  hAccel = CreateAcceleratorTable(accKey, NUM_ENTRIES);
  if (hAccel != NULL)
  {
    // Fill in the CONTROLINFO structure passed in.
    lpi -> hAccel = hAccel;
    lpi -> cAccel = NUM_ENTRIES;
    lpi -> dwFlags = 0;
  }
  else
    COleControl::OnGetControlInfo(lpi);
}
// NO need to override PreTranslateMessage if the control is generated in
// Visual C++ 5.0 or above.
BOOL CMnemonicCtrl::PreTranslateMessage( MSG * pMsg )
{
  // Check for ALT-M key combination.
  if(pMsg->message == WM_SYSKEYDOWN) {
    if((pMsg->wParam == 'm')||(pMsg->wParam == 'M'))
    {
      // Do mnemonic key processing here.
      return TRUE;
    }
  }
  return COleControl::PreTranslateMessage(pMsg);
}
void CMnemonicCtrl::OnMnemonic(LPMSG pMsg)
{
  if ((pMsg->message == WM_SYSKEYDOWN)||
      (pMsg->message == WM_SYSCHAR))
  {
    if ((pMsg->wParam == 'm')||(pMsg->wParam == 'M'))
    {
      // Do mnemonic key processing here.
      return;
    }
  }
  COleControl::OnMnemonic(pMsg);
}
				

Propriedades

Artigo: 145698 - Última revisão: 1 de março de 2014 - Revisão: 5.1
A informação contida neste artigo aplica-se a:
  • Microsoft Foundation Class Library 4.2 nas seguintes plataformas
    • Microsoft Visual C++ 4.0 Standard Edition
    • Microsoft Visual C++ 5.0 Enterprise Edition
    • Microsoft Visual C++ 6.0 Enterprise Edition
    • Microsoft Visual C++ 5.0 Professional Edition
    • Microsoft Visual C++ 6.0 Professional Edition
    • Microsoft Visual C++, 32-bit Learning Edition 6.0
    • Microsoft OLE Control Developer's Kit (CDK)
    • Microsoft Visual C++ 2005 Express Edition
    • Microsoft Visual C++ .NET 2003 Standard Edition
    • Microsoft Visual C++ .NET 2002 Standard Edition
Palavras-chave: 
kbnosurvey kbarchive kbmt kbinfo kbhowto kbtshoot kbacceleratorkey kbcode kbctrlcreate kbkeyaccel kbprb KB145698 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 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: 145698

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