DetailPage-MSS-KB

Base de connaissances

Numéro d'article: 100770 - Dernière mise à jour: mardi 21 novembre 2006 - Version: 3.1

 

Résumé

De nombreuses applications utilisent une boîte de dialogue modale en tant que la fenêtre principale de l'application. Les applications qui utilisent cette technique peuvent également inclure un menu principal de la boîte de dialogue. En règle générale, un ou plusieurs des éléments de menu ont un accélérateur de clavier associé. Cet article décrit les étapes requises pour ajouter un menu et clavier accélérateurs à une application basée sur la boîte de dialogue Assistant Application MFC.

Plus d'informations

Une application classique, qui est développée pour le système d'exploitation Microsoft Windows en utilisant Visual C++ et le Kit de développement (SDK) Microsoft Windows et qui utilise les raccourcis clavier appelle la fonction TranslateAccelerator() dans sa boucle de messages principale. Toutefois, lorsque vous utilisez une boîte de dialogue modale en tant que fenêtre principale, l'application n'a pas d'une boucle de messages principale ; au lieu de cela, l'application utilise la boucle de messages de boîte de dialogue Gestionnaire (intégrée à Windows) pour traduire et distribue les messages. Bien sûr, car cette boucle de message n'est pas conçue pour traiter des accélérateurs, il n'appelle pas la fonction TranslateAccelerator().

Pour traiter les touches accélérateur dans une boîte de dialogue modale dans MFC, vous devez substituer la fonction CWinApp::ProcessMessageFilter(). L'infrastructure appelle ProcessMessageFilter() avant qu'il traite un message.

