cs_tintin72
Messages postés122Date d'inscriptionmercredi 16 avril 2003StatutMembreDernière intervention22 juillet 2006
-
24 mai 2005 à 11:10
bayeto
Messages postés224Date d'inscriptionmardi 12 août 2003StatutMembreDernière intervention18 octobre 2010
-
24 mai 2005 à 19:02
Bonjour à tous,
Je voudrais savoir comment programmer une fenêtre Windows de base en C++, cad encapsulé dans une classe (mais pas de MFC). J'ai vue sur un site anglais un exemple qui expliquait (en gros) que le problème majeur était l'encapsulation de la procédure de fenêtre qui a un type de retour qui n'est pas compatible. Mais bon c'est en anglais et ps mal de trucs m'échappent. Est ce que qq'un pourrait m'expliquer le principe, et est ce qu'il existe un site (en français si possible:-)) où il y a des explication et des exemples ?
ymca2003
Messages postés2070Date d'inscriptionmardi 22 avril 2003StatutMembreDernière intervention 3 juillet 20067 24 mai 2005 à 11:32
Plusieurs exemples dans mes sources (serial et paint je pense).
Le pb est qu'il faut mettre la WndProc en static et ariver à associer le HWND à un pointeur sur la classe d'encapsulation.
En gros voici les étapes :
- faire une classe qui va encapsuler les données de la fenêtre (dont le HWND) et traiter les messages.
- créer une mémthode statique WndProc et des methodes membres de gestion des messages (OnPaint, OnCreate...)
- les méthodes membres ne nécessiteront pas de paramètres HWND car déjà dans la classe.
- lors de la création de la fenêtre par CreateWindow, passer en dernier param un pointeur sur un objet de la classe d'encapsulation.
- lors du traitement des messages dans la méthode statique :
- si msg = WM_CREATE ou WM_NCCREATE, récupérer l'objet associé dans le CREATESTRUCT pointé par lParam
puis associer cet objet au HWND par SetWindowLong. Sauvegarder également le HWND dans l'objet.
- pour les autres messages, récupére l'objet associé au HWND par GetWindowLong.
- appeler la méthode membre de gestion du message
cs_tintin72
Messages postés122Date d'inscriptionmercredi 16 avril 2003StatutMembreDernière intervention22 juillet 2006 24 mai 2005 à 12:14
Merci pour ces explications. Je vais essayer de mettre en pratique tout ça ;-)
Toutefois, au vue de l'implémentation (pas évidente) je me pose 2 questions par rapport au code classique en C:
1) Y a t-il une différence au niveau performance ?
2) Est ce que celà vaut le coup de tout encapsuler, ou est ce juste nécessaire dans
certain cas ?
ymca2003
Messages postés2070Date d'inscriptionmardi 22 avril 2003StatutMembreDernière intervention 3 juillet 20067 24 mai 2005 à 12:18
Niveau perf : pas de différences
Avantage : permet de gérer + facilement un gros projet en mettant dans des classes de base des comportement similaires.
de plus en mettant virtuelles les méthodes de traitement des messages dans une classe WindowBase, une seule WndProc est nécessaire qui appelle les fct virtuelles qui en fonction de leur redéfinition dans des classes dérivées agit différement.