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

 


Dernière réponse
Sujet : [VISUAL C++] [MFC] touche ENTREE
velleronnais 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 !

Votre réponse
Nom d'utilisateur    Pour poster, vous devez être inscrit sur ce forum .... si ce n'est pas le cas, cliquez ici !
Le ton de votre message                        
                       
Votre réponse


[b][i][u][strike][spoiler][fixed][cpp][url][email][img][*]   
 
   [quote]
 

Options

 
Vous avez perdu votre mot de passe ?


Vue Rapide de la discussion
velleronnais 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 !
torpe23 l'appui sur la touche entrée appelle par défault la fonction  
OnOK() du dlg. Suffit de surcharger OnOK() ! non ?
Harkonnen 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...
El_gringo

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" ?

Harkonnen Effectivement, je comprends mieux, même si je maintiens qu'appeler directement OnKeyDown() c'est mal  :non:
velleronnais 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.
El_gringo

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 !

Harkonnen Si c'est crosoft qui le dit alors... j'en prends bonne note aussi  :)  
 
A+  :hello:
velleronnais 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 ...
Harkonnen

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()

Harkonnen Mission accomplie :d
 
 :hello:
velleronnais 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 !
velleronnais OK, THANKS !!!! j'y retourne .....
Harkonnen 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 !!

Harkonnen

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...

velleronnais 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 ...
smaragdus

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:

El_gringo

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...

velleronnais 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
Harkonnen

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

Harkonnen

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().

velleronnais par contre pour ce qui est de la macro, je maitrise pas ce que tu me dit .... que doit je faire ?
velleronnais 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.
El_gringo

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 ?

velleronnais 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 ?
Harkonnen Essaie avec OnKeyUp().
 
Sinon poste ton code pour voir ce qui cloche
velleronnais 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.

Copyright © 1997-2025 Groupe LDLC (Signaler un contenu illicite / Données personnelles)