RTW
Messages postés36Date d'inscriptionmercredi 31 décembre 2003StatutMembreDernière intervention 1 février 2004
-
13 janv. 2004 à 18:53
RTW
Messages postés36Date d'inscriptionmercredi 31 décembre 2003StatutMembreDernière intervention 1 février 2004
-
13 janv. 2004 à 22:25
Je n'arrive pas bien à cerner l'utilisation de la valeur DWL_USER dans les fonctions SetWindowLong() et GetWindowLong().
Je m'explique, je voudrais envoyer une structure de cette manière :
// A un endroit quelconque du code
typedef struct MASTRUCTURE mastructure;
SendMessage( hwnd , WM_CREATE , 0 , (LPARAM)&mastructure );
// Dans la procédure de gestion des messages
case WM_CREATE:
MASTRUCTURE *mastructure;
mastructure = (MASTRUCTURE *)lParam;
SetWindowLong( hwnd , DWL_USER , (LONG)lParam);
case OK: // Le nom de la 'case' n'a aucune importance ici
MASTRUCTURE *mastructure;
mastructure = (MASTRUCTURE *)GetWindowLong( hwnd , DWL_USER );
ymca2003
Messages postés2070Date d'inscriptionmardi 22 avril 2003StatutMembreDernière intervention 3 juillet 20067 13 janv. 2004 à 19:08
pourquoi tu veux envoyer toi même un message WM_CREATE à une fenêtre ?
ce message est envoyer automatiquement lors de la création de la fenêtre avec des paramètres spécifiques pour wParm t lParam :
=> si tu envoie autre chose il y a risque de plantage.
SetWindowLong avec DWL_USER et GWL_USER permet d'associer une valeur sur 32 bits ou un pointeur à un handle de fenêtre pour que dans la procédure de traitement de la fenêtre tu puisse les récupérées à partir du handle.
ex : une structure MASTRUCT continent des infos et données relatives à une fenêtre.
tu crée la fenêtre puis tu fait un SetWindowLong pour associer ta structure à la fenêtre
lors du traitement des messages (où n'importe où dans le code) si tu souhaite obtnenir des données , tu fait un GetWindowLong.
cette technique est surtout utilisée s'il y a plusieur fenêtre qui sont traitées par la même WndProc afin de pouvoir récupérer ses données propres.
S'il n'y a q'une seule fenêtre gérée par la WndProc, il suffit que les données soit accessible de façon globale.
RTW
Messages postés36Date d'inscriptionmercredi 31 décembre 2003StatutMembreDernière intervention 1 février 2004 13 janv. 2004 à 20:59
Je n'y arrive pas... :sad)
J'ai beau essayer avec DWL_USER et GWL_USERDATA, c'est toujours sans succès.
Je déclare globalement la structure suivante :
typedef struct {
int i; // C'est juste pour le test !
} MASTRUCTURE , *LPMASTRUCTURE;
Je crée ma structure (globale) :
MASTRUCTURE mastructure;
Je crée ma fenêtre (dans une fonction) :
HWND hWnd = CreateWindowEx(...);
J'initialise la variable de ma structure :
mastructure.i = 9; // Par exemple
Je transmet la structure à la fenêtre :
SetWindowLong( hWnd , DWL_USER , (LONG)&mastructure );
Puis, dans la procédure de gestion des messages de ma fenêtre, je charge le pointeur de la structure transmise :
MASTRUCTURE *mastructure;
mastructure = (MASTRUCTURE *)GetWindowLong ( hwnd , DWL_USER );
RTW
Messages postés36Date d'inscriptionmercredi 31 décembre 2003StatutMembreDernière intervention 1 février 2004 13 janv. 2004 à 22:25
:big) Ça y'est !!! :big)
J'ai enfin réussi !
Tout d'abord, j'ai enlevé la structure globale : maintenant elle est locale.
Ensuite, c'était le déroulement du programme que j'avais mal évalué (mon "pas-à-pas était en fait dispatché sur plusieurs fonctions).
Et pour finir, il y avait bien des erreurs au niveau des pointeurs (dans les paramètres de mes fonctions).
C'est l'explication extrèmement simple de ymca2003 qui m'a mis la puce à l'oreille. Il faut bien connaître l'ordre d'appel des messages du système (entre autres).
Encore merci à ymca2003 (pour son aide ;) ), à Dev-C++ (et à son débogueur :) ) et à CPPFrance.Com (pour ce merveilleux site 8-) ).