GWL_USERDATA :)

[Résolu]
Signaler
Messages postés
1787
Date d'inscription
lundi 22 novembre 2004
Statut
Membre
Dernière intervention
31 janvier 2009
-
Messages postés
2070
Date d'inscription
mardi 22 avril 2003
Statut
Membre
Dernière intervention
3 juillet 2006
-
Bonsoir la Françe !

Voilà j'viens de rentrer du boulot ( Oui j'vous raconte ma vie et alors ! :) )

et donc je viens vous quêter une réponse :p



Voilà j'essai de stocker une chaîne de caractère dans GWL_USERDATA

avec SetWindowLong, pour associer à mon HANDLE une chaîne :)



J'ai réussi parfaitement avec un entier :)

Et avec la chaîne, ça merdouille :) J'arrive à récupere la chaîne localement

c'est à dire dans la fonction ou je lui alloue sa valeur

Mais dans une autre fonction, marche po :(



J'viens d'essayer avec une variable static car c'est sans doute lié au
fait que ça change d'adresse mais voilà je sais pas trop :)

Help me ! :p



Merci tous et bonne nuit :)

if(!Meilleur("Joky")) return ERREUR;<

13 réponses

Messages postés
2070
Date d'inscription
mardi 22 avril 2003
Statut
Membre
Dernière intervention
3 juillet 2006
8
non ça changera rien, vu que la WndProc est appelée dans le même contexte avant de retourner du CreateProc.
le mieux c'est de passer don pointeur en dernier param de createwindow.
puis dans le Wndproc, sur le WM_CREATE tu affecte ton setWindowLong (le lParam sera alors un CREATESTRUCT avec membre lParam égal à ton pointeur.
pour les autres message tu fait un GetWindowlong

De même lors du traitement de WM_CREATE la var MyLink->hLink ne sera pas encore affectée.
Messages postés
6535
Date d'inscription
lundi 16 décembre 2002
Statut
Modérateur
Dernière intervention
22 août 2010
8
J'ai deja eu le même genre de pb, et je faisais mon SetWindowLong dans WM_NCCREATE, en passant le pointeur en dernier param de CreateWindow.
Tu peux aussi ruser: si tu as besoin de MyLink->szLink dans le WM_PAINT, tu n'a qu'a créer la fenêtre comme invisible, faire le SetWindowLong, puis afficher la fenêtre:
MyLink->hLink = CreateWindow("drLink", MyLink->szLink, WS_CHILD,
50,30,50, 20,
hParent, NULL, MyLink->hInst, NULL);
SetWindowLong(MyLink->hLink, GWL_USERDATA, (LONG)MyLink->szLink);
ShowWindow(MyLink->hLink, SW_SHOW);

Car en fait, je crois que le problème est peut être qu'on recoit un WM_PAINT avant que CreateWindow ne retourne
Messages postés
6535
Date d'inscription
lundi 16 décembre 2002
Statut
Modérateur
Dernière intervention
22 août 2010
8
Faudrait peut-être utiliser SetWindowLong et pas SetClassLong ;)
Messages postés
2070
Date d'inscription
mardi 22 avril 2003
Statut
Membre
Dernière intervention
3 juillet 2006
8
Il faut passer un pointeur alloué dynamiquement ou une var globale (au sens valide tout au long du prog).
Si tu passe une chaîne locale => pas bon.
Messages postés
1787
Date d'inscription
lundi 22 novembre 2004
Statut
Membre
Dernière intervention
31 janvier 2009
2
Bé en faite je passe un Pointeur de structure qui contient la chaîne voulue :(



BOOL CreateMyLink(LP_drLink MyLink, HWND hParent)

{

MyLink->hLink = CreateWindow("drLink", MyLink->szLink, WS_VISIBLE | WS_CHILD,



50,30,50, 20,



hParent, NULL,
MyLink->hInst, NULL);



SetWindowLong(MyLink->hLink, GWL_USERDATA, (LONG)MyLink->szLink);



if(!MyLink->hLink)

return FALSE;

else

return TRUE;

}


Et dans la procédure de message, je voudrais accéder à cette variable :(

:)

Vala merci que mm :p
if(!Meilleur("Joky")) return ERREUR;<
Messages postés
2070
Date d'inscription
mardi 22 avril 2003
Statut
Membre
Dernière intervention
3 juillet 2006
8
Normalement devrait marcher
Toutefois il est à noter que lors du traitement de WM_CREATE le GWL_USERDATA n'est pas encore affecté car la WndProc est appelée pour plusieurs messages avant que CreateWindow ne retourne (et donc que tu fait SetWindowLong).
Messages postés
1787
Date d'inscription
lundi 22 novembre 2004
Statut
Membre
Dernière intervention
31 janvier 2009
2
Donc faudrait que je fasse un ptit Sleep juste avant non ?

J'vais essayer ça et j'te dis quoi :p Merci

if(!Meilleur("Joky")) return ERREUR;<
Messages postés
1787
Date d'inscription
lundi 22 novembre 2004
Statut
Membre
Dernière intervention
31 janvier 2009
2
Re les gens :)

