Composant Perso

Résolu
cs_Joky Messages postés 1787 Date d'inscription lundi 22 novembre 2004 Statut Membre Dernière intervention 31 janvier 2009 - 4 déc. 2005 à 15:05
cs_Joky Messages postés 1787 Date d'inscription lundi 22 novembre 2004 Statut Membre Dernière intervention 31 janvier 2009 - 5 déc. 2005 à 21:08
Hey Bonjour les gens !

J'ai un soucis :)

Donc voila j'ai créer un composant drButton qui crée un bouton en forme
de flêche soit qui se dirige vers la gauche soit vers la droite !

Donc le premier problème que j'ai rencontré, c'est dans WM_PAINT

Je voulais récupérer la valeur de la direction ( contenue dans la structure drButton )

Mais voilà pas possible à travers la gestion des gestion !

Donc je suis passé par un message personnel



WM_GETDIR WM_USER+1



et voici la macro correspondante



#define Draw_Button(hButton, Dir) \

(SendMessage( \

(hButton), \

WM_GETDIR, \

(WPARAM)(DIRECTION)Dir, \

0L))



Donc dans le message correspondant je récupère la direction

avec

static int Pos = (DIRECTION)wParam;

et ainsi dans WM_PAINT, je peut dessiné en fonction de la direction.

Sauf que voilà ça marche pas puisque il reçoit le message WM_PAINT par la suite sans passer par WM_GETDIR

Et je ne peut simuler le message car je n'ai pas l'objet correspondant dans ma Procédure de message :)



En faite, je voudrais savoir, si il est possible de récupèrer l'objet associer à une Procédure de message :)

Voila merci bien :p
if(!Meilleur("Joky")) return ERREUR;<

8 réponses

vecchio56 Messages postés 6535 Date d'inscription lundi 16 décembre 2002 Statut Membre Dernière intervention 22 août 2010 14
4 déc. 2005 à 15:40
C'est quoi la "la gestion des gestion"?
J'ai pas compris le but de WM_GETDIR. Même quand tu recois le message, comment retrouves-tu la structure (si tu as plusieurs boutons dans ton application)?

Pour connaitre la direction, tu peux attacher une valeur à ton bouton:
SetWindowLong(hbtn, GWL_USERDATA, &drButton);
J'imagine que tu vois comment la récupérer
Si tu n'aimes pas la méthode, tu peux aussi utiliser un conteneur associatif:
map<HWND, int> qui te donnera la direction en fonction du bouton
3
vecchio56 Messages postés 6535 Date d'inscription lundi 16 décembre 2002 Statut Membre Dernière intervention 22 août 2010 14
4 déc. 2005 à 16:10
Tu connais pas SetWindowLong? Dommage, c'est très utile. Mais laissons la source de ymca de coté si tu veux bien (SetWindowLong set a faire plein de trucs différents).
Ta structure ne sert en fait a rien. Avec SetWindowLong, tu associe directement une valeur à un bouton.
Par exemple, tu pourrais utiliser ces deux fonction, fournies gratuitement par moi:

void SetButtonDirection(HWND hBtn, DIRECTION d)
{
SetWindowLong(hBtn, GWL_USERDATA, d);
}

DIRECTION GetButtonDirection(HWND hBtn)
{
return GetWindowLong(hBtn, GWL_USERDATA);
}
3
cs_Joky Messages postés 1787 Date d'inscription lundi 22 novembre 2004 Statut Membre Dernière intervention 31 janvier 2009 2
4 déc. 2005 à 15:47
La gestion de gestion c'était la gestion des messages mais écrit en trop vite lol :)



Donc je reprend :)

J'ai une structure de bouton

typedef struct

{

HWND hButton;

HINSTANCE hInst;

DIRECTION dirButton;



}drButton, *LP_drButton;



avec enum DIRECTION

{

LEFT,

RIGHT,

};



Et donc dans mon application je créer un bouton vers la gauche et un bouton vers la droite

Mais seulement voilà ! aucun moyen de récupèrer la direction dans WM_PAINT

Ainsi, j'ai fait le message WM_GETDIR qui fait ça :

case WM_GETDIR:

MyButt = NewButton(hWnd, (DIRECTION)wParam);

SendMessage(hWnd, WM_PAINT, wParam, lParam);

return 0;



Comme ça j'ai l'objet associé ! mais seulement il ne passe qu'une fois par la donc ça sert à rien lol.

Si tu pouvais expliquer un peu plus pour le SetWindowLong parce que
j'ai vu dans la source de ymca sur les splitter la même méthode, donc
ça m'intéresserai de la comprendre :)



TSplitterWnd* pSplitter = NULL;

if(uMsg != WM_NCCREATE)

pSplitter = (TSplitterWnd*)GetWindowLong(hWnd, 0);

else

{

pSplitter = new TSplitterWnd(hWnd);

SetWindowLong(hWnd, 0, (LONG)pSplitter);

}



Lui c'était avec des classes mais bon voilà :)

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
4 déc. 2005 à 16:15
Yo bé tu sais quoi :p

Juste quand t'as répondu, bé j'ai réussi lol :)



int Pos = MyButt->dirButton;



MyButt->hButton = CreateWindow("drButton", 0, WS_VISIBLE | WS_CHILD,



50*Pos+10, 10, 11,
11, hParent, NULL, MyButt->hInst, NULL);



SetWindowLong(MyButt->hButton, GWL_USERDATA, Pos);



et dans la procédure de message

static int pos = GetWindowLong(hWnd, GWL_USERDATA);



et ça marche impec :)

Merci mille fois :)

Et si je connais SetWindowLong, c'était juste le USERDATA, je voyais pas à quoi ça correspondait :)



Mille bisous (k) :p
if(!Meilleur("Joky")) return ERREUR;<
0

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

Posez votre question
cs_magma Messages postés 198 Date d'inscription vendredi 4 avril 2003 Statut Membre Dernière intervention 18 mars 2011
5 déc. 2005 à 10:59
MyButt == MonCul ...... in english !
0
vecchio56 Messages postés 6535 Date d'inscription lundi 16 décembre 2002 Statut Membre Dernière intervention 22 août 2010 14
5 déc. 2005 à 11:09
Ya toujours des trucs subliminaux dans les sources de Joky...
0
cs_Joky Messages postés 1787 Date d'inscription lundi 22 novembre 2004 Statut Membre Dernière intervention 31 janvier 2009 2
5 déc. 2005 à 18:15
Lol mdr

J'ai mis 10 Minutes à réfléchir pour comprendre mais voilà lol

Donc bé oui MyButton c'était trop long :)
J'essairai de me renseigner sur la langue anglaise avant de coder prochain coup :)



Au faite, c'était pas BruNews qui disait qu'on programmer avec une 100aine de mots ? :)

Comme quoi !
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
5 déc. 2005 à 21:08
Hé Vecchio j'ai un soucis lol :)

Pourquoi quand j'essai de stocker une chaîne dans GWL_USERDATA

Bé j'arrive à retrouver la chaîne mais seulement localement, et quand
j'essai de récupérer sa valeur autre part, ça marche pas :(

Comment ça se fait ? :)



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);

MessageBox(0,(char*)GetWindowLong(MyLink->hLink, GWL_USERDATA), 0, 0x40);

if(!MyLink->hLink)

return FALSE;

else

return TRUE;

}



Dans Procédure des messages:

case WM_GETVALUE:

MessageBox(0,(char*)GetWindowLong(hWnd, GWL_USERDATA), 0, 0x40);

return 0;



et donc le premier marche et l'autre non :(

if(!Meilleur("Joky")) return ERREUR;<
0
Rejoignez-nous