Sous classer plusieurs controles dans une classe

Résolu
julien_boss Messages postés 165 Date d'inscription samedi 4 juin 2005 Statut Membre Dernière intervention 24 octobre 2007 - 5 avril 2007 à 23:27
julien_boss Messages postés 165 Date d'inscription samedi 4 juin 2005 Statut Membre Dernière intervention 24 octobre 2007 - 6 avril 2007 à 21:36
Bonjour,
je vous détail l'ossature de ma classe, qui crée une fenetre :
jappelle une methode Create() qui va ... créer la fenetre, je fais passer dans le dernier parametre de la fonction CreateWindowEx() un pointeur sur ma classe.
Je récupére une premiere fois ce pointeur dans le message WM_CREATE du wndproc de la fenetre (qui est une méthode de ma classe) grace à la structure LPCREATESTRUCT contenu dans le lParam, je "sauvegarde" ce pointeur grace à : SetWindowLong(hwnd, GWL_USERDATA, ptrClasse);
D'autres méthodes de ma classe gérent certains messages, par exemple le msg WM_PAINT (la méthode s'appelle MsgPaint() ). Pr les appeler, je récupére le ptr de ma classe grace à GetWindowLong() et je fais :
ptrClasse->MsgPaint(...);

Voilà, passées ces qq explications, j'expose mon probleme : dans la méthode MsgCreate() de ma classe(qui traite le msg WM_CREATE), je crée plusieurs boutons sur ma fenetre, notamment plusieurs editbox. Je souhaite les sous classer, donc dans la méthode MsgCreate() je fais ceci :
for(int i=IDD_ADD_LOG; i<=IDD_ADD_MAIL; i++)
    Edit = (WNDPROC)SetWindowLong(GetDlgItem(hwnd, i), DWL_DLGPROC, 
               (long)EditWndProc);   //erreur 3

WNDPROC Edit est une variable protégée de ma classe, et EditWndProc une méthode protégée de ma classe, voici son implémentation :

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

     if (message==WM_KEYDOWN && wParam==VK_RETURN)
     {
          SendMessage(GetDlgItem(m_hWnd, IDD_ADD_OK), BM_CLICK, 0, 0); //erreur 1
          return 0;
     }
    
     return CallWindowProc(Edit, hwnd, message, wParam, lParam); //erreur 2
}

J'ai plusieurs msg d'erreurs :
si je déclare la fonction EditWndProc comme static, j'ai :
erreur 1 : "Invalid use of member maClasse::m_hWnd in static member function"
erreur 2 : "Invalid use of member maClasse::Edit in static member function"
Si j'eneleve le mot cle static de la déclaration de la fonction, j'obtiens ce msg d'erreur :
erreur 3 : "Aggregatte value used where an integer was expected", ceci concerne le dernier param de SetWindowLong

Voilà je ne comprends pas ces erreurs, comment dois je procéder selon vous ? Merci :)

2 réponses

cs_juju12 Messages postés 966 Date d'inscription samedi 3 avril 2004 Statut Membre Dernière intervention 4 mars 2010 4
6 avril 2007 à 11:35
Déjà pour les erreurs 2 et 3 c'est tout à fait normal : si ta méthode est statique, elle n'appartient à aucune instance de classe, en particulier ne reçoit pas de pointeur this...et est donc incapable de savoir à quelle instance se réfèrent m_hwnd et Edit...
Pour l'erreur 3, je pense que tu avais compris puisque tu as voulu déclarer la méthode statique: le problème est que la fonction  WndProc ne peut être une fonction __thiscall (soit membre de classe)
Pour sortir de cette impasse :
tu sauvegardes dans chaque fenêtre au moment de la création (avec SetWindowLong, GWL_USERDATA) un pointeur sur la classe qui gère la fenêtre.
Tu déclares la procédure EditWndProc en membre de classe
Après, tu déclares une méthode WndProc (celle que tu passeras en paramètre dans le SetWindowLong de MsgCreate) en statique (ou friend) qui se chargera d'appeler chaque classe de la façon suivante :

LRESULT WndProc(...)
maClasse*pClass=reinterpret_cast<maClass*>(GetWindowLong(hWnd,...GWL_USERDATA));
pClass->EditWndProc(...);

et voila, j'espère que c'est compréhensible
3
julien_boss Messages postés 165 Date d'inscription samedi 4 juin 2005 Statut Membre Dernière intervention 24 octobre 2007
6 avril 2007 à 21:36
Merci bcp ca fonctionne. Bon ca me gene un peu d'avoir une procédure de traitement des msg qui en appelle une autre, donc d'en avoir 2, mais s'ils faut passer par là, ben tant pis.
Merci pour les connaissances apportées :)
0
Rejoignez-nous