CALLBACK dans une Classe => problême mot clef static !

Résolu
cs_Capa6T Messages postés 36 Date d'inscription vendredi 5 décembre 2003 Statut Membre Dernière intervention 15 août 2012 - 6 mai 2005 à 18:01
MuPuF Messages postés 536 Date d'inscription mercredi 27 avril 2005 Statut Membre Dernière intervention 22 août 2008 - 28 mai 2006 à 01:11
Salut,


Une petite question à 2 euros...je cherche depuis un moment et je ne trouve pas la solution.


j'ai une classe bidon:

// Bidon.h
class Bidon
{
public:
Bidon(void); // Construction
virtual ~Bidon(void); // Destruction
int Variable;
private:
static int CALLBACK TestCallBack(WPARAM wParam);
}

// Bidon.cpp
Bidon::Bidon(void)
{
Variable=16;
}
Bidon::~Bidon(void)
{
}
int CALLBACK Bidon::TestCallBack(WPARAM wParam)
{
if (Variable==16) Beep(1000,500);
return 0;

}


Ce code génére cette erreur:
error C2597: illegal reference to data member 'Bidon::Variable' in a static member function


Question: Comment je récupère la valeur de Variable dans la fonction TestCallBack
qui est déclarée en static ??? je ne m'en sort pas...
Si je vire la déclaration static, je ne peut plus mettre en place mon CALLBACK et j'ai cette erreur de compilation:
error C2440: 'type cast' : cannot convert etc etc.... à la définition du callback.


Merci d'avance.

3 réponses

cs_Capa6T Messages postés 36 Date d'inscription vendredi 5 décembre 2003 Statut Membre Dernière intervention 15 août 2012 3
6 mai 2005 à 19:38
Ok j'ai trouvé grâce à une info distillée par ymca2003...

Il suffit de rajouter ça dans le code:
// Bidon.cpp
#include "Bidon.h"

#define WM_GIVETHIS WM_USER // Message pour transmettre this au callback
Bidon *This; // Mémorise Objet this



Bidon::Bidon(void)
{
// On passe le pointeur this au CallBack pour qu'il le mémorise
this->TestCallBack(0,WM_GIVETHIS,0,this);
Variable= 16;
}
Bidon::~Bidon(void)
{
}
int CALLBACK Bidon::TestCallBack(HWND hWnd,UINT uMsg,WPARAM wParam,LPARAM lParam)
{

if (uMsg==WM_GIVETHIS)
{
This=(Bidon *)lParam;
return 0;
}
if ( This->Variable ==16) Beep(1000,500);
return 0;

}



J'ai mis en vert les changements. Bien sûr dans mon premier
post, j'avais été un peu court sur les paramètres du CallBack.
Evidement y'a un champ message et par chance un ULONG pour passer le pointeur this.

Merci ymca2003 et BruNews qui mon donné la soluce dans ce post plus particulièrement:
http://www.cppfrance.com/forum.v2.aspx?ID=422643
3
cs_Capa6T Messages postés 36 Date d'inscription vendredi 5 décembre 2003 Statut Membre Dernière intervention 15 août 2012 3
6 mai 2005 à 19:42
Désolé mais avec cette police au dessus c'est illisible...je recopie = >

// Bidon.cpp
#include "Bidon.h"

#define WM_GIVETHIS WM_USER // Message pour transmettre this au callback
Bidon *This; // Mémorise Objet this



Bidon::Bidon(void)
{
// On passe le pointeur this au CallBack pour qu'il le mémorise
this->TestCallBack(0,WM_GIVETHIS,0,this);
Variable=16;
}
Bidon::~Bidon(void)
{
}
int CALLBACK Bidon::TestCallBack(HWND hWnd,UINT uMsg,WPARAM wParam,LPARAM lParam)
{

if (uMsg==WM_GIVETHIS)
{
This=(Bidon *)lParam;
return 0;
}
if ( This->Variable ==16) Beep(1000,500);
return 0;

}



J'ai mis en vert les changements. Bien sûr dans mon premier
post, j'avais été un peu court sur les paramètres du CallBack.
Evidement y'a un champ message et par chance un ULONG pour passer le pointeur this.

Merci ymca2003 et BruNews qui mon donné la soluce dans ce post plus particulièrement:
http://www.cppfrance.com/forum.v2.aspx?ID=422643
0
MuPuF Messages postés 536 Date d'inscription mercredi 27 avril 2005 Statut Membre Dernière intervention 22 août 2008
28 mai 2006 à 01:11
Bonjour, je comprend pas, pourquoi passer par le callback pour mettre this dans les variables globales ?

// Bidon.cpp
#include "Bidon.h"

Bidon *This;                // Mémorise Objet this

Bidon::Bidon(void)
{
// On passe le pointeur this au CallBack pour qu'il le mémorise
This= (Bidon *)lParam;
Variable=16;
}
Bidon::~Bidon(void)
{
}
int CALLBACK Bidon::TestCallBack(HWND hWnd,UINT uMsg,WPARAM wParam,LPARAM lParam)
{
 if ( This->Variable ==16) Beep(1000,500);
return 0;

}

Testé et approuvé lol ;-)
Surtout, faut faire un belle explication dans les commentaires du pourquoi on se fait chier lol
0
Rejoignez-nous