[C/C++] comment avoir une fonction callback par fenetre ?

comment avoir une fonction callback par fenetre ? [C/C++] - C++ - Programmation

Marsh Posté le 15-06-2003 à 22:21:24    

:hello: à tous !
 
g un petit probleme :
je fais une appli ou il y a deux fenetres
- une pour faire un dessin
- une qui sert de barre d'outils (style photoshop ...)
 
le probleme c que qd je fais un dessin dans la fenetre principale, ca le fait aussi dans la fenetre d'outils.
Ca viens du fait que c'est la même fonction CALLBACK qui est appellée pour les deux fenetres ...
 
alors la question :
Comment associer une fonction callback à la premier fenêtre et une autre fonction callback à la fenêtre outils ?
(ou sinon comment faire un if(fenetre principale){ .....}
 
voilà commen g construit les 2 fenetres :

Code :
  1. hWndMain = CreateWindow(
  2.      lpszAppName,     // class de fenetre
  3.      lpszTitle,      // nom de la fenetre
  4.      WS_OVERLAPPEDWINDOW | CS_OWNDC, // style de la fenetre
  5.      0,        // position horizontale haut gauche
  6.      0,        // position verticale haut gauche
  7.      800 ,       // largeur par defaut
  8.      600,       // hauteur par defaut
  9.      NULL,       // cle fenetre parente
  10.      NULL,       // cle du menu
  11.      hInstance,      // instance du prgm qui cree le controle
  12.      NULL       // pointeur donnees de la fonction
  13.      );


 

Code :
  1. hWndOutils = CreateWindow (lpszAppNameOutils,  // class de fenetre
  2.      lpszTitleOutils,    // nom de la fenetre
  3.      WS_EX_TOOLWINDOW,    // style de la fenetre
  4.      0,        // position horizontale coin superieur gauche
  5.      60,        // position verticale coin superieur gauche
  6.      100 ,       // largeur par defaut
  7.      400,       // hauteur par defaut
  8.      NULL,       // cle fenetre parente
  9.      NULL,       // cle du menu
  10.      instBoite,      // instance du prgm qui cree le controle
  11.      NULL       // pointeur vers les donnees de la fonction
  12.      );


 
PS : je commence en prog win alors s'pa facile ;)


Message édité par camarchepoa le 15-06-2003 à 22:22:21
Reply

Marsh Posté le 15-06-2003 à 22:21:24   

Reply

Marsh Posté le 15-06-2003 à 23:00:01    

En fait je viens de trouver un truc :
 
je déclare les HWND des fenêtres en global et je fait un test desus pour savoir de quelle fenêrte il s'agit et selon ca je fais les actions que je veut
 

Code :
  1. LRESULT CALLBACK WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam){
  2. if(hWnd==hWndMain){
  3.        // le traitement de la fenetre MAIN
  4. }else{
  5.        // le traitement de la fenetre OUTILS
  6. }


 
c comme ca qu'il faut faire ?
 
il faut que ce soit propre pq c pour un projet ;)

Reply

Marsh Posté le 16-06-2003 à 00:26:01    

Les callback sont associés à 1 classe de fenêtre. Toutes les fenêtres de cette classe seront gérées par un même callback. Dans ton cas, il suffit simplement de créer 2 classes :
- 2 callback différents
- 2 classes = 2 RegisterClass différents
- 2 CreateWindow avec chacun un nom de classe de fenêtre différent
 
Tu auras 1 classe pour ta fenêtre de dessin, et une autre pour ta toolbar.


---------------
FAQ fclc++ - FAQ C++ - C++ FAQ Lite
Reply

Marsh Posté le 16-06-2003 à 00:30:44    

Autre remarque : faut se méfier des HWND globaux. En effet, ta callback est appelée plusieurs fois durant le CreateWindow, notament pour WM_CREATE, quelques autres, et le premier WM_PAINT (pas sûr cependant). Durant ces appels, CreateWindow n'a pas rendu la main, et donc pas renvoyé de HWND. Donc l'affectation aux HWND globaux n'a pas eu lieu. En + clair :

Code :
  1. HWND hWndMain = NULL;
  2. LRESULT CALLBACK WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam){
  3. if(hWnd==hWndMain){
  4.       // le traitement de la fenetre MAIN  
  5. }else{
  6.       // le traitement de la fenetre OUTILS  
  7. }
  8. hWndMain = CreateWindow( ... );


Alors que hWndMain n'est pas encore initialisé suite à l'appel de CreateWindow, ta callback WndProc est appelée ... et le test hWnd==hWndMain échoue, alors qu'il s'agit bien de (la futur) hWndMain ...


---------------
FAQ fclc++ - FAQ C++ - C++ FAQ Lite
Reply

Marsh Posté le 16-06-2003 à 00:33:21    

CaMarchePoa a écrit :


alors la question :
Comment associer une fonction callback à la premier fenêtre et une autre fonction callback à la fenêtre outils ?


 
on peut aussi utiliser la fct SetWindowLong(), de cette maniere :
 

Code :
  1. SetwindowLong(hWnd, GWL_WNDPROC, LaProcDeLaFenetre);


 
http://msdn.microsoft.com/library/ [...] owlong.asp

Reply

Marsh Posté le 16-06-2003 à 00:36:28    

Ca s'appelle le subclassing, ca revient à créer une deuxieme classe de fenêtre autrement. Dans son cas c'est pas top, vu que les 2 fenêtres n'ont rien à voir. La méthode propre ici, AMHA, c'est de créer 2 classes distinctes dès le départ.


---------------
FAQ fclc++ - FAQ C++ - C++ FAQ Lite
Reply

Marsh Posté le 16-06-2003 à 00:54:31    

waouh !
 
c super tout ca
 
mais là  :sleep:  
 
alors je regarde tout ca demain soir !!
 
 
merci bcp  :love:

Reply

Marsh Posté le 17-06-2003 à 23:25:39    

HelloWorld a écrit :

Les callback sont associés à 1 classe de fenêtre. Toutes les fenêtres de cette classe seront gérées par un même callback. Dans ton cas, il suffit simplement de créer 2 classes :
- 2 callback différents
- 2 classes = 2 RegisterClass différents
- 2 CreateWindow avec chacun un nom de classe de fenêtre différent
 
Tu auras 1 classe pour ta fenêtre de dessin, et une autre pour ta toolbar.


 
en fait c ca la bonne solution :)
c expliqué dans le fameux bouquin de Petzold :
Section III advanced topic
A sample MDI Implementation  
 
dans cet example chaque fenetre a son CALLBACK (on peut avoir plusieurs fenetre filles )
 
merci !

Reply

Sujets relatifs:

Leave a Replay

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