Ameliorer code (msg.message==WM_KEYDOWN...)

Résolu
cs_Booster Messages postés 235 Date d'inscription mercredi 30 octobre 2002 Statut Membre Dernière intervention 6 octobre 2009 - 14 oct. 2007 à 12:24
cs_Booster Messages postés 235 Date d'inscription mercredi 30 octobre 2002 Statut Membre Dernière intervention 6 octobre 2009 - 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 !

5 réponses

cs_rt15 Messages postés 3874 Date d'inscription mardi 8 mars 2005 Statut Modérateur Dernière intervention 7 novembre 2014 13
18 oct. 2007 à 19:26
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
3
The_Guardian Messages postés 317 Date d'inscription vendredi 25 mai 2007 Statut Membre Dernière intervention 19 octobre 2007 1
14 oct. 2007 à 12:51
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
0
cs_Booster Messages postés 235 Date d'inscription mercredi 30 octobre 2002 Statut Membre Dernière intervention 6 octobre 2009
14 oct. 2007 à 13:26
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 !:)
0
The_Guardian Messages postés 317 Date d'inscription vendredi 25 mai 2007 Statut Membre Dernière intervention 19 octobre 2007 1
16 oct. 2007 à 12:12
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
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
cs_Booster Messages postés 235 Date d'inscription mercredi 30 octobre 2002 Statut Membre Dernière intervention 6 octobre 2009
8 nov. 2007 à 10:06
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 !
0
Rejoignez-nous