cs_paramotdam
Messages postés29Date d'inscriptionjeudi 24 mars 2005StatutMembreDernière intervention29 mai 2009
-
18 août 2007 à 17:49
racpp
Messages postés1909Date d'inscriptionvendredi 18 juin 2004StatutModérateurDernière intervention14 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
A voir également:
Case WM_KEYDOWN marche pas quand je suis dans un contrôle.
racpp
Messages postés1909Date d'inscriptionvendredi 18 juin 2004StatutModérateurDernière intervention14 novembre 201417 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);
}
}
cs_paramotdam
Messages postés29Date d'inscriptionjeudi 24 mars 2005StatutMembreDernière intervention29 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.
racpp
Messages postés1909Date d'inscriptionvendredi 18 juin 2004StatutModérateurDernière intervention14 novembre 201417 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.