Descrição das diferenças mnemônicos entre MFC 4.0 e o Visual Basic 4.0

Traduções deste artigo Traduções deste artigo
ID do artigo: 145698 - Exibir os produtos aos quais esse artigo se aplica.
Este artigo foi arquivado. É oferecido "como está" e não será mais atualizado.
Observação Microsoft Visual C++ .NET 2002 e Microsoft Visual C++ .NET 2003 oferecem suporte o modelo de código gerenciado fornecido pelo Microsoft .NET Framework e o modelo de código do Windows de Microsoft nativo não gerenciado. As informações neste artigo se aplicam somente ao código do Visual C++ não gerenciado.Microsoft Visual C++ 2005 oferece suporte o modelo de código gerenciado que é fornecido pelo Microsoft .NET Framework e o modelo de código do Windows de Microsoft nativo não gerenciado.
Expandir tudo | Recolher tudo

Neste artigo

Sintomas

Uma tabela de aceleração fornecida por meio de COleControl::OnGetControlInfo que descreve mnemônico chaves de um controle OLE não funciona no MFC 4.0 e recipientes de controle Visual Basic 4.0 OLE.

Causa

Visual Basic 4.0 e o MFC 4.0 fornecem diferente mnemônico tratamento implementações, portanto, eles exigem acelerador diferentes entradas da tabela.

Resolução

Crie entradas de tabela que permitirá que mnemônicos um controle ser manipulado no recipiente de controle de um Visual Basic 4.0 e MFC 4.0 OLE de acelerador.

Situação

Esse comportamento é por design.

Mais Informações

Um controle OLE substitui o método COleControl::OnGetControlInfo virtual para permitir que seu recipiente obter uma descrição das chaves mnemônico do controle. O método OnGetControlInfo retorna uma estrutura preenchido-out do tipo CONTROLINFO contém, entre outras coisas, um identificador para uma tabela de aceleração. Esta tabela de aceleração é usada pelo contêiner para fazer verificações para chaves mnemônicos. Quando o recipiente determina que um controle é mnemônico tecla foi pressionada, ele chama IOleControl::OnMnemonic do controle método. Isso faz com que a estrutura do MFC chamar o método COleControl::OnMnemonic virtual, que pode substituir o controle para fazer o processamento especial.

As implementações de tratamento de mnemônicos de controle Visual Basic 4.0 e MFC 4.0 OLE possuem requisitos diferentes para as entradas na tabela de aceleração retornada por meio de OnGetControlInfo.

Uma tecla aceleradora usada em uma tabela de aceleração é definida pela estrutura ACELERADOR. O ACELERADOR estrutura tem a seguinte definição:
   typedef struct tagACCEL
   {
       BYTE   fVirt;
       WORD   key;
       WORD   cmd;
   } ACCEL;
				
o membro fVirt Especifica os sinalizadores de acelerador. 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 aceleradora. Este membro pode ser um código de chave virtual ou um código de caractere ASCII.

O membro cmd Especifica o identificador acelerador. Esse valor é colocado na palavra de ordem inferior do parâmetro wParam da mensagem WM_COMMAND ou WM_SYSCOMMAND quando o acelerador é pressionado.

Visual Basic 4.0 tem os seguintes requisitos para entradas de tabela do acelerador usadas para tratamento mnemônico:

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

  • O membro fVirt deve ser FALT ou 0.
  • O membro chave deve ser em minúsculas.
  • O membro cmd será ignorado.
Além disso, recipientes de controle MFC 4.0 OLE diferem do Visual Basic 4.0 na maneira como eles manipulam processamento mnemônico quando um controle é interface do usuário ativo. Quando estiver manipulando recipientes MFC entradas de teclado, primeiro verifique ver se o controle de uma OLE tem o foco. Em caso afirmativo, a estrutura chama seu método IOleInPlaceActiveObject::TranslateAccelerator. No COleControl implementação desse método PreTranslateMessage função do controle é chamada. Em ordem para um controle OLE para que sua função mnemônicos corretamente quando o controle é interface do usuário ativo, o controle OLE deve substituir PreTranslateMessage e verifique se suas combinações de teclas especiais.

Observação : não é necessário se o controle for gerado com o Visual C++ 5.0 ou superior porque OnMnemonic será chamado quando o controle é interface do usuário ativo por meio de SendMnemonic em COccManager::IsDialogMessage substituindo PreTranslateMessage.

O código de exemplo a seguir mostra um substituído OnGetControlInfo, PreTranslateMessage e OnMnemonic que permitem mnemônicos um controle funcione corretamente no tanto um recipiente de controle MFC 4.0 OLE, bem como um recipiente do 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

ID do artigo: 145698 - Última revisão: sábado, 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 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: 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