Ouverture de fenetre sous windows

Ouverture de fenetre sous windows - C++ - Programmation

Marsh Posté le 06-11-2006 à 19:50:41    

Bonjour !
 
Je developpe une petite appli sous windows, sans utiliser les MFC.
 
Je souhaite ouvrir une fenetre du type pop-up pour y mettre des outils de l'application (genre comme les palettes flottantes de photoshop)
 
Pour ce faire, je declaire une window class :
 

Code :
  1. maWindowClass.style = 0;
  2. maWindowClass.lpfnWndProc = maFonction;
  3. maWindowClass.cbClsExtra = 0;
  4. maWindowClass.cbWndExtra = 0;
  5. maWindowClass.hInstance = parentHINSTANCE;
  6. maWindowClass.hIcon = NULL;
  7. maWindowClass.hCursor = NULL;
  8. maWindowClass.hbrBackground = (HBRUSH)(1 + COLOR_BTNFACE);
  9. maWindowClass.lpszMenuName = NULL;
  10. maWindowClass.lpszClassName = "Ma fenetre";


 
Puis j'ouvre ma fenetre avec createWindow()
 
Ma fenetre est ouverte par une fonction contenue dans une classe, qui contient dans ses données les infos sur la fenetre, du style :
 

Code :
  1. maClasse
  2. {
  3. pleinsDeFonctionsEtDeVariables
  4. WNDCLASS maWindowClass;
  5. HWND maWindowHWND;
  6. }


 
Je souhaiterais maintenant que la fonction "maFonction" fasse partie de la classe, et c'est là que ca coince !
 
Si je declare un truc du genre :
 

Code :
  1. maClasse
  2. {
  3. pleinsDeFonctionsEtDeVariables
  4. WNDCLASS maWindowClass;
  5. HWND maWindowHWND;
  6. LRESULT CALLBACK maFonction(HWND, UINT, WPARAM, LPARAM);
  7. }


 
J'obtiens ces 2 erreurs :
 

Code :
  1. error C3867: &'maClasse::maFonction' : liste d'arguments manquante dans l'appel de fonction ; utilisez 'maClasse::maFonction' pour créer un pointeur vers membre
  2. error C2440: '=' : impossible de convertir de 'LRESULT (__stdcall maClasse::* )(HWND,UINT,WPARAM,LPARAM)' en 'WNDPROC'


 
 
Pourquoi ? Comment ? Je ne vois pas le rapport !
 
J'ai essayé avec differentes notations, pointeurs.... imposssible de donner l'adresse d'une fonction membre de la classe à ce parametre : maWindowClass.lpfnWndProc
 
Y'a-t-il une raison precise ? Ou je m'y prend mal ?
 
PS : je peux m'en passer, mais j'aimerais regrouper toutes les fonctions utiles à un objet dans sa classe, histoire que ce soit plus propre...

Reply

Marsh Posté le 06-11-2006 à 19:50:41   

Reply

Marsh Posté le 06-11-2006 à 22:45:03    

Salut,
 
Pour utiliser les callbacks dans des classes, le plus simple est de les déclarer en statiques. J'ai croisé une autre méthode, mais j'arrive pas à remettre la main dessus (et ne l'ayant pas appliqué, je m'en rappelle pas du tout :D ).
 
Tu auras plus de détails sur ce problème dans un article de CodeProject.


---------------
.
Reply

Marsh Posté le 07-11-2006 à 08:13:51    

Pourquoi tu n'utilise pas wxWidgets pour les interfaces?

Reply

Marsh Posté le 07-11-2006 à 09:43:40    

Je n'utilise pas wxWidgets car c'est dans le cadre du developpement d'un plugin (dll) pour un logiciel et l'une des contraintes est d'utiliser que les fonction win32.
 
Une fois les fenetres correctement crées et initialisées, le logiciel hôte du plugin fourni tout le necessaire pour construire une interface, gerer les evenements....
 
Mon seul probleme est de "structurer" convenablement les classes de bases car le plugin pourra ouvrir jusqu'a une dizaine de fenetres similaires (comparaisons de resultats), il me faut donc un modele simple et clair :
 
Une classe cMaSuperFenetre qui contienne :
* les données à visualiser
* des données propres à la fenetre : position, taille, choix des couleurs du graphique...
 
Et qu'ensuite je puisse en instancier autant que necessaire (dans la fenetre principale du plugin, il y a un bouton "Ajouter une vue" )
 
Voila !
 
Merci pour le lien vers l'article, ca va m'aider serieusement à faire un truc propre !

Reply

Marsh Posté le 07-11-2006 à 11:37:42    

Je viens de retrouver le lien expliquant les callbacks non-statiques, mais je  ne suis pas convaincu que ce soit si pratique (un callback est toujours utiliser en tant que wrapper), ni même utilisable dans le cas des callbacks win32.
 
Ceci dit, voilà le lien, t'auras plus le temps de le lire que moi :)

Reply

Marsh Posté le 07-11-2006 à 11:45:11    

buzzkaido a écrit :

Je n'utilise pas wxWidgets car c'est dans le cadre du developpement d'un plugin (dll) pour un logiciel et l'une des contraintes est d'utiliser que les fonction win32.


dans ce cas, tu fais ton appli en C, pas en C++. Win32 a été conçu pour être utilisé en C.


---------------
J'ai un string dans l'array (Paris Hilton)
Reply

Marsh Posté le 07-11-2006 à 14:16:12    

IrmatDen : merci ! instructif....
 
Harkonnen : bah oui, mais le sdk que l'on m'a fourni est en c++ ! Et puis les classes c'est quand meme vachement pratique pour instancier plusieurs objets avec les memes propriétés/comportements...
 
Surtout quand on ne sait pas à l'avance le nombre de ces objets qui vont etre instanciés par l'utilisateur.
 
C'est sur, je pourrait le faire en C, mais le C++ permet beaucoup plus de choses, enfin surtout beaucoup plus de logique (à mon gout)
 
Si c'est au prix de petites complications sur 1 seul element (les callbacks non-statiques) je suis pret à payer !
 
Et vive les Atreïdes :-)

Reply

Sujets relatifs:

Leave a Replay

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