SubClassing et classes

Résolu
SnOOpss Messages postés 571 Date d'inscription samedi 3 avril 2004 Statut Membre Dernière intervention 5 décembre 2013 - 29 août 2006 à 18:47
SnOOpss Messages postés 571 Date d'inscription samedi 3 avril 2004 Statut Membre Dernière intervention 5 décembre 2013 - 30 août 2006 à 06:51
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

BruNews Messages postés 21040 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 août 2019
29 août 2006 à 19:17
Fonction doit être déclarée 'static'.

ciao...
BruNews, MVP VC++
3
vecchio56 Messages postés 6535 Date d'inscription lundi 16 décembre 2002 Statut Membre Dernière intervention 22 août 2010 14
29 août 2006 à 19:50
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
3
SnOOpss Messages postés 571 Date d'inscription samedi 3 avril 2004 Statut Membre Dernière intervention 5 décembre 2013
29 août 2006 à 19:39
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 ?
0
SnOOpss Messages postés 571 Date d'inscription samedi 3 avril 2004 Statut Membre Dernière intervention 5 décembre 2013
29 août 2006 à 19:52
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.
0

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

Posez votre question
SnOOpss Messages postés 571 Date d'inscription samedi 3 avril 2004 Statut Membre Dernière intervention 5 décembre 2013
29 août 2006 à 20:00
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.
0
SnOOpss Messages postés 571 Date d'inscription samedi 3 avril 2004 Statut Membre Dernière intervention 5 décembre 2013
29 août 2006 à 20:11
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.
0
vecchio56 Messages postés 6535 Date d'inscription lundi 16 décembre 2002 Statut Membre Dernière intervention 22 août 2010 14
29 août 2006 à 20:38
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
0
SnOOpss Messages postés 571 Date d'inscription samedi 3 avril 2004 Statut Membre Dernière intervention 5 décembre 2013
29 août 2006 à 21:23
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.
0
cs_aardman Messages postés 1905 Date d'inscription mercredi 22 janvier 2003 Statut Membre Dernière intervention 17 septembre 2012 3
29 août 2006 à 21:33
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>
0
SnOOpss Messages postés 571 Date d'inscription samedi 3 avril 2004 Statut Membre Dernière intervention 5 décembre 2013
30 août 2006 à 06:51
Ca je connaissais pas du tout, vais voir ca !
0
Rejoignez-nous