Case WM_KEYDOWN marche pas quand je suis dans un contrôle.

Résolu
cs_paramotdam Messages postés 29 Date d'inscription jeudi 24 mars 2005 Statut Membre Dernière intervention 29 mai 2009 - 18 août 2007 à 17:49
racpp Messages postés 1909 Date d'inscription vendredi 18 juin 2004 Statut Modérateur Dernière intervention 14 novembre 2014 - 20 août 2007 à 15:29
Bonjour,
Quand je lance mon programme et que j'appuie sur la touche Entrer, le programme va bien dans VK_RETURN et exécute "SendMessage(MaFenetre, WM_COMMAND, ID_B_ENVOYER, 0);".
Si je met mon curseur dans un contrôle (par exemple editbox), quand j'appuie sur Entrer, rien ne se passe :S.
Comment puis-je faire ?
Voici mon code :
/************************************/
        case WM_KEYDOWN:
            switch(wParam)
            {
                case VK_RETURN:
                    SendMessage(MaFenetre, WM_COMMAND, ID_B_ENVOYER, 0);
                    break;
                default:
                    break;
            }
            return 0;
/************************************/
J'ai une autre question :
J'aimerais savoir si c'est possible de donner le focus à mon editbox en cliquant sur un bouton.
Du genre :
case "clique bouton" :
setfocus(editbox);         // c'est cette ligne qu'il me faudrait, si c'est possible.

Merci,
Damien

6 réponses

cs_juju12 Messages postés 966 Date d'inscription samedi 3 avril 2004 Statut Membre Dernière intervention 4 mars 2010 4
18 août 2007 à 19:13
SetFocus(hButtonWnd) tout simplement.
Pour ton problème y a une source déposée récemment traitant d'un truc similaire (MOUSEMOVE sur un contrôle).
3
racpp Messages postés 1909 Date d'inscription vendredi 18 juin 2004 Statut Modérateur Dernière intervention 14 novembre 2014 17
19 août 2007 à 14:16
Salut,
Tu crées un bouton , visible ou non, ayant comme style BS_DEFPUSHBUTTON et comme identificateur IDOK comme ceci:
hBouton=CreateWindowEx(0, "Button", "Ok",
WS_VISIBLE | WS_CHILD | BS_DEFPUSHBUTTON  , 20, 20, 60,
20, hwndparent, (HMENU)IDOK, 0, 0);
A l'appui sur la touche Entrée, et ce quelque soit le controle ayant le focus, ta fenêtre mère recevra WM_COMMAND avec le hwnd du bouton et son identificateur. A toi de choisir lequel des deux utiliser.
Si le parent est une boite de dialogue tout marchera directement. Si c'est une fenêtre normale, la boucle des messages devrait ressembler à ceci:
MSG Msg;
while (GetMessage(&Msg, NULL, 0, 0))
{
    if (!IsDialogMessage(hwnd, &Msg))
    {
    TranslateMessage(&Msg);
    DispatchMessage(&Msg);
    }
}
3
cs_paramotdam Messages postés 29 Date d'inscription jeudi 24 mars 2005 Statut Membre Dernière intervention 29 mai 2009
18 août 2007 à 21:29
pour ma première question, c'est ok, merci.

Mais pour la deuxième, je n'ai pas trouvé le post correspondant à MOUSEMOVE. Si tu as le lien, se m'aiderait...

Damien
0
cs_juju12 Messages postés 966 Date d'inscription samedi 3 avril 2004 Statut Membre Dernière intervention 4 mars 2010 4
19 août 2007 à 11:36
C'est la source de rt15 encore dans la liste du sommaire, "savoir quand la souris est sur un contrôle".
0

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

Posez votre question
cs_paramotdam Messages postés 29 Date d'inscription jeudi 24 mars 2005 Statut Membre Dernière intervention 29 mai 2009
20 août 2007 à 10:48
merci beaucoup, sa marche au top !
Saurait tu me dire ce qu'est exactement IsDialogMessage(hwnd, &Msg), histoire de comprendre un peu .
Je ne même pas eu besoin de mettre un "case" pour l'appui sur "Enter".
On dirait que sa quand on appui sur entré, sa actionne le bouton ayant l'identifiant le plus petit :
#define ID_M_ENVOYER      1
Quand je met "#define ID_B_EFFACER" à 1 et "#define ID_M_ENVOYER" à 2 alors quand j'appui sur entré, sa actionne effacer.
0
racpp Messages postés 1909 Date d'inscription vendredi 18 juin 2004 Statut Modérateur Dernière intervention 14 novembre 2014 17
20 août 2007 à 15:29
Une boite de dialogue a sa propore boucle des messages. Cette dernière traite les messages du clavier comme l'appui sur les touches TAB, Enter, les flèches etc. Ce n'est pas le cas avec les fenêtres normales. IsDialogMessage() permet de vérifier si ces messages sont traités. Si oui elle retourne 1, sinon elle retourne 0. Elle retournera donc 0 pour une  fenêtre. Dans ce cas, on appelle TranslateMessage() et DispatchMessage() afin de les transmettre à la procédure de la fenêtre.
Le comportement que tu as remarqué est tout à fait normal car 1 correspond à l'identificateur IDOK comme défini dans winuser.h:
#define IDOK                1
#define IDCANCEL            2
#define IDABORT             3
#define IDRETRY             4
#define IDIGNORE            5
#define IDYES               6
#define IDNO                7
Evite donc de réutiliser les valeurs d'identificateurs déjà utilisées. Tu peux prendre des valeurs supérieures à 100 par exemple.
0
Rejoignez-nous