GWL_USERDATA :)

Résolu
cs_Joky Messages postés 1787 Date d'inscription lundi 22 novembre 2004 Statut Membre Dernière intervention 31 janvier 2009 - 8 déc. 2005 à 02:52
ymca2003 Messages postés 2070 Date d'inscription mardi 22 avril 2003 Statut Membre Dernière intervention 3 juillet 2006 - 14 déc. 2005 à 16:14
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

ymca2003 Messages postés 2070 Date d'inscription mardi 22 avril 2003 Statut Membre Dernière intervention 3 juillet 2006 7
8 déc. 2005 à 12:40
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.
3
vecchio56 Messages postés 6535 Date d'inscription lundi 16 décembre 2002 Statut Membre Dernière intervention 22 août 2010 14
8 déc. 2005 à 13:44
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
3
vecchio56 Messages postés 6535 Date d'inscription lundi 16 décembre 2002 Statut Membre Dernière intervention 22 août 2010 14
8 déc. 2005 à 20:11
Faudrait peut-être utiliser SetWindowLong et pas SetClassLong ;)
3
ymca2003 Messages postés 2070 Date d'inscription mardi 22 avril 2003 Statut Membre Dernière intervention 3 juillet 2006 7
8 déc. 2005 à 09:31
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.
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
cs_Joky Messages postés 1787 Date d'inscription lundi 22 novembre 2004 Statut Membre Dernière intervention 31 janvier 2009 2
8 déc. 2005 à 11:13
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;<
0
ymca2003 Messages postés 2070 Date d'inscription mardi 22 avril 2003 Statut Membre Dernière intervention 3 juillet 2006 7
8 déc. 2005 à 12:17
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).
0
cs_Joky Messages postés 1787 Date d'inscription lundi 22 novembre 2004 Statut Membre Dernière intervention 31 janvier 2009 2
8 déc. 2005 à 12:22
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;<
0
cs_Joky Messages postés 1787 Date d'inscription lundi 22 novembre 2004 Statut Membre Dernière intervention 31 janvier 2009 2
8 déc. 2005 à 19:37
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;<
0
cs_Joky Messages postés 1787 Date d'inscription lundi 22 novembre 2004 Statut Membre Dernière intervention 31 janvier 2009 2
9 déc. 2005 à 16:07
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;<
0
vecchio56 Messages postés 6535 Date d'inscription lundi 16 décembre 2002 Statut Membre Dernière intervention 22 août 2010 14
9 déc. 2005 à 16:14
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
0
ymca2003 Messages postés 2070 Date d'inscription mardi 22 avril 2003 Statut Membre Dernière intervention 3 juillet 2006 7
13 déc. 2005 à 09:24
Tu recevait un WM_PAINT pendant la création à cause du WS_VISIBLE de CreateWindow.
0
vecchio56 Messages postés 6535 Date d'inscription lundi 16 décembre 2002 Statut Membre Dernière intervention 22 août 2010 14
14 déc. 2005 à 13:53
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
0
ymca2003 Messages postés 2070 Date d'inscription mardi 22 avril 2003 Statut Membre Dernière intervention 3 juillet 2006 7
14 déc. 2005 à 16:14
En fait je parlais du code initial de Joky
0
Rejoignez-nous