Descripción de las tecla de acceso diferencias entre MFC 4.0 y 4.0 de Visual Basic

Seleccione idioma Seleccione idioma
Id. de artículo: 145698 - Ver los productos a los que se aplica este artículo
Este artículo se ha archivado. Se ofrece "tal cual" y no se volverá a actualizar.
Nota Microsoft Visual C++ .NET 2002 y Visual C++ .NET 2003 admiten el modelo de código administrado suministrada por Microsoft .NET Framework y el modelo de código nativo no administrado de Microsoft Windows. La información de este artículo sólo se aplica al código no administrado de Visual C++.Microsoft Visual C++ 2005 admite el modelo de código administrado suministrada por Microsoft .NET Framework y el modelo de código nativo no administrado de Microsoft Windows.
Expandir todo | Contraer todo

En esta página

Síntomas

Una tabla de aceleradores proporcionada por medio de COleControl::OnGetControlInfo que describe la teclas de acceso del control OLE no funciona en MFC 4.0 y contenedores de controles OLE de Visual Basic 4.0.

Causa

Visual Basic 4.0 y 4.0 de MFC proporcionan diferente mnemónico tratamiento de implementaciones, por lo que requieren entradas de tabla de aceleradores diferentes.

Solución

Crear entradas de tabla que permitirán códigos mnemónicos del control puede controlar en Visual Basic 4.0 tanto OLE de MFC 4.0 contenedor de control de acelerador.

Estado

Este comportamiento es por diseño.

Más información

Un control OLE reemplaza el método de COleControl::OnGetControlInfo virtual para permitir su contenedor obtener una descripción de teclas de acceso del control. El método OnGetControlInfo devuelve una estructura de rellenado de salida de tipo CONTROLINFO que contiene, entre otras cosas, un identificador de una tabla de aceleradores. Esta tabla de aceleradores se utiliza el contenedor para realizar comprobaciones de teclas de acceso. Cuando el contenedor determina que un control de tecla de acceso tecla se presionó, IOleControl::OnMnemonic del control llama al método. Esto hace que el marco de trabajo MFC llamar al método COleControl::OnMnemonic virtual, que el control puede reemplazar para realizar un procesamiento especial.

Las implementaciones de Visual Basic 4.0 y OLE de MFC 4.0 control de tecla de acceso de control tienen requisitos diferentes para las entradas de la tabla de aceleradores devuelta por medio de OnGetControlInfo.

Una clave de acelerador utilizada en una tabla de aceleradores se define mediante la estructura de la tecla de ACELERACIÓN. La tecla de ACELERACIÓN estructura tiene la siguiente definición:
   typedef struct tagACCEL
   {
       BYTE   fVirt;
       WORD   key;
       WORD   cmd;
   } ACCEL;
				
el miembro fVirt especifica los indicadores acelerador. Este miembro puede ser una combinación de los siguientes 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.
				
el miembro clave especifica la tecla de aceleración. Este miembro puede ser un código de tecla virtual o un código de carácter ASCII.

El miembro cmd especifica el identificador del acelerador. Este valor se coloca la palabra de orden inferior del parámetro wParam del mensaje WM_COMMAND o WM_SYSCOMMAND cuando se presiona el acelerador.

Visual Basic 4.0 tiene los siguientes requisitos para entradas de tabla de aceleradores utilizadas para el control de tecla de acceso:

  • El miembro fVirt debe ser una combinación de (FVIRTKEY | FALT) o (FVIRTKEY | FALT | FSHIFT).
  • El miembro de clave debe ser mayúsculas.
  • El miembro de cmd no debe ser igual a 0.
MFC 4.0 tiene los siguientes requisitos para entradas de tabla de aceleradores utilizadas para el control de tecla de acceso:

  • Debe ser el miembro fVirt FALT o 0.
  • El miembro de clave debe ser minúscula.
  • Se omitirá el miembro de cmd.
Contenedores de controles OLE de MFC 4.0 también difieren de Visual Basic 4.0 de la forma que controlan la tecla de acceso de procesamiento cuando un control está activa de la IU. Al controlar el teclado entrados contenedores MFC, primero compruebe ver si un OLE control tiene el foco. Si lo hace, el marco de trabajo llama a su método IOleInPlaceActiveObject::TranslateAccelerator. En el COleControl implementación de este método se llama a función de PreTranslateMessage del control. Para que un control OLE para que su función de las teclas de acceso correctamente cuando el control está activa de la IU, el control OLE debe reemplazar PreTranslateMessage y comprobar sus combinaciones de teclas especiales.

Nota : reemplazar PreTranslateMessage no es necesario si el control se genera con Visual C++ 5.0 o posterior ya OnMnemonic se llamará cuando el control está activa por medio de SendMnemonic en COccManager::IsDialogMessage de IU.

En el siguiente ejemplo de código muestra un reemplazado OnGetControlInfo, PreTranslateMessage y OnMnemonic que permiten códigos mnemónicos de un control funcione correctamente en un contenedor de control OLE de MFC 4.0 así como un contenedor de Visual Basic 4.0.

Código de ejemplo

/* 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);
}
				

Propiedades

Id. de artículo: 145698 - Última revisión: sábado, 01 de marzo de 2014 - Versión: 5.1
La información de este artículo se refiere a:
  • Microsoft Foundation Class Library 4.2 sobre las siguientes plataformas
    • Microsoft Visual C++ 4.0 Standard Edition
    • Microsoft Visual C++ 5.0 Enterprise Edition
    • Microsoft Visual C++ 6.0 Enterprise
    • Microsoft Visual C++ 5.0 Professional
    • Microsoft Visual C++ 6.0 Professional
    • 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
    • Microsoft Visual C++ .NET 2002 Standard
Palabras clave: 
kbnosurvey kbarchive kbmt kbinfo kbhowto kbtshoot kbacceleratorkey kbcode kbctrlcreate kbkeyaccel kbprb KB145698 KbMtes
Traducción automática
IMPORTANTE: Este artículo ha sido traducido por un software de traducción automática de Microsoft (http://support.microsoft.com/gp/mtdetails) en lugar de un traductor humano. Microsoft le ofrece artículos traducidos por un traductor humano y artículos traducidos automáticamente para que tenga acceso en su propio idioma a todos los artículos de nuestra base de conocimientos (Knowledge Base). Sin embargo, los artículos traducidos automáticamente pueden contener errores en el vocabulario, la sintaxis o la gramática, como los que un extranjero podría cometer al hablar el idioma. Microsoft no se hace responsable de cualquier imprecisión, error o daño ocasionado por una mala traducción del contenido o como consecuencia de su utilización por nuestros clientes. Microsoft suele actualizar el software de traducción frecuentemente.
Haga clic aquí para ver el artículo original (en inglés): 145698

Enviar comentarios

 

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