begin process at 2012 05 30 17:54:43
  Trouver un code source :
 
dans
 
Accueil > Forum > 

C++ & C++ .NET

 > 

Windows

 > 

GUI

 > 

Sous classer plusieurs controles dans une classe


Derniers messages déposésPoser une question dans le forum ou lancer une discussion

Sous classer plusieurs controles dans une classe

jeudi 5 avril 2007 à 23:27:30 | Sous classer plusieurs controles dans une classe

julien_boss

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 :)

vendredi 6 avril 2007 à 11:35:56 | Re : Sous classer plusieurs controles dans une classe

juju12

Réponse acceptée !
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
vendredi 6 avril 2007 à 21:36:37 | Re : Sous classer plusieurs controles dans une classe

julien_boss

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 :)


Cette discussion est classée dans : erreur, fenetre, classe, hwnd, méthode


Répondre à ce message

Sujets en rapport avec ce message

plusieur fenetre mais une seule en mémoire... [ par Xs ] Bon, voila.Quand je fais une nouvelle fenetre avec un code ressemblant a ca : hwnd = CreateDialog(...);ShowWindow(hwnd,SW_SHOW);......bon, et bien il Dll Visual Aide [ par TheMaster ] Salut!j'ai un probleme, j'ai créer un logiciel permettant de visualiser des images.Les images sont stocke en ressource dans un dll.Mais je n'arrive pa Une fenetre animee transparente [ par anthraxx ] Anthrax ignisque -- Le charbon et le feu C la seconde foi ke je poste sur ce sujet, mais j'ai un autre probleme. En gros: j'ai une fenetre transparent Inline asm + classe = erreur! [ par Darkneon ] Salut a tous.Lorsque je mets du codes assembleur dans ma classe le compilateur me renvoit l'erreur suivante."Inline assembly not allowed in inline and refresh !!!! [ par cedcrow ] Salut, J'ai un petit prob de refresh de fenetre. Je m'explique :à partir d'une appli mère A, je lance une appli fille B par la méthode_spawnl avec com Utilisation d'une fonction callback [ par laurentl2000 ] Bonjour, Voici une fonction callback destinée à envoyer les titres des fenêtres IE ouvertes dans une listbox... BOOL CALLBACK EnumWindowsProc(HWND hwn Ou est mon erreur.... [ par ordy ] Bonjour, est ce que quelqu'un peut dire ou se trouve mon erreur.car dans l'execution de mon application il n'execute cette tache, mais il ne demarre p Trouver le hWnd d'une fenetre avec un hInstance [ par PinkRabbit84 ] Comme puis-je faire pour avoir le HWND de la fenetre principale avec le HINSTANCE de l'appMerci d'avancePinkRabbit84 Classe et méthode [ par payen ] Bonjour,J'ai défini une classe avec un ensemble de méthode. Je dois créer une nouvelle méthode pour cette classe, mais elle doit être dans un autre fi Probleme : error LNK2001: unresolved external symbol... [ par Mr.X ] Tous d'abor bonjour, quand je compile mon programme (visual c++ 6.0), il m'affiche cette erreur, ece que quelqu'un pourrais l'aider ? :Main.obj : erro


Nos sponsors


Sondage...

Comparez les prix

CalendriCode

Mai 2012
LMMJVSD
 123456
78910111213
14151617181920
21222324252627
28293031   

Consulter la suite du CalendriCode

Photothèque

A découvrir



 
Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel (EBArtSoft), Merci à Vincent pour ses précieux conseils.
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés

Google Coop CodeS-SourceS Google Coop CodeS-SourceS
Temps d'éxécution de la page : 1,217 sec (4)

Nous contacter | Annoncer sur CodeS-SourceS | Mentions légales