Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
1837 connectés 

  FORUM HardWare.fr
  Programmation

  [VISUAL C++] [MFC] touche ENTREE

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

[VISUAL C++] [MFC] touche ENTREE

n°153482
velleronna​is
Posté le 07-06-2002 à 12:10:29  profilanswer
 

Bonjour,
 
Je voudrais savoir comment recuperer l'evenement : touche ENTREE appuyee ?
 
En clair, j'ai une boite de dialogue et lorsque l'utilisateur appuie sur la touche entree je souhaite executer un code particulier. J'ai essaye OnKeyDown() et des trucs dans le genre, mai je m'en sort pas trop.
 
En JAVA je mettais un listener sur les touches mais la je ne trouve pas .... MERCI beaucoup par avance !!!
 
votre devoue serviteur.

mood
Publicité
Posté le 07-06-2002 à 12:10:29  profilanswer
 

n°153489
Harkonnen
Modérateur
Un modo pour les bannir tous
Posté le 07-06-2002 à 12:14:36  profilanswer
 

Essaie avec OnKeyUp().
 
Sinon poste ton code pour voir ce qui cloche


---------------
J'ai un string dans l'array (Paris Hilton)
n°153519
velleronna​is
Posté le 07-06-2002 à 12:28:45  profilanswer
 

