[C++ API win] fonction membre pour traiter des messages [Résolu]

Messages postés
192
Date d'inscription
vendredi 19 mars 2004
Statut
Membre
Dernière intervention
30 janvier 2008
- - Dernière réponse : THEwarrior333
Messages postés
192
Date d'inscription
vendredi 19 mars 2004
Statut
Membre
Dernière intervention
30 janvier 2008
- 12 juin 2007 à 20:58
[C++ API windows]


Bonjour!

Comment faire pour que la fonction callback de traitement des messages soit membre d'une classe?


Car je suis confronté au problème suivant:


je crée une fenêtre donc je rempli une struture WNDCLASSEX ( ou
WNDCLASS ) et comme fonction de traitement des messages j'indique (
champ lpfnWndProc ) la fonction membre MyClass::Proc():

class A
{
    public:
       void Init();
};

class MyClass
{
    public:
       LRESULT CALLBACK Proc( HWND , UTINT , WPARAM , LPARAM );
};

void A::Init()
{

    ...
    WNDCLASSEX wnd;
    wnd.lpfnWndProc = MyClass::Proc;

    ...
}


Et ca ne compile pas! (évidemment car il y a incompatibilité des types)


Comment faire?


Merci pour vos idées!
Afficher la suite 

8 réponses

Meilleure réponse
Messages postés
179
Date d'inscription
mardi 16 août 2005
Statut
Membre
Dernière intervention
25 août 2010
3
Merci
Ce que tu peux faire :

Tu cree ton object :

A* a = new A(..);

Ensuite, dans une fonction d'initialisation (ou pourquoi dans le constructreur, mais bon...), tu crée ta fenetre par createwindow, dialogbox, ...... Ces fonctions retourne un HWND.

A::init()
{
    HWND hWnd = ........;

    SetWindowLong(hWnd, GWL_USERDATA, this);
}

dans ta class tu une fonction statique tu style :

A* A::getInstanceFromHandle(HWND hWnd)
{
   return   GetWindowLong(hWnd, GWL_USERDATA);

}

et dans ta fonction static Proc :

LRESULT CALLBACK Proc( HWND hWnd, UTINT uMsg, WPARAM wParam, LPARAM lParam)
{
    A a* = A::getInstanceFromHandle(hWnd);
    ...
    Et voila...
}

Dire « Merci » 3

Quelques mots de remerciements seront grandement appréciés. Ajouter un commentaire

Codes Sources 135 internautes nous ont dit merci ce mois-ci

Commenter la réponse de cs_vicenzo
Messages postés
179
Date d'inscription
mardi 16 août 2005
Statut
Membre
Dernière intervention
25 août 2010
0
Merci
déclare ta fonction static et ca marchera mieux... Mais n'oublies pas que les membres et fonctions non statiques ne seront plus alors accessible...

Tu donc donc avour un variable globale statique intance de ta classe ou alors  tu peux dans ta fonction intercepter WM_CREATE ou WM_NCCREATE et associer ton instance de ta classe par SetWindowLong....
Commenter la réponse de cs_vicenzo
Messages postés
192
Date d'inscription
vendredi 19 mars 2004
Statut
Membre
Dernière intervention
30 janvier 2008
0
Merci
Merci pour ta réponse!


En fait ma fonction doit pouvoir accéder aux membres non statiques.


Donc voila ce que j'ai fait:


Ma fonction Proc n'est plus membre de MyClass, j'ai déclaré un pointeur globalg_MyClass sur l'instance de MyClass

et dans Proc j'accède aux éléments de MyClass par des accesseurs via g_MyClass genre g_MyClass->GetMyVar();


Ca fonctionne mais est-ce une bonne solution?
Commenter la réponse de THEwarrior333
Messages postés
179
Date d'inscription
mardi 16 août 2005
Statut
Membre
Dernière intervention
25 août 2010
0
Merci
c'est la premiere solution... qui a les désavantage d'avoir une variable globale et qui est alors unique....
La deuxième solution est plus propre (+objet) car pas de variable globale et tu peux associer une instance de ta classe à chaque fenêtre créee...
Commenter la réponse de cs_vicenzo
Messages postés
192
Date d'inscription
vendredi 19 mars 2004
Statut
Membre
Dernière intervention
30 janvier 2008
0
Merci
Je tente la deuxieme solution mais j'ai du mal à la comprendre:


dois-je faire
...
wnd.lpfnWndProc = GlobalProc;

...

LRESULT CALLBACK Proc( HWND hWnd, UTINT uMsg, WPARAM wParam, LPARAM lParam)

{

    ...
    case:
        SetWindowLong(hWnd, GWL_WNDPROC, MyClass::Proc);
        break;

}
Commenter la réponse de THEwarrior333
Messages postés
192
Date d'inscription
vendredi 19 mars 2004
Statut
Membre
Dernière intervention
30 janvier 2008
0
Merci
Pardon j'ai oublié un mot dans le code:


"case WM_CREATE:"


(dommage qu'on ne puisse pas éditer les posts)
Commenter la réponse de THEwarrior333
Messages postés
192
Date d'inscription
vendredi 19 mars 2004
Statut
Membre
Dernière intervention
30 janvier 2008
0
Merci
et zut, encore une coquille, la fonction est

LRESULT CALLBACK GlobalProc( HWND hWnd, UTINT uMsg, WPARAM wParam, LPARAM lParam)


desole je fatigue...
Commenter la réponse de THEwarrior333
Messages postés
192
Date d'inscription
vendredi 19 mars 2004
Statut
Membre
Dernière intervention
30 janvier 2008
0
Merci
Nickel, ca fonctionne, merci beaucoup!

je ne savais pas que l'on pouvait associer ses propres variables à l'instance d'une fenêtre...
Commenter la réponse de THEwarrior333