Donc après multiple essai :)

J'arrive toujours pas lol :)



En gros voilà ce que ça donne :p



MyLink->hLink = CreateWindow("drLink", MyLink->szLink, WS_CHILD,



50,30,50, 20,



hParent, NULL,
MyLink->hInst,(LPVOID)MyLink);



Dans ma fonction CreateMyLink();



Et dans ma gestion de message

case WM_CREATE:

SetClassLong(hWnd, GCL_HBRBACKGROUND, GetClassLong(GetParent(hWnd), GCL_HBRBACKGROUND));

Link = (LP_drLink)((LPCREATESTRUCT) lParam)->lpCreateParams;

SetClassLong(hWnd, GWL_USERDATA, (LONG)Link->szLink);

MessageBox(0, Link->szLink, 0, 0);

return 0;



Donc la première message Box marche à merveille ce qui prouve que Link est bien initialisé

Mais si je met GetWindowLong(hWnd, GWL_USERDATA) bé marche pu :(

Me demande bien pourquoi lol :)

Merci quand même pour ce que vous m'avez appris lol :p


if(!Meilleur("Joky")) return ERREUR;<
Messages postés
1787
Date d'inscription
lundi 22 novembre 2004
Statut
Membre
Dernière intervention
31 janvier 2009
2
Pfiuuu hé bé lol

J'ai réussi :)

Enfin vous avez réussi :)

Donc la solution était un patchwork de tout ce que vous aviez dit plus haut ! :)



J'ai passé un pointeur avec CreateWindow

Je l'ai récupéré dans WM_CREATE avec LPCREATESTRUCT

J'ai utilisé SetWindowLong

Je récupere l'objet à chaque WM_GETVALUE

Mais le problème, venait du paint, en effet, il envoie un WM_PAINT pendant la création

Donc il ne savait pas quoi afficher !

Donc j'ai fait ce qu'avait dit Vecchio ShowWindow à la fin du chargement de ma fenêtre :)



MErci bien tout le monde (k)(k)(k)(k)

if(!Meilleur("Joky")) return ERREUR;<
Messages postés
6535
Date d'inscription
lundi 16 décembre 2002
Statut
Modérateur
Dernière intervention
22 août 2010
8
Du coup, pas besoin de passer par le LPCREATESTRUCT. De plus à quoi sert ton WM_GETVALUE? Si tu as besoin de la valeur uniquement dans WM_PAINT, c'est ici qu'ilf aut récupérer la valeur, car pour les WM_PAINT suivants, tu ne saura pas quand ils arriveront
Messages postés
2070
Date d'inscription
mardi 22 avril 2003
Statut
Membre
Dernière intervention
3 juillet 2006
8
Tu recevait un WM_PAINT pendant la création à cause du WS_VISIBLE de CreateWindow.
Messages postés
6535
Date d'inscription
lundi 16 décembre 2002
Statut
Modérateur
Dernière intervention
22 août 2010
8
Non justement, à la création j'enlève le WS_VISIBLE, puis je fais un ShowWindow après le SetWindowLong. Ca me semble plus simple
Messages postés
2070
Date d'inscription
mardi 22 avril 2003
Statut
Membre
Dernière intervention
3 juillet 2006
8
En fait je parlais du code initial de Joky