problème sur la récupération d'un controle edit.

problème sur la récupération d'un controle edit. - C++ - Programmation

Marsh Posté le 01-09-2008 à 15:02:17    

Salut!
Alors mon objectif est de faire une fenêtre a l'intérieur de laquelle il y a un controle edit, et un bouton ok. Alors on écrit dans la zone texte, et quand on clique sur OK, je voudrais que dans une messagebox s'affiche ce qu'on a tapé.
Bon, je n'utilise pas de ressource pour cette application Windows. Voici ma fonction WindowProcedure de réception des messages:
 

Code :
  1. LRESULT CALLBACK WindowProcedure (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
  2. {
  3.     HWND hwnd2; 
  4.     HWND hwnd3;   
  5.        
  6.          
  7.           char*bouh=new char[10000];
  8.          
  9.          
  10.          
  11.          
  12.            
  13.            
  14.  
  15.     switch (message)                  /* handle the messages */
  16.     {
  17.           case WM_CREATE:
  18.                
  19.           hwnd2=CreateWindowEx(WS_EX_OVERLAPPEDWINDOW,"EDIT","sui",WS_VISIBLE|WS_CHILD|ES_AUTOHSCROLL,10,10,175,24,hwnd,NULL,GetModuleHandle(NULL),NULL);
  20.          hwnd3=CreateWindowEx(WS_EX_OVERLAPPEDWINDOW,"BUTTON","OK",WS_VISIBLE|WS_CHILD,100,100,100,20,hwnd,NULL,GetModuleHandle(NULL),NULL);
  21.              
  22. /* bon, ici, je crée les deux controles edit et le bouton, lors de la création de la fenêtre */
  23.                break;
  24.           case WM_COMMAND:
  25.              
  26.                switch(wParam){
  27.                              
  28.                                
  29.                               case BN_CLICKED:
  30.                                    GetWindowText(hwnd2,bouh,10000);
  31.                                    MessageBox(NULL,bouh,"",10000);
  32. /* et ici, quand on clique sur OK, ca met dans "bouh" le texte de l'edit, et dans la messagebox on affiche bouh */
  33.                                  
  34.                                  
  35.                                  
  36.                                  
  37.                    
  38.                                    break;
  39.                                  
  40.                              
  41.                               }
  42.              
  43.                break;
  44.        
  45.                
  46.         case WM_DESTROY:
  47.             PostQuitMessage(0);
  48.                        
  49.             break;
  50.         default:                     
  51.             return DefWindowProc (hwnd, message, wParam, lParam);
  52.     }
  53. delete[] bouh;
  54.     return 0;
  55. }

 
Bon, bien sur ca ne marche pas. J'ai bien une fenêtre et un edit, mais quand je clique sur OK, ca me met une messagebox, avec rien dedans.
pourtant quand dans GetWindowText, je met hwnd au lieu de hwnd2, ca m'affiche bien le texte "windows app" de la fenetre principale.
 
J'ai fait pas mal de tests et j'ai l'impression qu'en fait quand dans la structure switch, si dans un case je fais une certaine instruction (par exemple modifier la valeur d'une variable) dans les autres case, si je fais une instruction qui dépend de cette modification, (par exemple je demande d'afficher la variable), ca va pas marcher, comme s'il avait oublié ce qui c'était passé dans le case précédent. Ca me parait pas normal.
Bon j'espere que j'ai été clair et dans les règles.
 
salut!

Reply

Marsh Posté le 01-09-2008 à 15:02:17   

Reply

Marsh Posté le 01-09-2008 à 16:58:38    

C'est presque bon. Il fraudrait juste revoir le cours d'informatique sur les "scopes" des variables, sur la différence entre les variables déclarées sur la pile et celles déclarées sur le tas. Le problème se situe là :

LRESULT CALLBACK WindowProcedure (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
{
    HWND hwnd2;  
    HWND hwnd3;  

Les handles sont déclarés en tant que variable provisoires sur la pile. Leur contenu sera susceptible d'être écrasé dès que le programme sortira de la fonction WindowProcedure. Quand le programme y rentrera à nouveau, les contenus de hwnd2 et hwnd3 seront donc différents et Windows sera perdu.
 
A la place, il faudrait avoir des variables globales ou statiques, par exemple :

HWND hwnd2;  
HWND hwnd3;    
LRESULT CALLBACK WindowProcedure (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
{

Reply

Marsh Posté le 01-09-2008 à 21:21:19    

Pfiou, ca marche nickel. Faudra effectivement que je vois ces histoire de piles. Merci beaucoup en tout cas

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed