Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
2397 connectés 

  FORUM HardWare.fr
  Programmation
  C++

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

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

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

n°428508
camarchepo​a
m'enfin !
Posté le 15-06-2003 à 22:21:24  profilanswer
 

: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
mood
Publicité
Posté le 15-06-2003 à 22:21:24  profilanswer
 

n°428571
camarchepo​a
m'enfin !
Posté le 15-06-2003 à 23:00:01  profilanswer
 

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 ;)

n°428643
HelloWorld
Salut tout le monde!
Posté le 16-06-2003 à 00:26:01  profilanswer
 

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
n°428648
HelloWorld
Salut tout le monde!
Posté le 16-06-2003 à 00:30:44  profilanswer
 

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
n°428651
Konar
Posté le 16-06-2003 à 00:33:21  profilanswer
 

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

n°428653
HelloWorld
Salut tout le monde!
Posté le 16-06-2003 à 00:36:28  profilanswer
 

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
n°428657
camarchepo​a
m'enfin !
Posté le 16-06-2003 à 00:54:31  profilanswer
 

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

n°431354
camarchepo​a
m'enfin !
Posté le 17-06-2003 à 23:25:39  profilanswer
 

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 !


Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  C++

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

 

Sujets relatifs
fonction qui détecte le navigateurChargement de fonction d'une librairie DLL
Cree un fonction cadie pour un site de vente[PHP] ça sert à quoi le @ devant une fonction ?
[HTML & script] Garder une fenetre en premier planLenteur de la fonction CopyFile() !!!
[VC++6] Afficher un message dans une fenêtre de débogageruntime.exec() d'une fonction dans un autre répertoire ... [Résolu]
[vbscript]-besoin d'aide sur une fonctionouvrir un pop up par un formulaire -> redimmensionner une fenetre
Plus de sujets relatifs à : [C/C++] comment avoir une fonction callback par fenetre ?


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR