[VC++6 / API Win32] détecter la touche "entrée" dans un edit box

détecter la touche "entrée" dans un edit box [VC++6 / API Win32] - C++ - Programmation

Marsh Posté le 17-10-2002 à 13:06:44    

Salut!
 
La question est dans le titre mais je vais apporter kkes précisions.
Actuellement ce que j'écris dans mon edit (1 seule ligne), je peux le valider par un bouton. Je désire supprimer ce bouton et valider plutôt par la touche "entrée", mais je n'ai rien trouvé de concluant.
 
Si quelqu'un a une piste, ce serait top.
 
PS : pas de MFC ici, c'est tout en API
 
Thx !!

Reply

Marsh Posté le 17-10-2002 à 13:06:44   

Reply

Marsh Posté le 17-10-2002 à 16:26:12    

:bounce:  :D

Reply

Marsh Posté le 17-10-2002 à 18:15:15    

il y a le message Wm_KEYDOWN je crois, et après, tu recherche si le code du caractère tapé est celui de la touche entré...

Reply

Marsh Posté le 17-10-2002 à 19:25:14    

salut, j'y ai bien pensé oui, le problème c'est que WM_KEYDOWN ne me fournit pas le handle de l'objet dans lequel j'ai tapé entrée... donc si j'ai 2 edit box par exemple, je rique de taper dans une et valider la deuxième  ;)
 
J'ai pensé aussi à EN_CHANGE qui détecte si le contenu d'un edit a changé en me renvoyant l'handle de l'édit, mais je sais pas si la touche entrée est considérée comme un changement et de toute façons ça ne me renvoie pas quelle touche a été pressée, ça ne correspond donc pas non plus.
 
Bref doit bien exister un message qui corresponde à ce que je cherche mais j'ai pas encore trouvé... Please help !!!
 
En tous les cas merci pour ta réponse  :)

Reply

Marsh Posté le 18-10-2002 à 08:16:32    

Cool Coyote a écrit a écrit :

Salut!
 
La question est dans le titre mais je vais apporter kkes précisions.
Actuellement ce que j'écris dans mon edit (1 seule ligne), je peux le valider par un bouton. Je désire supprimer ce bouton et valider plutôt par la touche "entrée", mais je n'ai rien trouvé de concluant.
 
Si quelqu'un a une piste, ce serait top.
 
PS : pas de MFC ici, c'est tout en API
 
Thx !!




 
Il faut que tu modifies les propriétés de ton edit grâce à la fonction SetWindowLong.

Code :
  1. WNDPROC oldProc = (WNDPROC)SetWindowLong(GetDlgItem(hwnd, IDC_EDIT), GWL_WNDPROC, (LONG)editProc);


A chaque fois que ton edit recoit un message la fonction editProc va être appelée et t'as plus qu'a gérer la touche entrée. oldProc est l'ancienne fonction qui était associée à ton edit.
 

Code :
  1. LRESULT CALLBACK editProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
  2. {
  3. int id = GetDlgCtrlID(hwnd);
  4.   if (IDC_EDIT == id)
  5.   {
  6.    switch (message)
  7.    {
  8.     case WM_KEYDOWN :
  9.      if (wParam == VkKeyScan(0x0D))
  10.      {
  11.                           // Gestion de la touche entrée.
  12.      }
  13.      break;
  14.    }
  15. }
  16. return CallWindowProc(oldProc, hwnd, message, wParam, lParam);
  17. }


 

Reply

Marsh Posté le 18-10-2002 à 09:49:17    

ahhhhhhh !!!! merci à toi !!!  :love:  
Je désespérais un peu j'avoue  ;)  
 
J'ai pas le code sous les yeux là mais d'ici ce soir je vais tester tout ça !
 
Merci encore  :)

Reply

Marsh Posté le 22-02-2003 à 16:33:11    

J'ai créé un edit dans ma dialog, j'y ai géré avec la méthode ci-dessus l'appui sur touche entrée. Seulement il n'y a pas de bouton avec la propriété "Default" et donc lorsque j'appui sur entrée et bien ça fait bien ce que je veux mais j'ai droit à un beep à chaque fois !
Comment faire pour éviter ça ?

Reply

Marsh Posté le 22-02-2003 à 18:20:13    

Citation :

salut, j'y ai bien pensé oui, le problème c'est que WM_KEYDOWN ne me fournit pas le handle de l'objet dans lequel j'ai tapé entrée


 
Lorsque tu recois un evenement, tu recois le handle de la fenetre concernee ...

Code :
  1. LRESULT CALLBACK WndProc( HWND hWnd, UINT Msg, WPARAM wParam, LPARAM lParam )
  2. {
  3.     if ( Msg == WM_CHAR )
  4.     {
  5.         // hWnd = handle de la fenetre qui a recu le caractere
  6.     }


Citation :

Comment faire pour éviter ça ?


ca doit venir du fait qu'il appelles quand meme oldProc alors qu'il a traite l'evenement.
Ton edit fait alors le traitement normal. Il doit pas etre multiline, donc quand tu fais <entree>, il beep parceque tu peux pas faire multiline.
Donc dans ce cas faut renvoyer 0 et non pas appeler oldProc.
Vaut mieux utiliser WM_CHAR aussi. J'ai pas testé, mais je suis pas sûr que WM_KEYDOWN marche pour la touche entree du pad numerique.


Message édité par HelloWorld le 22-02-2003 à 18:31:51

---------------
FAQ fclc++ - FAQ C++ - C++ FAQ Lite
Reply

Marsh Posté le 15-07-2011 à 15:44:35    

LRESULT CALLBACK EditProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
{
 switch(message)
 {
  case WM_CHAR:
   if(wParam == VK_RETURN)    /* Si il detecte la touche Entrer*/
   {
     
   }
 }
 
 return CallWindowProc(oldProc, hwnd, message, wParam, lParam);
}

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed