begin process at 2012 05 28 07:27:08
  Trouver un code source :
 
dans
 
Accueil > Forum > 

C

 > 

Windows

 > 

MFC

 > 

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


Derniers messages déposésPoser une question dans le forum ou lancer une discussion

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

dimanche 14 octobre 2007 à 12:24:38 | Ameliorer code (msg.message==WM_KEYDOWN...)

Booster

Membre Club
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 !


dimanche 14 octobre 2007 à 12:51:41 | Re : Ameliorer code (msg.message==WM_KEYDOWN...)

The_Guardian

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
dimanche 14 octobre 2007 à 13:26:07 | Re : Ameliorer code (msg.message==WM_KEYDOWN...)

Booster

Membre Club
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 !:)
mardi 16 octobre 2007 à 12:12:32 | Re : Ameliorer code (msg.message==WM_KEYDOWN...)

The_Guardian

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
jeudi 18 octobre 2007 à 19:26:25 | Re : Ameliorer code (msg.message==WM_KEYDOWN...)

rt15

Membre Club Administrateur CodeS-SourceS
Réponse acceptée !
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
jeudi 8 novembre 2007 à 10:06:26 | Re : Ameliorer code (msg.message==WM_KEYDOWN...)

Booster

Membre Club
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 !


Cette discussion est classée dans : wm, hwnd, msg, if, hdlg2


Répondre à ce message

Sujets en rapport avec ce message

pb a la fermeture de win [ par stick ] bonjours,alors voilou, je fais une appli en utilisant l'api window, mais si je ferme windows sans quitter le programme auparavant, celui ci plante et Screenmate defectueux [ par anthraxx ] Anthrax ignisque -- Le charbon et le feu J'essaye de faire un screenmate (une petite bestiole se promenant sur les fenetres), mais n'etant pas tres ex erreur(vc++6) [ par greg4 ] Linking...LIBCD.lib(crt0.obj) : error LNK2001: unresolved external symbol _mainDebug/fen.exe : fatal error LNK1120: 1 unresolved externalsError execut ressources et API !!!! [ par Xs ] salut !voila, pour me simplifier la tache, j'utlise les ressources pour creer une boite de dialog (sous VC++ 6).mais j'obtiens, lors de la compilation Problème avec WM_KEYDOWN: [ par cognac ] Pourquoi est-ce que "j" est toujours égal à 2 lorsque je presse F1(même la première fois). Je pensais qu'à chaque fois que je presse F1 "j" augmente d crer "dialog non modal" [ par comfm ] BonjourJe n'arrive pas à créer une boite de dialogue non modal, c'est à dire celle qui permet d'être tjs affichée et on peut cliquer derriere sans pro Colorier un static : HEeeeeeeelp !!! [ par sprintjeffC ] salut @ tousje me mets a la programmation windows en C/C++ (pas VC++ merci ... quitte à faire du microsoft je préfère VB ;-). Je démarrai pas mal et t Probleme de Timer avec SetCursorPos [ par Maegis ] Voila je fais une appli Win32 qui necesite l'emploi d'un timerLe probleme c'est que je ne recois jamois le message WM_TIMER ,en fait je le recois si j Dll + LoadLibrary [ par Manson ] Salut,voila, j'ai fais une dll dont le code est le suivant :void __declspec(dllexport)show_msg(HWND hWnd, char *msg){ MessageBox(hWnd, msg, "Dll Powa Portée des variables avec MFC : HELP !!! [ par sprintjeffC ] salut,j'ai commençé à coder pour la 1ere fois en C et MFC avec devc++ ... c cool. Petit problème toute fois : j'ai une main (spéciale en MFC) et une p


Nos sponsors


Sondage...

Comparez les prix

CalendriCode

Mai 2012
LMMJVSD
 123456
78910111213
14151617181920
21222324252627
28293031   

Consulter la suite du CalendriCode

A découvrir



 
Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel (EBArtSoft), Merci à Vincent pour ses précieux conseils.
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés

Google Coop CodeS-SourceS Google Coop CodeS-SourceS
Temps d'éxécution de la page : 2,668 sec (4)

Nous contacter | Annoncer sur CodeS-SourceS | Mentions légales