SubClassing et classes [Résolu]

Signaler
Messages postés
571
Date d'inscription
samedi 3 avril 2004
Statut
Membre
Dernière intervention
5 décembre 2013
-
Messages postés
571
Date d'inscription
samedi 3 avril 2004
Statut
Membre
Dernière intervention
5 décembre 2013
-
ReBonjour je sais pas ce qui se passe en ce moment mais depuis que je me suis mit aux classes je bloque toute les deux lignes, j'ai du sauter un trop gros paragraphe.

class MyBoutton
{

    public:
        MyBoutton();

        bool state;
        int style;
        WNDPROC ancienproc;
        int deco;

        //fonction
        void Subclass(HWND hwnd);
        LRESULT CALLBACK ProcBoutton(HWND hwnd,UINT message,WPARAM wParam,LPARAM lParam);

};

void MyBoutton::Subclass(HWND hwnd) {
    ancienproc = (WNDPROC)SetWindowLong(hwnd,GWL_WNDPROC,(long)ProcBoutton);
}

Pourquoi je me retrouve avec le message "error C2440: 'type cast' : cannot convert from 'LRESULT (__stdcall MyBoutton::* )(HWND,UINT,WPARAM,LPARAM)' to 'long'" alors que sans passer par les classes ca marche a chaque fois.

10 réponses

Messages postés
21042
Date d'inscription
jeudi 23 janvier 2003
Statut
Modérateur
Dernière intervention
21 août 2019
24
Fonction doit être déclarée 'static'.

ciao...
BruNews, MVP VC++
Messages postés
6535
Date d'inscription
lundi 16 décembre 2002
Statut
Modérateur
Dernière intervention
22 août 2010
7
Tu dois ajouter ceci dans le cpp:

WNDPROC MyBoutton::ancienproc;

C'est logique qu'une méthode non statique ne peut pas faire l'affaire car elle a besoin d'un objet pour être appelée, contrairement à une méthode statique

_____________________________________
Un éditeur de ressources gratuit pour Windows
Messages postés
571
Date d'inscription
samedi 3 avril 2004
Statut
Membre
Dernière intervention
5 décembre 2013

Je l'ai mit dans le headers pas dans le cpp( sinon pas de compil).
J'ai du aussi mettre static WNDPROC ancienproc;

Ca compile mais lors du link
error LNK2001: unresolved external symbol "public: static long (__stdcall* MyBoutton::ancienproc)(struct HWND__ *,unsigned int,unsigned int,long)" (?ancienproc@MyBoutton@@2P6GJPAUHWND__@@IIJ@ZA)

