Aller au contenu

[RESOLU] evenement sur edit


mogwai93

Messages recommandés

Dans ta WindowProc tu traites l'événement KEY_TYPED (ou truc du genre), et tu dois pouvoir récupérer la touche et le controle émetteur dans lparam ou wparam.

Ne le prends pas mal, mais je pense pas que ça court les rues des types qui connaissent les constantes pour win32 par coeur...

Je pense donc que tu devrais plutot aller voir du coté de la MSDN... y'aura les réponses à toutes tes questions.

Ou alors essayer les mfc :incline:

C'est Orienté Objet et ça rend leur bordel bcp plus clair et parlant.

Lien vers le commentaire
Partager sur d’autres sites

les variables c'est WM_KEYUP et WM_KEYDOWN

sauf que ca ne rentre pas dedans (du moins dans la boucle principale)

j'ai meme tracé ce qui se passait dans la methode

LRESULT CALLBACK WindowProcedure (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)

et je n'ai pas trouvé l'evenement correspondant

d'ailleurs ca ne rentre pas dans cette methode ....

les evenements que j'ai :

SET_FOCUS (qd je clique sur l'edit)

ON_CHANGE (qd j'ecris dans l'edit)

appuie sur TAB ==> ??? pas evenement dans la bouche principale ?

KILL_FOCUS (qd je ferme le programme)

pour la MSDN, j'y suis deja allé :incline:

je vais sans doute m'y replonger dedans,

si seulement ca existait en version hlp ou chm :incline:

Lien vers le commentaire
Partager sur d’autres sites

switch (message)    {
case WM_KEYDOWN:
       switch (wParam)
       {
       case VK_ESCAPE:
           PostQuitMessage(0);
           return 0;
       }
}

Tu fais bien un truc du genre ? :smack:

oui je fais bien ca

dans ce cas, ca fonctionne quand l'edit n'a pas le focus

(au debut de l'execution par exemple)

par contre, des que l'edit a le focus, ca ne rentre pas dans la boucle principale

d'où ma question.... :fumer:

Lien vers le commentaire
Partager sur d’autres sites

A mon avis t'as du faire une erreur quelque part, j'ai essayé ça marche très bien chez moi :transpi:

Je créé l'édit comme ça :

HWND txt_NbreVilles = CreateWindowEx(
              WS_EX_CLIENTEDGE, "EDIT", NULL,
              WS_VISIBLE | WS_CHILD | ES_AUTOHSCROLL,
              10, 10,
              140, 22,
              hwnd, (HMENU)ID_EDIT, hinst, NULL);

Et j'intercepte l'événement dans la boucle principale :

case WM_COMMAND:
   wmId = LOWORD(wparam);
   wmEvent = HIWORD(wparam);
   switch (wmId) {
       case ID_EDIT:
           if (wmEvent != EN_SETFOCUS) DestroyWindow(hwnd);
           break;
   }

Et ça marche très bien, après avoir mis le focus sur l'edit quand je tappe une touche le prog quitte.

Lien vers le commentaire
Partager sur d’autres sites

A mon avis t'as du faire une erreur quelque part, j'ai essayé ça marche très bien chez moi :ouioui:

Je créé l'édit comme ça :

HWND txt_NbreVilles = CreateWindowEx(
              WS_EX_CLIENTEDGE, "EDIT", NULL,
              WS_VISIBLE | WS_CHILD | ES_AUTOHSCROLL,
              10, 10,
              140, 22,
              hwnd, (HMENU)ID_EDIT, hinst, NULL);

Et j'intercepte l'événement dans la boucle principale :

case WM_COMMAND:
   wmId = LOWORD(wparam);
   wmEvent = HIWORD(wparam);
   switch (wmId) {
       case ID_EDIT:
           if (wmEvent != EN_SETFOCUS) DestroyWindow(hwnd);
           break;
   }

Et ça marche très bien, après avoir mis le focus sur l'edit quand je tappe une touche le prog quitte.

ton code fonctionne pour les touches "standard" (a à z et 0 à 9 et les signes de ponctuation)

par contre, ca ne fonctionne pas pour les touches F1 à F12, TAB, CTRL, ENTREE, SUPPR, INSR, ORIG, FIN, PG PREC, PG SUIV, ECHAP, ...

et c'est là mon souci :craint:

dans la msdn, j'ai trouve des infos sur WS_TABSTOP et WS_GROUP, ca semble se rapprocher de mon probleme (lien msdn),

mais je n'ai pas encore compris comment mettre ca en place....

Lien vers le commentaire
Partager sur d’autres sites

on m'a donné la solution sur un autre forum :

il faut utiliser le sous-classement

donc en prenant ton exemple :

HWND txt_NbreVilles = CreateWindowEx(
             WS_EX_CLIENTEDGE, "EDIT", NULL,
             WS_VISIBLE | WS_CHILD | ES_AUTOHSCROLL,
             10, 10,
             140, 22,
             hwnd, (HMENU)ID_EDIT, hinst, NULL);
OldEditProc= (WNDPROC) SetWindowLong(txt_NbreVilles, GWL_WNDPROC, (LPARAM)EditProc);

puis

// Variable déclarée en global: 
WNDPROC OldEditProc; 
// Procédure de sous-classement de l'Edit:
LRESULT CALLBACK EditProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
{
   switch (message) 
   {
   case WM_CHAR: 
           // Empêcher le beep après appui sur ENTREE:
           if (wParam == VK_RETURN) return 0;
           break;

   case WM_KEYDOWN:
       // Si la touche tapée est "ENTREE":
       if (wParam == VK_RETURN)
       {
           // Faire ce qu'on veut ici:
           // ..........
           return 0;
       }
       break;

   default:
       break;
   }
   // Appeler la procédure originale:
   return CallWindowProc(OldEditProc, hwnd, message, wParam, lParam);
} 

et là, ca fonctionne !

Lien vers le commentaire
Partager sur d’autres sites

Niquel je connaissais pas SetWindowLong() :iloveyou:

J'étais justement en train de me demander si on pouvait créer une WNDCLASSEX spéciale pour l'edit afin qu'il puisse avoir sa propre WNDPROC. En fait pas besoin :p

Sinon tu crois qu'on peut créer plusieurs classes pour divers controles via RegisterClassEx() ? :-D

j'ai la flemme d'essayer là :smack:

Lien vers le commentaire
Partager sur d’autres sites

Archivé

Ce sujet est désormais archivé et ne peut plus recevoir de nouvelles réponses.

×
×
  • Créer...