Ameliorer code (msg.message==WM_KEYDOWN...) [Résolu]

cs_Booster 235 Messages postés mercredi 30 octobre 2002Date d'inscription 6 octobre 2009 Dernière intervention - 14 oct. 2007 à 12:24 - Dernière réponse : cs_Booster 235 Messages postés mercredi 30 octobre 2002Date d'inscription 6 octobre 2009 Dernière intervention
- 8 nov. 2007 à 10:06
Bonjour à tous,

Dans un sousi de rendre mon code le plus lisible possible j'aimerais savoir s'il n'y à pas une façons plus charmante, plus courte de coder la detection d'une touche : (Je vous épargne les déclarations etc...)

//J'ai créer 2 dialog box et mon but est de detecter quand j'appui sur entrée dans quelle dialogbox je me trouve
hDlg = CreateDialog(hInstance, MAKEINTRESOURCE(IDD_DIALOG1), NULL, DialogProc);
hDlg2 = CreateDialog(hInstance, MAKEINTRESOURCE(IDD_DIALOG2), NULL, DialogProc2);

    while (GetMessage(&msg, NULL, 0, 0))
    {

        if (hDlg || IsDialogMessage(hDlg, &msg))
        {
           //Detecte l'appui sur la touche entrée
            if (msg.message == WM_KEYDOWN && msg.wParam==VK_RETURN){
                msg.message =WM_COMMAND;
                msg.wParam= IDC_BUTTON1; //La touche entrée simule l'appui sur bouton
                if (msg.hwnd == GetDlgItem( hDlg , IDC_EDIT1)) //Si je suis dans la dialog box 1
                    msg.hwnd =hDlg;
                if (msg.hwnd= =GetDlgItem( hDlg2 , IDC_EDIT1)) //Si je suis dans la dialog box 2
                    msg.hwnd =hDlg2;
                if (msg.hwnd= =GetDlgItem( hDlg2 , IDC_EDIT2)) //....
                    msg.hwnd =hDlg2;
                //Je réalise le traitement normal des messages pour réaliser le traitement qui a dans IDC_BUTTON1
                TranslateMessage(&msg);
                DispatchMessage(&msg);
//Pareil quand j'appui sur tab je regarde
dans quelle dialog box je me trouve et si je suis dans la 2ème alors je
change de case !
            }else if (msg.message= =WM_KEYDOWN && msg.wParam==VK_TAB){
                    if (msg.hwnd==GetDlgItem( hDlg2 , IDC_EDIT1))
                        PostMessage(hDlg2, WM_NEXTDLGCTL, 0, 0); //ctrl suivant
                    if (msg.hwnd ==GetDlgItem(hDlg2, IDC_EDIT2))
                        PostMessage(hDlg2, WM_NEXTDLGCTL, 1, 0); //ctrl précédent
                       
            }else{              
                //Je réalise le traitement normal des messages dans les autres cas
                TranslateMessage(&msg);
                DispatchMessage(&msg);
            }
        }
    }

Merci d'avance de votre aide !
Afficher la suite 

5 réponses

Répondre au sujet
cs_rt15 3982 Messages postés mardi 8 mars 2005Date d'inscription 7 novembre 2014 Dernière intervention - 18 oct. 2007 à 19:26
+3
Utile
Salut,


Pour la première série de test, tu pourrais essayer de mettre en place
le handle de la fenêtre parente dans le message. De cette manière il
devrait mettre hDlg et hDlg2 sans même un if :


            if (msg.message==WM_KEYDOWN && msg.wParam==VK_RETURN){

                msg.message=WM_COMMAND;

                msg.wParam=IDC_BUTTON1; //La touche entrée simule l'appui sur bouton

               msg.hwnd = GetParent(msg.hwnd);

3ème année en ecole d'ingé d'info cherche stage de 4 mois à partir du 01/04/08
Cette réponse vous a-t-elle aidé ?  
Commenter la réponse de cs_rt15
The_Guardian 318 Messages postés vendredi 25 mai 2007Date d'inscription 19 octobre 2007 Dernière intervention - 14 oct. 2007 à 12:51
0
Utile
Bonjour,

Ok pour rendre ça plus élégant, je ferais des fonctions genre tabIsPressed( ) et enterIsPressed( ) comme ça ça t'éviterait de faire du contrôle propre à l'application avec du contrôle de touches, mais bon au final tu auras tous tes if quand même..

=

Une autruche ne se cuit pas aux petits lardons
Commenter la réponse de The_Guardian
cs_Booster 235 Messages postés mercredi 30 octobre 2002Date d'inscription 6 octobre 2009 Dernière intervention - 14 oct. 2007 à 13:26
0
Utile
Enfet je cherche si possible à arranger surtout ça : msg.hwnd==GetDlgItem(hDlg2, IDC_EDIT1)
Y'a pas un moyen de savoir à quel hDlg appartient le msg.hwnd par exemple ? au lieu de faire la technique bourin que je fais de comparrer le msg.hwnd à tous mes controles ... parce que l'a j'en est 3 donc ça va mais si j'en est 20 ben bonjours les dégars ^^

Merci !:)
Commenter la réponse de cs_Booster
The_Guardian 318 Messages postés vendredi 25 mai 2007Date d'inscription 19 octobre 2007 Dernière intervention - 16 oct. 2007 à 12:12
0
Utile
Re,

Ah, là je peux te proposer une méthode qui s'éloigne un peu des composants particuliers, et faire un truc un peu plus général.
tu as un objet "o" que tu veux comparer à un ensemble d'objets "d1", "d2", "d3", ..., "dn"
Et donc tu pourrais utiliser une hashtable (tableau associatif) dans lequel tu remplis initialement tous tes "d1", "d2", etc.
Et c'est surtout pratique si la taille de ta hashtable est bien plus grand que ton "n"
Aussi,  une autre solution c'est de mettre tout dans un arbre, et  là tu te garantis une recherche rapide de ton "o" parmi tous les "d_i"
Soit  plus clairement au lieu de faire :
if (o==d1) { ... }
 if (o==d2) { ... }
je te proposerais de faire plutôt:
d = getD(o);
if (d!=NULL) { o = d; } // ou bien n'importe quelle fonction utilisant "d"

=

Une autruche ne se cuit pas aux petits lardons
Commenter la réponse de The_Guardian
cs_Booster 235 Messages postés mercredi 30 octobre 2002Date d'inscription 6 octobre 2009 Dernière intervention - 8 nov. 2007 à 10:06
0
Utile
MERCI !! un peu tard mais je ne viens de tester la solution que maintenant :)

Merci RT15 c'est exactement ce que je cherchais ;) Du cou mon code est LARGEMENT plus clair :) ! un grand merci à toi ;)

Bonne continuation à tous !
Commenter la réponse de cs_Booster

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.