Meme si dans le header je met ma fonction en private (toujour le message "unresolved external symbol "public: .....")

La franchement je comprend plus rien, pourquoi ces statics ?
Messages postés
571
Date d'inscription
samedi 3 avril 2004
Statut
Membre
Dernière intervention
5 décembre 2013

En fait le prb viens de ancienproc donc j'ai remit WNDPROC ancienproc; dans le header de ma classe.

mais
LRESULT CALLBACK MyBoutton::ProcBoutton(HWND hwnd,UINT message,WPARAM wParam,LPARAM lParam) {

.....
....
  return CallWindowProc(ancienproc,hwnd,message,wParam,lParam);

}

L'erreur viens de la derniere ligne.
Messages postés
571
Date d'inscription
samedi 3 avril 2004
Statut
Membre
Dernière intervention
5 décembre 2013

Trop tard j'avait deja posté mais maintenant ca marche (enfin ca deconne a fond mais ca compile et ca linke) la je vais essayer de comprendre ce que j'ai fait car j'ai pas encore tout saisi, j'ai peur que ca deconne encore au niveau de ancienproc.

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

En fait c'etait bien ca.
Vu que ancienproc est maintenant statique, je n'en ai plus qu'un dans mon appli, y a pas moyen d'acceder au valeur de ma classe.

LRESULT CALLBACK MyBoutton::ProcBoutton(HWND hwnd,UINT message,WPARAM wParam,LPARAM lParam) {

this->style;

est impossible du coup.

C'est impossible avec les classes ? En fait je cherche a sous-classer en evitant de faire passer un pointeur dans GWL_USERDATA et je croyais ca possible avec les classes.
Messages postés
6535
Date d'inscription
lundi 16 décembre 2002
Statut
Modérateur
Dernière intervention
22 août 2010
7
En général, ce qu'on fait c'est mettre dans GWL_USERDATA une référence de l'objet pour pouvoir le retrouver dans la WndProc:

LRESULT CALLBACK MyBoutton::ProcBoutton(HWND hwnd,UINT message,WPARAM wParam,LPARAM lParam)
{
  MyBoutton* btn = (MyBoutton*)GetWindowLongPtr(hwnd, GWL_USERDATA);
  btn->...
}

_____________________________________
Un éditeur de ressources gratuit pour Windows
Messages postés
571
Date d'inscription
samedi 3 avril 2004
Statut
Membre
Dernière intervention
5 décembre 2013

Ben en fait c'est justement ce que je cherche a eviter en fait le projet final sera une librairie. Je l'ai deja fini sous la forme d'une dll pour une application (mIRC) et ce systeme de sous-classement pose probleme car 95/100 des dlls utilise cette technique et donc impossible d'en utliser 2 a la fois ( si GWL_USERDATA est utilisé par une dll c'est impossible a l'autre d'en faire autant).
Ya aussi la technique d'une liste chainées qui les memorise toute mais je pensais la refaire avec les classes.
Messages postés
1905
Date d'inscription
mercredi 22 janvier 2003
Statut
Membre
Dernière intervention
17 septembre 2012
2
Salut,

Tu peux aussi utiliser SetProp() et GetProp().

C'est moins rapide que GetWindowLong(), mais c'est pratique car tu
pourra associer plusieurs pointeurs à une même fenêtre. Pour rentre
GetProp() un peu plus rapide, on peut aussi utiliser les atoms (msdn). <name></name><link href="../../../../../css/ie4.css" type="text/css" rel="stylesheet" /><!-- @ --><link href="../../../../../css/inetsdk.css" type="text/css" rel="stylesheet" /><!-- @ --><style type="text/css"><![CDATA[
PRE.clsCode { font-size:110%; }
PRE.clsSyntax { font-size:100%; }
TD DIV.clsBeta { display:none;}

A:link { color:#0000ff; text-decoration:underline;}
A:visited { color:#0000ff; text-decoration:underline;}
A:hover { color:#3366ff; text-decoration:underline;}
MSHelp\:link {
color:#0000ff;
text-decoration:underline;
cursor:hand;
hoverColor:#3366ff;
filterString: ;}
]]></style><link href="ms-help://Hx/HxRuntime/HxLink.css" type="text/css" rel="stylesheet" />

<xml id="_topicdata" pagetype="function" proj="WinUIHXS" name="GetProp" pubpath="/WinUI/WindowsUserInterface/Windowing/WindowProperties/WindowPropertyReference/WindowPropertyFunctions/GetProp.htm"><!-- topic data --><root></root></xml>

<xml xmlns=""><mshelp:keyword index="A" term="_win32_GetProp"></mshelp:keyword><mshelp:keyword index="A" term="_win32_GetProp_cpp"></mshelp:keyword><mshelp:toctitle title="GetProp Function"></mshelp:toctitle><mshelp:rltitle title="GetProp Function ()"></mshelp:rltitle><mshelp:keyword index="F" term="GetProp"></mshelp:keyword><mshelp:keyword index="K" term="GetProp"></mshelp:keyword><mshelp:attr name="TopicType" value="kbRef"></mshelp:attr><mshelp:attr name="Locale" value="kbEnglish"></mshelp:attr><mshelp:attr name="DevLang" value="C++"></mshelp:attr><mshelp:attr name="Technology" value="WinUI"></mshelp:attr><mshelp:attr name="TechnologyVers" value="kbWinUI"></mshelp:attr><mshelp:attr name="DocSet" value="WCSDK"></mshelp:attr><mshelp:attr name="DocSet" value="LHSDK"></mshelp:attr><mshelp:attr name="DocSet" value="PSDK"></mshelp:attr><mshelp:attr name="TargetOS" value="Windows"></mshelp:attr><mshelp:attr name="APIName" value="GetPropA"></mshelp:attr><mshelp:attr name="APIName" value="GetPropW"></mshelp:attr><mshelp:attr name="TopicType" value="apiref"></mshelp:attr><mshelp:attr name="APIName" value="GetProp"></mshelp:attr><mshelp:attr name="APIType" value="DllExport"></mshelp:attr><mshelp:attr name="APILocation" value="user32.dll"></mshelp:attr><mshelp:attr name="TopicType" value="kbSyntax"></mshelp:attr></xml>
Messages postés
571
Date d'inscription
samedi 3 avril 2004
Statut
Membre
Dernière intervention
5 décembre 2013

Ca je connaissais pas du tout, vais voir ca !