Ben mon pb, c'est que je passe jamais dans la methode OnKeyDown ou OnKeyUp ...  
je pensait que lorsque l'on appuie sur une touche on rentrait dans cette methode et on effectue le code, mais je met un point d'arret et je m'arrete pas sur ce point d'arret, donc je ne passe jamais dans cette methode (point d'arret sur la seconde ligne):
 
void CLASSE_A::OnKeyUp(UINT nChar, UINT nRepCnt, UINT nFlags)  
{
 int toto;  
 CDialog::OnKeyUp(nChar, nRepCnt, nFlags);
}
 
Est ce que j'ai pas compris quelque chose ou je m'y prend mal ?

n°153521
El_gringo
Posté le 07-06-2002 à 12:32:36  profilanswer
 

velleronnais a écrit a écrit :

Ben mon pb, c'est que je passe jamais dans la methode OnKeyDown ou OnKeyUp ...  
je pensait que lorsque l'on appuie sur une touche on rentrait dans cette methode et on effectue le code, mais je met un point d'arret et je m'arrete pas sur ce point d'arret, donc je ne passe jamais dans cette methode (point d'arret sur la seconde ligne):
 
void CLASSE_A::OnKeyUp(UINT nChar, UINT nRepCnt, UINT nFlags)  
{
 int toto;  
 CDialog::OnKeyUp(nChar, nRepCnt, nFlags);
}
 
Est ce que j'ai pas compris quelque chose ou je m'y prend mal ?  




 
Cette FONCTION (c pas du Java, en C on parle de fonctions) OnKeyUp de CLASSE_A, elle est bien mappée au début de ton .cpp ?
T'as bien une macro qui associe l'évènement WM_KEYUP à la fonction OnKeyUp ?

n°153527
velleronna​is
Posté le 07-06-2002 à 12:42:33  profilanswer
 

pour repondre a ta question, oui, elle est bien mappe au debut, c'est pourquoi je pige pas trop ... HELP !
/////////
BEGIN_MESSAGE_MAP(CLASSE_A, CDialog)
 //{{AFX_MSG_MAP(CLASSE_A)
 ON_BN_CLICKED(IDOK_VALID_NEW_PARAMETERS, OnValidNewParameters)
 ON_EN_KILLFOCUS(IDC_EDIT_TOTO, OnKillfocusEditToto)
 ON_NOTIFY(TCN_SELCHANGE, IDC_TATA, OnSelchangeTata)
 ON_WM_KEYUP()
 //}}AFX_MSG_MAP
END_MESSAGE_MAP()
 
/////////
 
ps : il me semble qu'en C++, on appele methode toute fonction faisant partie d'une classe. Le c++ permet donc les methodes et les fonctions, le Java ne connait que les methodes.

n°153529
velleronna​is
Posté le 07-06-2002 à 12:44:28  profilanswer
 

par contre pour ce qui est de la macro, je maitrise pas ce que tu me dit .... que doit je faire ?

n°153571
Harkonnen
Modérateur
Un modo pour les bannir tous
Posté le 07-06-2002 à 13:46:04  profilanswer
 

velleronnais a écrit a écrit :

Ben mon pb, c'est que je passe jamais dans la methode OnKeyDown ou OnKeyUp ...  
je pensait que lorsque l'on appuie sur une touche on rentrait dans cette methode et on effectue le code, mais je met un point d'arret et je m'arrete pas sur ce point d'arret, donc je ne passe jamais dans cette methode (point d'arret sur la seconde ligne):
 
void CLASSE_A::OnKeyUp(UINT nChar, UINT nRepCnt, UINT nFlags)  
{
 int toto;  
 CDialog::OnKeyUp(nChar, nRepCnt, nFlags);
}
 
Est ce que j'ai pas compris quelque chose ou je m'y prend mal ?  




1 - Dans quel controle souhaite tu récupérer cet évènement ?
2 - Ce code est faux ! Tu ne testes pas la touche enfoncée, comment veux tu réagir à l'appui sur cette touche ?
 
Tu dois taper ceci :

Code :
  1. void CLASSE_A:: OnKeyUp(UINT nChar, UINT nRepCnt, UINT nFlags)
  2. {
  3.         int toto; // a quoi sert cette variable ?
  4.         if (nChar && VK_ENTER) {
  5.              // ton traitement ici
  6.         }
  7.         CDialog:: OnKeyUp(nChar, nRepCnt, nFlags);
  8. }


Mais si cette classe n'est pas rattachée à un controle, ça ne marchera jamais. Ou alors, tu redéfinis la fonction PreTranslateMessage().


Message édité par Harkonnen le 06-07-2002 à 13:47:06

---------------
J'ai un string dans l'array (Paris Hilton)
n°153576
Harkonnen
Modérateur
Un modo pour les bannir tous
Posté le 07-06-2002 à 13:48:08  profilanswer
 

el_gringo a écrit a écrit :

 
Cette FONCTION (c pas du Java, en C on parle de fonctions)



Oui, mais en C++ on parle de méthode. Cette terminologie est valable pour tous les langages OO  :D


---------------
J'ai un string dans l'array (Paris Hilton)
n°153617
velleronna​is
Posté le 07-06-2002 à 14:25:19  profilanswer
 

MERCI .. je vais essayer de mettre en application tes conseils ..
 
(int toto; ne servait a rien bien sur .. c'etait juste comme ca .... pour mettre quelque chose dans la methode).
 
Encore Merci

n°153630
El_gringo
Posté le 07-06-2002 à 14:36:06  profilanswer
 

Harkonnen a écrit a écrit :

 
1 - Dans quel controle souhaite tu récupérer cet évènement ?
2 - Ce code est faux ! Tu ne testes pas la touche enfoncée, comment veux tu réagir à l'appui sur cette touche ?
 
Tu dois taper ceci :

Code :
  1. void CLASSE_A:: OnKeyUp(UINT nChar, UINT nRepCnt, UINT nFlags)
  2. {
  3.         int toto; // a quoi sert cette variable ?
  4.         if (nChar && VK_ENTER) {
  5.              // ton traitement ici
  6.         }
  7.         CDialog:: OnKeyUp(nChar, nRepCnt, nFlags);
  8. }


Mais si cette classe n'est pas rattachée à un controle, ça ne marchera jamais. Ou alors, tu redéfinis la fonction PreTranslateMessage().  




 
1 - Apparement, c'est dans toute la CDialog qu'il veut récupérer le contrôle.
2 - Pour l'instant, il dit que ça n'passe même pas dans la fonction quand on presse une touche. Pour filter selon la touche relachée (il test OnKeyUp), il verra bien après...

mood
Publicité
Posté le 07-06-2002 à 14:36:06  profilanswer
 

n°153636
smaragdus
whores, drugs & J.S. Bach
Posté le 07-06-2002 à 14:39:06  profilanswer
 

Harkonnen a écrit a écrit :

 
Oui, mais en C++ on parle de méthode. Cette terminologie est valable pour tous les langages OO  :D  




 
 :jap:

n°153640
velleronna​is
Posté le 07-06-2002 à 14:40:24  profilanswer
 

C'est exactement ca EL_GRINGO !!!
 
-> je passe pas dans la methode quelque soit la touche pressee ...
 
-> la classe qui implemente OnKeyDown, je la cre grace au classwizard ... donc je ne sait plus trop a quel saint me vouer ...
 
-> VK_ENTER c'est pour JAVA il me semble ...

n°153644
Harkonnen
Modérateur
Un modo pour les bannir tous
Posté le 07-06-2002 à 14:42:13  profilanswer
 

velleronnais a écrit a écrit :

-> je passe pas dans la methode quelque soit la touche pressee ...



Dans ce cas, c'est dans PreTranslateMessage() que ça se passe...


---------------
J'ai un string dans l'array (Paris Hilton)
n°153651
Harkonnen
Modérateur
Un modo pour les bannir tous
Posté le 07-06-2002 à 14:51:43  profilanswer
 

un exemple de code quand même, je suis pas un gueux :d
 

Code :
  1. CTaBoiteDeDialogue:: PreTranslateMessage(MSG *pMsg) {
  2.      if (pMsg->message == WM_KEYUP && pMsg->wParam == VK_ENTER) {
  3.           // traitement
  4.      }
  5. }


par contre, j'ai un doute, je sais plus si le code de la touche est dans wParam ou lParam. mais bon, si l'un ne marche pas, alors c'est l'autre :d
 
EDIT: font chier ces smileys !!


Message édité par Harkonnen le 06-07-2002 à 14:52:33

---------------
J'ai un string dans l'array (Paris Hilton)
n°153652
velleronna​is
Posté le 07-06-2002 à 14:52:15  profilanswer
 

OK, THANKS !!!! j'y retourne .....

n°153676
velleronna​is
Posté le 07-06-2002 à 15:12:15  profilanswer
 

MERCI BEAUCOUP EN TOUT CAS ... j'ai fait comme cela et ca marche pile poil :
 
BOOL CLASSE_A::PreTranslateMessage(LPMSG lpmsg)
{
    BOOL bHandleNow = FALSE;
 
    switch (lpmsg->message)
    {
    case WM_KEYDOWN:
        switch (lpmsg->wParam)
        {
        case VK_RETURN:
              bHandleNow = TRUE;
            break;
        }
        if (bHandleNow)
            OnKeyDown(lpmsg->wParam, LOWORD(lpmsg  
                ->lParam), HIWORD(lpmsg->lParam));
        break;
    }
    return bHandleNow;
}
 
MERCI ENCORE UNE FOIS, ca faisait un moment que ca m'embettais !

n°153720
Harkonnen
Modérateur
Un modo pour les bannir tous
Posté le 07-06-2002 à 15:30:20  profilanswer
 

Mission accomplie :d
 
 :hello:


---------------
J'ai un string dans l'array (Paris Hilton)
n°153728
Harkonnen
Modérateur
Un modo pour les bannir tous
Posté le 07-06-2002 à 15:34:54  profilanswer
 

Citation :


case VK_RETURN:  
           bHandleNow = TRUE;  
           break;  
       }  
       if (bHandleNow)  
           OnKeyDown(lpmsg->wParam, LOWORD(lpmsg  
               ->lParam), HIWORD(lpmsg->lParam));  
       break;
(...)


Pourquoi ne pas mettre le code contenu dans OnKeyDown dans le case VK_RETURN au lieu tester un flag (bHandleNow) ?
C'est pas propre en plus : OnKeyDown est une fonction liée à un évenement, tu ne dois jamais l'appeler toi même.
Et si tu testes les messages dans PreTranslateMessage(), tu n'as plus besoin du OnKeyDown()


---------------
J'ai un string dans l'array (Paris Hilton)
n°153749
velleronna​is
Posté le 07-06-2002 à 15:46:03  profilanswer
 

Ben en fait j'ai pas trop invente ce code, je l'ai trouve texto (grace a ton aide precieuse) dans la MSDN (la page s'intitule : ActiveX Controls: Advanced Topics)
 
J'suis d'accord avec toi sur le principe, mais c'est les p'tits gars de crosoft qui conseillent de faire comme ca ...

n°153785
Harkonnen
Modérateur
Un modo pour les bannir tous
Posté le 07-06-2002 à 16:00:08  profilanswer
 

Si c'est crosoft qui le dit alors... j'en prends bonne note aussi  :)  
 
A+  :hello:


---------------
J'ai un string dans l'array (Paris Hilton)
n°153846
El_gringo
Posté le 07-06-2002 à 16:27:05  profilanswer
 

velleronnais a écrit a écrit :

Ben en fait j'ai pas trop invente ce code, je l'ai trouve texto (grace a ton aide precieuse) dans la MSDN (la page s'intitule : ActiveX Controls: Advanced Topics)
 
J'suis d'accord avec toi sur le principe, mais c'est les p'tits gars de crosoft qui conseillent de faire comme ca ...  




 
Ouais, ms microsoft, à mon avis, ils font un truc du genre parce qu'ils testent plusieurs touches qui feront là même chose, genre, dans le switch, il doit y avoit d'autres VK que le return, sans break. là c logique, ms dans ton cas ça sert à rien du tout !

n°153880
velleronna​is
Posté le 07-06-2002 à 16:53:20  profilanswer
 

exactement !!! On peut rien te cacher :
 
voici le CTRL+V complet de la page qui m'a aidee :
 
Handling Special Keys in Your Control
 
In some cases you may want to handle certain keystroke combinations in a special way; for example, insert a new line when the ENTER key is pressed in a multiline text box control or move between a group of edit controls when a directional key ID pressed.
 
If the base class of your ActiveX control is COleControl, you can override CWnd::PreTranslateMessage to handle messages before the container receives them. When using this technique, always return TRUE if you handle the message in your override of PreTranslateMessage.
 
The following code example demonstrates a possible way of handling any messages related to the directional keys.
 
BOOL CSampleControl::PreTranslateMessage(LPMSG lpmsg)
{
    BOOL bHandleNow = FALSE;
 
    switch (lpmsg->message)
    {
    case WM_KEYDOWN:
        switch (lpmsg->wParam)
        {
        case VK_UP:
        case VK_DOWN:
        case VK_LEFT:
        case VK_RIGHT:
            bHandleNow = TRUE;
            break;
        }
        if (bHandleNow)
            OnKeyDown(lpmsg->wParam, LOWORD(lpmsg  
                ->lParam), HIWORD(lpmsg->lParam));
        break;
    }
    return bHandleNow;
}
 
For more information on handling keyboard interfaces for an ActiveX control, see the ActiveX SDK documentation.

n°153882
Harkonnen
Modérateur
Un modo pour les bannir tous
Posté le 07-06-2002 à 16:55:08  profilanswer
 

Effectivement, je comprends mieux, même si je maintiens qu'appeler directement OnKeyDown() c'est mal  :non:


---------------
J'ai un string dans l'array (Paris Hilton)
n°153887
El_gringo
Posté le 07-06-2002 à 17:00:17  profilanswer
 

Harkonnen a écrit a écrit :

Effectivement, je comprends mieux, même si je maintiens qu'appeler directement OnKeyDown() c'est mal  :non:  




 
Et pourquoi c'est mal MÔÔSSIEUR "je sais mieux faire que Microsoft" ?


Message édité par El_gringo le 06-07-2002 à 17:00:35
n°153891
Harkonnen
Modérateur
Un modo pour les bannir tous
Posté le 07-06-2002 à 17:04:31  profilanswer
 

Si Microsoft fait comme ça, ils ont surement raison, après tout l'OS est d'eux, mais dans ce cas, qu'ils ne disent pas que les fonctions callback ne doivent jamais être appelées par l'utilisateur... (c) MSDN, mais pour retrouver l'article, ça va être chaud...


---------------
J'ai un string dans l'array (Paris Hilton)
n°153941
torpe23
Posté le 07-06-2002 à 18:14:56  profilanswer
 

l'appui sur la touche entrée appelle par défault la fonction  
OnOK() du dlg. Suffit de surcharger OnOK() ! non ?

n°153985
velleronna​is
Posté le 07-06-2002 à 21:22:58  profilanswer
 

Ouais, la solution du OnOK() c'etait ma premiere solution, mais ca ne me convenait pas ... OnOk(), c'est le nom de la methode quand on clique sur le bouton OK de la boite....  
si je veux par exemple que le contenu d'un edit soit valide par l'utilisateur via la touche du clavier ENTREE, mais que ca ne ferme pas en meme temps la fenetre en validant le bouton OK, ca m'obligeais du coup a faire deux bouton OK ... le premier avec le code sauvant l'edit mais invisible, et un second qui est celui vu par l'utilisateur et qui ferme la fenetre. (je sais pas si j'ai ete clair la ... mais bon ...)
 
Bref, ca me satisfaisait pas trop ....
 
Si d'autres sont plus inpires .. je suis preneur mais la methode sugeree par harkonnen me semble pas mal !

mood
Publicité
Posté le   profilanswer
 


Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation

  [VISUAL C++] [MFC] touche ENTREE

 

Sujets relatifs
Selectionner les entrée d'une date précise[c++] compatibilité entre borlan et visual c++
[C++] Visual C++ :??:Visual:comment mettre une variable x qui servira de compteur?
[C++]Trucs et astuces pour Visual C++ 6Appel fichier PDF depuis Visual Basic
Visual C++ Quitter une application.[MFC] Afficher un static (image bmp) sur le menu de la dialog
Visual C++ Comment afficher un page HTML Urgent svp !!!Au secours je suis bidon en visual
Plus de sujets relatifs à : [VISUAL C++] [MFC] touche ENTREE


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR