Description des différences entre MFC 4.0 et Visual Basic 4.0 mnémoniques

Traductions disponibles Traductions disponibles
Numéro d'article: 145698 - Voir les produits auxquels s'applique cet article
Cet article a été archivé. Il est proposé « en l'état » et ne sera plus mis à jour.
Remarque Visual C++ .NET 2002 et Visual C++ .NET 2003 prend en charge le modèle de code managé qui est fourni par Microsoft .NET Framework et le modèle de code Microsoft Windows natif non managé. Les informations contenues dans cet article s'appliquent uniquement à du code Visual C++ non managé.Microsoft Visual C++ 2005 prend en charge le modèle de code managé qui est fourni par Microsoft .NET Framework et le modèle de code Microsoft Windows natif non managé.
Agrandir tout | Réduire tout

Sommaire

Symptômes

Une table d'accélérateurs fournie par le biais de COleControl::OnGetControlInfo décrit des touches mnémoniques du contrôle OLE ne fonctionne pas dans les MFC 4.0 et conteneurs de contrôles OLE Visual Basic 4.0.

Cause

Visual Basic 4.0 et de MFC 4.0 fournissent différent mnémonique gérant des implémentations, donc ils nécessitent des entrées d'une table d'accélérateurs différents.

Résolution

Créer accélérateur entrées de table permettant mnémoniques d'un contrôle être traité dans le conteneur de contrôle à la fois un Visual Basic 4.0 et OLE MFC 4.0.

Statut

Ce comportement est voulu par la conception même du produit.

Plus d'informations

Un contrôle OLE substitue la méthode COleControl::OnGetControlInfo virtuelle pour permettre à son conteneur obtenir une description des touches mnémoniques du contrôle. La méthode OnGetControlInfo retourne une structure rempli de type CONTROLINFO contient, entre autres, un handle vers une table d'accélérateurs. Cette table d'accélérateurs est utilisée par le conteneur pour procéder à des vérifications de touches mnémoniques. Lorsque le conteneur détermine qu'un contrôle de mnémonique touche a été activée, elle appelle IOleControl::OnMnemonic du contrôle méthode. Dans ce cas, l'infrastructure MFC appeler la méthode de COleControl::OnMnemonic virtuelle, le contrôle peut substituer pour effectuer un traitement spécial.

Les implémentations de gestion de mnémonique de contrôle Visual Basic 4.0 et OLE MFC 4.0 ont des exigences différentes pour les entrées dans la table d'accélérateurs renvoyée par le biais de OnGetControlInfo.

Une touche accélérateur utilisée dans une table d'accélérateurs est définie par la structure ACCEL. Le ACCEL structure a la définition suivante :
   typedef struct tagACCEL
   {
       BYTE   fVirt;
       WORD   key;
       WORD   cmd;
   } ACCEL;
				
le membre fVirt Spécifie les indicateurs d'accélérateur. Ce membre peut être une combinaison des valeurs suivantes :
   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.
				
le membre clé spécifie la touche accélérateur. Ce membre peut être un code de touche virtuelle ou un code de caractère ASCII.

Le membre cmd Spécifie l'identificateur de l'accélérateur. Cette valeur est placée dans le mot de poids faible du paramètre wParam du message WM_COMMAND ou WM_SYSCOMMAND lorsque l'accélérateur est enfoncé.

Visual Basic 4.0 présente la configuration requise suivante pour les entrées d'une table d'accélérateurs utilisées pour la gestion des mnémonique :

  • Le membre fVirt doit être une combinaison de (FVIRTKEY | FALT) ou (FVIRTKEY | FALT | FSHIFT).
  • Le membre clé doit être en majuscule.
  • Le membre cmd ne doit pas être égal à 0.
MFC 4.0 présente la configuration requise suivante pour les entrées d'une table d'accélérateurs utilisées pour la gestion des mnémonique :

  • Le membre fVirt doit être FALT ou 0.
  • Le membre clé doit être en minuscule.
  • Le membre cmd est ignoré.
Conteneurs de contrôles OLE MFC 4.0 diffèrent également Visual Basic 4.0 dans la manière dont ils gèrent mnémonique traitement lorsqu'un contrôle est l'interface utilisateur actif. Lors de la gestion de clavier d'entrée MFC conteneurs, vérifiez d'abord pour voir si OLE contrôle a le focus. Dans ce cas, l'infrastructure appelle sa méthode IOleInPlaceActiveObject::TranslateAccelerator. Dans le COleControl la fonction du contrôle PreTranslateMessage implémentation de cette méthode est appelée. Dans l'ordre pour un contrôle OLE pour que sa fonction mnémoniques correctement lorsque le contrôle est l'interface utilisateur actif, le contrôle OLE doit substituer PreTranslateMessage et recherchez son combinaisons de touches spéciales.

Remarque : substitution de PreTranslateMessage n'est pas nécessaire si le contrôle est généré avec Visual C++ 5.0 ou version ultérieure car OnMnemonic sera appelée lorsque le contrôle est l'interface utilisateur actif au moyen de SendMnemonic dans COccManager::IsDialogMessage.

L'exemple de code suivant montre un substituée OnGetControlInfo PreTranslateMessage et OnMnemonic autoriser mnémoniques du contrôle fonctionner correctement dans un conteneur de contrôles OLE MFC 4.0 ainsi qu'un conteneur de Visual Basic 4.0.

Exemple de code

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

Propriétés

Numéro d'article: 145698 - Dernière mise à jour: samedi 1 mars 2014 - Version: 5.1
Les informations contenues dans cet article s'appliquent au(x) produit(s) suivant(s):
  • Microsoft Foundation Class Library 4.2 sur le système suivant
    • Microsoft Visual C++ 4.0 Édition Standard
    • Microsoft Visual C++ 5.0 Édition Entreprise
    • Microsoft Visual C++ 6.0 Édition Entreprise
    • Microsoft Visual C++ 5.0 Édition Professionnelle
    • Microsoft Visual C++ 6.0 Édition Professionnelle
    • 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 Initiation
    • Microsoft Visual C++ .NET 2002 Initiation
Mots-clés : 
kbnosurvey kbarchive kbmt kbinfo kbhowto kbtshoot kbacceleratorkey kbcode kbctrlcreate kbkeyaccel kbprb KB145698 KbMtfr
Traduction automatique
IMPORTANT : Cet article est issu du système de traduction automatique mis au point par Microsoft (http://support.microsoft.com/gp/mtdetails). Un certain nombre d?articles obtenus par traduction automatique sont en effet mis à votre disposition en complément des articles traduits en langue française par des traducteurs professionnels. Cela vous permet d?avoir accès, dans votre propre langue, à l?ensemble des articles de la base de connaissances rédigés originellement en langue anglaise. Les articles traduits automatiquement ne sont pas toujours parfaits et peuvent comporter des erreurs de vocabulaire, de syntaxe ou de grammaire (probablement semblables aux erreurs que ferait une personne étrangère s?exprimant dans votre langue !). Néanmoins, mis à part ces imperfections, ces articles devraient suffire à vous orienter et à vous aider à résoudre votre problème. Microsoft s?efforce aussi continuellement de faire évoluer son système de traduction automatique.
La version anglaise de cet article est la suivante: 145698
L'INFORMATION CONTENUE DANS CE DOCUMENT EST FOURNIE PAR MICROSOFT SANS GARANTIE D'AUCUNE SORTE, EXPLICITE OU IMPLICITE. L'UTILISATEUR ASSUME LE RISQUE DE L'UTILISATION DU CONTENU DE CE DOCUMENT. CE DOCUMENT NE PEUT ETRE REVENDU OU CEDE EN ECHANGE D'UN QUELCONQUE PROFIT.

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