Edit_box et la touche Enter

Messages postés
109
Date d'inscription
vendredi 8 avril 2005
Statut
Membre
Dernière intervention
15 mai 2007
-
Messages postés
109
Date d'inscription
vendredi 8 avril 2005
Statut
Membre
Dernière intervention
15 mai 2007
-
Bonjour!
Je sais que cette question a été posée plusieurs fois, mais pas exactement comme je l'aimerais, et malgré tout ce que j'ai lu, je n'arrive pas à faire ce que je veux...
C'est un problème simple:
J'ai une edit box, et un bouton. J'aimerais que lorsque le curseur se trouve dans l'edit box, après avoir écris du texte, en pressant simplement la touche enter, on a par exemple une MessageBox avec le qui apparaisse, ou quoi que ce soit... Est-ce que quelqu'un pourrait m'aider?
Merci d'avance!
By_rabbit_08

10 réponses

Messages postés
1787
Date d'inscription
lundi 22 novembre 2004
Statut
Membre
Dernière intervention
31 janvier 2009
2
WNDPROC wOldProc;

LRESULT CALLBACK EditProc(HWND hWnd, ...)
{
    char szTxt[255];

    switch(Msg)
    {
       case WM_CHAR:
          if(lParam == VK_ENTER)
          {
                GetWindowText(hWnd, szTxt, 255);
                MessageBox(hWnd, szTxt, "szAppName", 0x40);
          }
       return 0;
     }
    return DefWindowProc(hWnd, ...);
}
               
         
         
LRESULT CALLBACK WndProc(HWND hWnd, UINT Msg, ..., ...)
{
    switch(Msg)
    {
       case WM_CREATE:   //WM_INITDIALOG:
              wOldProc = (WNDPROC)SetWindowLong(GetDlgItem(hWnd, ID_EDIT), GWL_WNDPROC, (LONG)EditProc);
             return 0;
    }
    return DefWindowProc(...);
}

