Edit_box et la touche Enter

by_rabbit_08 Messages postés 109 Date d'inscription vendredi 8 avril 2005 Statut Membre Dernière intervention 15 mai 2007 - 6 sept. 2006 à 11:25
by_rabbit_08 Messages postés 109 Date d'inscription vendredi 8 avril 2005 Statut Membre Dernière intervention 15 mai 2007 - 6 sept. 2006 à 19:19
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

cs_Joky Messages postés 1787 Date d'inscription lundi 22 novembre 2004 Statut Membre Dernière intervention 31 janvier 2009 2
6 sept. 2006 à 11:46
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"
0
cs_Joky Messages postés 1787 Date d'inscription lundi 22 novembre 2004 Statut Membre Dernière intervention 31 janvier 2009 2
6 sept. 2006 à 11:46
Désolé VK_ENTER c'est en faite VK_RETURN
ULARGE_INTEGERJokyQi=QI("Joky"
0
mogwai93 Messages postés 361 Date d'inscription mardi 31 décembre 2002 Statut Membre Dernière intervention 19 mars 2015
6 sept. 2006 à 11:50
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
  }
}
0
yoyo269 Messages postés 1403 Date d'inscription lundi 23 février 2004 Statut Membre Dernière intervention 11 janvier 2009 3
6 sept. 2006 à 13:27
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 !"
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
vecchio56 Messages postés 6535 Date d'inscription lundi 16 décembre 2002 Statut Membre Dernière intervention 22 août 2010 13
6 sept. 2006 à 13:35
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
0
by_rabbit_08 Messages postés 109 Date d'inscription vendredi 8 avril 2005 Statut Membre Dernière intervention 15 mai 2007 1
6 sept. 2006 à 18:25
Merci pour toute vos réponses, je vais méditer dessus :)
+
By_rabbit_08
0
by_rabbit_08 Messages postés 109 Date d'inscription vendredi 8 avril 2005 Statut Membre Dernière intervention 15 mai 2007 1
6 sept. 2006 à 18:51
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
0
racpp Messages postés 1910 Date d'inscription vendredi 18 juin 2004 Statut Modérateur Dernière intervention 14 novembre 2014 15
6 sept. 2006 à 18:59
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.
0
vecchio56 Messages postés 6535 Date d'inscription lundi 16 décembre 2002 Statut Membre Dernière intervention 22 août 2010 13
6 sept. 2006 à 18:59
-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
0
by_rabbit_08 Messages postés 109 Date d'inscription vendredi 8 avril 2005 Statut Membre Dernière intervention 15 mai 2007 1
6 sept. 2006 à 19:19
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
0
Rejoignez-nous