|
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 ! |
Aperçu |
---|
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 | 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 |
|
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 |
|
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
|
Harkonnen |
|
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 |
|
El_gringo |
|
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 |
|
Harkonnen |
|
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 | 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. |