Sous-classement dans classe C++

Signaler
Messages postés
117
Date d'inscription
vendredi 5 novembre 2004
Statut
Membre
Dernière intervention
15 janvier 2013
-
Messages postés
571
Date d'inscription
samedi 3 avril 2004
Statut
Membre
Dernière intervention
5 décembre 2013
-
Bonjour, mon problème est le suivant :

J'aimerais sous-classer un bouton et que la procédure recevant les messages windows se trouve dans une classe. J'ai essayé plusieurs méthodes, mais pas de résultat.

Merci.
NeoUmbrella Corp. - www.NeoUmbrella.fr

5 réponses

Messages postés
571
Date d'inscription
samedi 3 avril 2004
Statut
Membre
Dernière intervention
5 décembre 2013

J'ai eu le meme probleme, je me souviens plus ce que l'on m' a expliqué mais ce n'est pas possible. En fait ce sera la meme procedure qui traitera toute tes classes.
Moi je fait

LRESULT CALLBACK ProcButton(HWND hwnd,UINT message,WPARAM wParam,LPARAM lParam) {

    MyButton * bout = (MyButton *)GetWindowLong(hwnd, GWL_USERDATA);

pour recuperer le pointeur de ma classe dans la procedure (prealablement memorisé dans GWL_USERDATA)
Messages postés
966
Date d'inscription
samedi 3 avril 2004
Statut
Membre
Dernière intervention
4 mars 2010
4
C'est pas compliqué :
une méthode de classe est de convention d'appel __thiscall, ce qui signifie que le compilateur lui passe implicitement en premier argument un pointeur sur l'instance de la classe (devient this donc); or une WndProc est de convention __stdcall (macro CALLBACK ou WINAPI) => incompatibilité. Cela ce comprend aisément : comment voulez-vous que Windows sache que le programmeur a associé une classe à sa fenêtre et qu'il doit lui fournir un pointeur sur l'instance?
Messages postés
117
Date d'inscription
vendredi 5 novembre 2004
Statut
Membre
Dernière intervention
15 janvier 2013

Je vois, merci pour vos réponses SnOOpss et Juju12.
En fait j'utilise déja GWL_USERDATA pour une autre donnée donc je suis dans l'impossibilité de l'utiliser dans ce contexte.
Donc cela n'est pas possible à faire, me voila fixé :)

Merci.
NeoUmbrella Corp. - www.NeoUmbrella.fr
Messages postés
966
Date d'inscription
samedi 3 avril 2004
Statut
Membre
Dernière intervention
4 mars 2010
4
Ben si tu stockes toutes tes données dans une structure et tu passes un pointeur sur la structure en GWL_USERDATA.
Messages postés
571
Date d'inscription
samedi 3 avril 2004
Statut
Membre
Dernière intervention
5 décembre 2013

Oui, c'est exactement ce que j'ai fait
class MyButton
{

    public:
        MyButton();

        HWND hwnd;
        int id;
        short state;
        int style;
        WNDPROC ancienproc;
....

puis
MyButton * bout = new MyButton;
SetWindowLong(hwnd,GWL_USERDATA,(long)bout);

avec ce systeme tu peux passer plusieurs parametres dans GWL_USERDATA (cf une de mes sources).
Sinon il  y a d'autres moyens pour sous-classer comme SetProp();