Pour modifier un type d'application basée sur la boîte de dialogue Assistant Application MFC dans Visual C++ .NET à traiter correctement les touches accélérateur, procédez comme suit :
  1. Dans Visual Studio .NET, créez une nouvelle application MFC. Dans le volet gauche de l'Assistant Application MFC, cliquez sur Type d'application et assurez-vous que le type d'application est définie sur basée sur des boîtes de dialogue.
  2. Dans Affichage des ressources, double-cliquez sur la ressource de boîte de dialogue pour ouvrir l'éditeur de ressources de boîtes de dialogue. L'ID de ressource de la ressource de boîte de dialogue est similaire à _DIALOG IDD_ MYPROJECT (MYPROJECT étant le nom que vous avez donné à votre projet d'application lors de sa création).
  3. Avec la ressource de boîte de dialogue ouverte dans l'éditeur de ressources de boîtes de dialogue, recherchez la fenêtre Propriétés. Modifier la boîte de dialogue propriété de bordure et spécifier le style de bordure étroite. Cette étape est requise pour une boîte de dialogue qui contient un menu.
  4. Créer une nouvelle ressource de menu qui contient une entrée de niveau supérieur appelée & fichier et un élément de menu nommé & Exit\tCTRL + E (CTRL + X est généralement associé à couper du texte, donc CTRL + E est utilisé à la place).
  5. Dans l'éditeur de menus, cliquez sur l'élément de menu Exit nouvellement créé. Dans la fenêtre Propriétés, assurez-vous que la propriété ID de l'élément de menu Exit est définie à ID_FILE_EXIT.
  6. Associer le nouveau menu à la boîte de dialogue en saisissant l'ID de menu dans la ressource de boîte de dialogue propriété menu. Ouvrez l'éditeur de boîtes de dialogue pour la ressource de boîte de dialogue et recherchez la propriété menu dans la fenêtre Propriétés. Définissez-la pour l'ID de ressource que vous avez créé pour le menu dans l'étape 4. Pour ce faire, cliquez sur la zone de liste déroulante dans la ligne de la propriété menu, puis cliquez sur pour sélectionner l'ID de ressource pour le menu dans la liste.
  7. Dans l'éditeur de menus, cliquez avec le bouton droit sur & Exit\tCTRL + E, puis cliquez sur Ajouter un gestionnaire d'événements.
  8. L'événement Assistant Gestionnaire de, sélectionnez le type de message de commande. Dans la liste de classe, sélectionnez la classe principale dérivée de CDialog pour le gestionnaire doit être généré dans. Assurez-vous que le nom de fonction de gestionnaire est approprié, puis cliquez sur Ajouter et modifier pour créer le Gestionnaire d'événement élément de menu.
  9. Insérez la ligne suivante dans la fonction Exit menu élément méthode de gestionnaire d'événements qui est généré dans l'étape 8:
    PostMessage(WM_COMMAND, IDOK, 0L);
    					
    Ceci produit revient à cliquer sur OK lorsque l'utilisateur clique sur Quitter dans le menu fichier. En cliquant sur OK, votre application de boîte de dialogue ferme.

  10. Créer une nouvelle ressource d'accélérateur et associer la CTRL + E combinaison avec ID_FILE_EXIT de touches. Enregistrez vos modifications.
  11. Modifier le fichier stdafx.h pour déclarer les variables globales suivantes après les instructions # include :
    extern HWND    ghDlg;          // Handle to main dialog box.
    extern HACCEL  ghAccelTable;   // Handle to accelerator table.
    					
  12. Dans le fichier .cpp qui contient le CWinApp implémentation de la classe dérivée (généralement le fichier .cpp avec le même nom de base comme votre nom de projet), ajoutez les initialisations de variables globales suivantes :
    HWND    ghDlg = 0;          // Handle to main dialog box.
    HACCEL  ghAccelTable = 0;   // Handle to accelerator table.
    					
  13. Dans le principal CDialog classe dérivée (pas la classe de boîte de dialogue qui implémente la boîte de dialogue à propos de par défaut), recherchez la méthode OnInitDialog(). Si nécessaire, vous pouvez ajouter un remplacement pour la méthode OnInitDialog(). Pour ce faire, cliquez sur pour sélectionner la classe dérivée de CDialog dans la fenêtre Affichage de classes, puis cliquez sur les substitutions dans la fenêtre Propriétés. Recherchez la ligne de OnInitDialog, puis cliquez sur la colonne de droite. Si OnInitDialog() n'est pas substituée pour cette classe, vous avez la possibilité pour créer un remplacement.
  14. Modifier la fonction que vous avez ajouté précédemment pour inclure la ligne de code suivante :
    ghDlg = m_hWnd;
    					
  15. Dans le fichier .cpp qui contient l'implémentation dérivée de CWinApp, recherchez la méthode de classe InitInstance(). Ajoutez la ligne suivante immédiatement après l'appel à la classe de base CWinApp::InitInstance() :
    ghAccelTable = LoadAccelerators(AfxGetInstanceHandle(),
    MAKEINTRESOURCE(IDR_ACCELERATOR1));
    					
    Remarque : l'ID de ressource qui est utilisé ici (IDR_ACCELERATOR1) est l'ID de la ressource de table d'accélérateurs est ajoutée dans l'étape 10.

  16. Ajoutez une substitution à la classe dérivée de CWinApp de la méthode de classe ProcessMessageFilter(). Pour ce faire, dans la fenêtre Affichage de classes, sélectionnez la classe dérivée de CWinApp dans votre projet. Dans la fenêtre Propriétés, cliquez sur les remplacements. Recherchez la ligne ProcessMessageFilter dans la fenêtre Propriétés et sélectionnez la colonne la plus à droite de cette ligne. Cliquez sur la flèche déroulante, puis cliquez sur l'option pour ajouter un remplacement pour la méthode ProcessMessageFilter.
  17. Modifier la substitution de méthode ProcessMessageFilter() afin qu'il ait l'implémentation suivante :
    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. Compilez et exécutez l'application. Notez qu'il dispose d'un menu. Lorsque vous cliquez sur Quitter dans le menu fichier, ou appuyez sur CTRL + E, l'application se ferme, comme prévu.

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++ 2.0 Édition Professionnelle
    • Microsoft Visual C++ 2.1
    • Microsoft Visual C++ 4.0 Édition Standard
    • Microsoft Visual C++ 5.0 Édition Standard
    • Microsoft Visual C++ 6.0 Service Pack 5
    • Microsoft Visual C# .NET 2002 Initiation
Mots-clés : 
kbmt kbacceleratorkey kbhowto kbkeyaccel kbmenu kbui KB100770 KbMtfr
Traduction automatiqueTraduction 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: 100770  (http://support.microsoft.com/kb/100770/en-us/ )
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.
Partager
Options de support supplémentaire
Forums du support Microsoft Community
Nous contacter directement
Trouver un partenaire Microsoft Certified Partner
Microsoft Store