ULARGE_INTEGERJokyQi=QI("Joky"
Messages postés
1787
Date d'inscription
lundi 22 novembre 2004
Statut
Membre
Dernière intervention
31 janvier 2009
2
Désolé VK_ENTER c'est en faite VK_RETURN
ULARGE_INTEGERJokyQi=QI("Joky"
Messages postés
361
Date d'inscription
mardi 31 décembre 2002
Statut
Membre
Dernière intervention
19 mars 2015

pour recuperer un evenement special dans un edit box (comme l'appui de la touche entree)
il te faut utiliser SetWindowLong

exemple rapide :
// tu crees ton edit
OldEditProc= (WNDPROC) SetWindowLong(hWndMonEdit, GWL_WNDPROC, (LPARAM)EditProc);

LRESULT CALLBACK EditProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
{
 switch (message)
 {
 // tu codes ici l'evenement dont tu as besoin avec le resultat que tu veux
  }
}
Messages postés
1403
Date d'inscription
lundi 23 février 2004
Statut
Membre
Dernière intervention
11 janvier 2009
3
Juste pour info by_rabbit_08, cette technique s'appelle du sous classement.
Elle est même généralisable aux autres contrôles, pour récupérer des messages.

YOYO, @+.
"L'intelligence c'est comme un parachute, quand on en n'a pas...on s'écrase !"
Messages postés
6535
Date d'inscription
lundi 16 décembre 2002
Statut
Membre
Dernière intervention
22 août 2010
10
Avec GWL_WNDPROC, plutot utiliser SetWindowLongPtr pour ne pas avoir de mauvaises surprises quand on compile en 64 bits

_____________________________________
Un éditeur de ressources gratuit pour Windows
Messages postés
109
Date d'inscription
vendredi 8 avril 2005
Statut
Membre
Dernière intervention
15 mai 2007
1
Merci pour toute vos réponses, je vais méditer dessus :)
+
By_rabbit_08
Messages postés
109
Date d'inscription
vendredi 8 avril 2005
Statut
Membre
Dernière intervention
15 mai 2007
1
J'ai donc essayé de réaliser ceci, dans un code de base. J'ai simplement pris l'exemple de base d'un fenêtre sans rien, je lui ai rajouté un edit avec CreateWindowEx et j'ai également ajouté un bouton. J'ai ensuite essayé d'adapter mon code sous différentes façons, et j'ai obtenu ceci avec la méthode de Joky, où il y avait un exemple un peu plus concret:

#include <windows.h>


#define EDIT 101
#define BOUTON 102


/*  Declare Windows procedure  */
LRESULT CALLBACK WindowProcedure (HWND, UINT, WPARAM, LPARAM);


/*  Make the class name into a global variable  */
char szClassName[ ] = "WindowsApp";


HWND edit, bouton;


int WINAPI WinMain (HINSTANCE hThisInstance,
                    HINSTANCE hPrevInstance,
                    LPSTR lpszArgument,
                    int nFunsterStil)


{
    HWND hwnd;              
    MSG messages;         
    WNDCLASSEX wincl;      


    wincl.hInstance = hThisInstance;
    wincl.lpszClassName = szClassName;
    wincl.lpfnWndProc = WindowProcedure;   
    wincl.style = CS_DBLCLKS;            
    wincl.cbSize = sizeof (WNDCLASSEX);
    wincl.hIcon = LoadIcon (NULL, IDI_APPLICATION);
    wincl.hIconSm = LoadIcon (NULL, IDI_APPLICATION);
    wincl.hCursor = LoadCursor (NULL, IDC_ARROW);
    wincl.lpszMenuName = NULL;               
    wincl.cbClsExtra = 0;                   
    wincl.cbWndExtra = 0;                   
    wincl.hbrBackground = (HBRUSH) COLOR_BACKGROUND;


  
    if (!RegisterClassEx (&wincl))
        return 0;


   
    hwnd = CreateWindowEx (
           0,             
           szClassName,     
           "Windows App",
           WS_OVERLAPPEDWINDOW,
           CW_USEDEFAULT,    
           CW_USEDEFAULT,    
           544,            
           375,            
           HWND_DESKTOP,    
           NULL,             
           hThisInstance, 
           NULL              
           );
          
    edit = CreateWindowEx (
           WS_EX_OVERLAPPEDWINDOW,
           "EDIT",        
           "",   
           WS_VISIBLE|WS_CHILD|ES_AUTOHSCROLL|ES_NOHIDESEL,
           10, 
           10,   
           100,            
           20,               
           hwnd,       
           (HMENU)EDIT,               
           hThisInstance,      
           NULL                
           );
          
   
    bouton = CreateWindowEx (
           0,
           "BUTTON",        
           "Valider",      
           WS_VISIBLE|WS_CHILD,
           10,     
           35,  
           100,        
           20,       
           hwnd,       
           (HMENU)BOUTON,       
           hThisInstance,    
           NULL          
           );
   
   
 
    ShowWindow (hwnd, nFunsterStil);
    UpdateWindow(hwnd);
 
    while (GetMessage (&messages, NULL, 0, 0))
    {
        TranslateMessage(&messages);
        DispatchMessage(&messages);
    }


    return messages.wParam;
}


WNDPROC wOldProc;


LRESULT CALLBACK EditProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
{
    char szTxt[255];


    switch(message)
    {
       case WM_CHAR:
          if(lParam == VK_RETURN)
          {
                GetWindowText(edit, szTxt, 255);
                MessageBox(hwnd, szTxt, "szAppName", 0x40);
          }
       return 0;
     }
    return DefWindowProc(hwnd, message, wParam, lParam);
}


LRESULT CALLBACK WndProc(HWND hwnd, UINT Msg, WPARAM wParam, LPARAM lParam)
{
    switch(Msg)
    {
       case WM_CREATE:   //WM_INITDIALOG:
              wOldProc = (WNDPROC)SetWindowLong(GetDlgItem(hwnd, EDIT), GWL_WNDPROC, (LONG)EditProc);
             return 0;
    }
    return DefWindowProc(hwnd, Msg, wParam, lParam);
}




LRESULT CALLBACK WindowProcedure (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
{
    switch (message)                
    {
        case WM_DESTROY:
            PostQuitMessage (0);     
            break;
        default:                   
            return DefWindowProc (hwnd, message, wParam, lParam);
    }


    return 0;
}

Malheureusement cela ne marche pas mieu... Est-ce que vous auriez des informations complémentaire? Quelque chose que je devrais modifier dans mon code?
Merci d'avance!
By_rabbit_08
Messages postés
1910
Date d'inscription
vendredi 18 juin 2004
Statut
Modérateur
Dernière intervention
14 novembre 2014
13
Salut,
Il existe aussi une autre technique plus simple. Tu définis un bouton par défaut. Ce dernier réagit à la pression de la touche ENTREE même qaund le focus se trouve dans un Edit. Le bouton peut être soit visible, soit caché. Regarde cette page qui traite des deux cas, boite de dialogue ou fenêtre: Bouton BS_DEFPUSHBUTTON.
Messages postés
6535
Date d'inscription
lundi 16 décembre 2002
Statut
Membre
Dernière intervention
22 août 2010
10
-GetDlgItem(hwnd, EDIT) ne fonctionne pas car l'edit n'est pas encore créé à ce moment
-A quoi sert WndProc? Tout mettre dans WindowProcedure
Dans EditProc: ne pas utiliser DefWindowProc mais CallWindowProc(wOldProc, ...

_____________________________________
Un éditeur de ressources gratuit pour Windows
Messages postés
109
Date d'inscription
vendredi 8 avril 2005
Statut
Membre
Dernière intervention
15 mai 2007
1
Ok ben merci racpp! J'ai utilisé ta méthode et ça marche! Donc pour l'instant je vais faire avec cela! Mais est-ce quelqu'un pourrait me modifier un peu mon code pour utiliser une méthode plus "habituelle" (à ce que j'ai entendu :O) comme celles du début de la discussion... Cela pourrait en apprendre à beaucoup de monde certainement!
Merci encore
By_rabbit_08