IdentifiantMot de passe
Loading...
Mot de passe oubli� ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les r�ponses en temps r�el, voter pour les messages, poser vos propres questions et recevoir la newsletter

C++ Discussion :

Callback d'une fenetre API Win32 dans une classe instanciable


Sujet :

C++

Vue hybride

Message pr�c�dent Message pr�c�dent   Message suivant Message suivant
  1. #1
    Futur Membre du Club
    Profil pro
    Inscrit en
    Mai 2009
    Messages
    3
    D�tails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2009
    Messages : 3
    Par d�faut Callback d'une fenetre API Win32 dans une classe instanciable
    Bonjour,

    J'aimerais savoir s'il est possible de d�clarer une classe instanciable qui contiendrait � la fois la m�thode de cr�ation d'une fenetre win32 avec CreateWindowEx et une m�thode pour g�rer les �v�nements de cette fen�tre, de sorte que les 2 puissent acc�der aux donn�es membre de ma classe.

    Typiquement j'ai deux fonctions :
    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    LRESULT CALLBACK EvenementsFenetre(HWND hwnd, UINT mes, WPARAM wParam, LPARAM lParam)
    {
       [...]
    }
     
    void CreerFenetre()
    {
       [...]
       WNDCLASSEX uneFenetre;
       // Adresse WNDPROC de ma fonction CallBack
       uneFenetre.lpfnWndProc = EvenementsFenetre;
       [...]
    }
    Je voudrais savoir comment faire pour les int�grer dans une classe instanciable du style :
    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    4
    5
    6
    7
     
    class MaFenetre
    {
       int donneeMembre;
       void CreerFenetre();
       LRESULT CALLBACK EvenementsFenetre(HWND hwnd, UINT mes, WPARAM wParam, LPARAM lParam);
    }
    Le probl�me qui se pose est que, dans le fonction CreerFenetre(), l'instruction uneFenetre.lpfnWndProc attend l'adresse d'une fonction classique et n'appr�cie pas du tout la fonction membre que je lui donne.

    Je pourrais la d�clarer en static mais je cherche � ce que la classe soit instanciable et � pouvoir acc�der aux donn�es membres.

    Est-ce possible et o� est-ce que je m'y prends mal ?

  2. #2
    Membre exp�riment� Avatar de Twindruff
    Inscrit en
    Janvier 2005
    Messages
    216
    D�tails du profil
    Informations forums :
    Inscription : Janvier 2005
    Messages : 216
    Par d�faut
    Tu ne peux pas directement donner l'adresse d'une m�thode parce que windows ne saurait pas sur quelle instance appeler cette m�thode.
    Tu vas devoir faire une fonction globale (ou une m�thode statique) qui va dispatcher les �v�nements aux bonnes instances. Pour que cette fonction globale sache � quelle instance elle doit renvoyer les messages, tu as la possibilit� de stocker des donn�es dans une fen�tre windows (SetWindowLongPtr et GetWindowLongPtr).
    Ton code peut ressembler � �a:
    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    4
    5
    6
    class MaFenetre
    {
       int donneeMembre;
       void CreerFenetre();
       LRESULT CALLBACK EvenementsFenetre(HWND hwnd, UINT mes, WPARAM wParam, LPARAM lParam);
    }
    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    LRESULT CALLBACK EvenementsFenetreDispatcher(HWND hwnd, UINT mes, WPARAM wParam, LPARAM lParam)
    {
        // cast à faire
        MaFenetre *maFenetre = GetWindowLongPtr(hwnd, GWL_USERDATA);
        maFenetre->EvenementsFenetre(hwnd, mes, wParam, lParam);
    }
     
    void CreerFenetre()
    {
       [...]
       WNDCLASSEX uneFenetre;
       // Adresse WNDPROC de ma fonction CallBack
       uneFenetre.lpfnWndProc = EvenementsFenetreDispatcher;
     
       [...]
     
       MaFenetre *maFenetre = [...];
       SetWindowLongPtr(hWnd, GWL_USERDATA, maFenetre);
       [...]
    }

  3. #3
    Futur Membre du Club
    Profil pro
    Inscrit en
    Mai 2009
    Messages
    3
    D�tails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2009
    Messages : 3
    Par d�faut
    C'est tr�s int�ressant �a, merci beaucoup !

  4. #4
    Membre �clair� Avatar de cynique
    Profil pro
    Inscrit en
    Septembre 2007
    Messages
    60
    D�tails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2007
    Messages : 60
    Par d�faut
    Citation Envoy� par Twindruff Voir le message
    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    4
    5
    6
    LRESULT CALLBACK EvenementsFenetreDispatcher(HWND hwnd, UINT mes, WPARAM wParam, LPARAM lParam)
    {
        // cast à faire
        MaFenetre *maFenetre = GetWindowLongPtr(hwnd, GWL_USERDATA);
        maFenetre->EvenementsFenetre(hwnd, mes, wParam, lParam);
    }
    Ah, presque... Pendant l'appel � CreateWindow ou CreateWindowEx, il y a plusieurs messages envoy�s � la nouvelle fen�tre. Mais la fen�tre ne sait pas son objet, parce que tu ne peux pas faire SetWindowLong() avant que CreateWindow est finie... Alors, sur le premier appel � EvenementsFenetreDispatcher, maFenetre sera NULL.



    Il n'y a pas qu'une solution pour �a. MFC utilise un "hook" pour d�tect� la cr�ation de la fen�tre avant le premier message, et un pointeur "statique" pour savoir l'objet. Ma solution, il y a quelques ann�es, utilise une fonction comme la tienne, avec un pointeur statique...

  5. #5
    Membre exp�riment� Avatar de Twindruff
    Inscrit en
    Janvier 2005
    Messages
    216
    D�tails du profil
    Informations forums :
    Inscription : Janvier 2005
    Messages : 216
    Par d�faut
    C'�tait l'id�e en gros apr�s il y a des adaptations � faire, pour plus de d�tails il y a ces documents qui sont tr�s bien faits: C++ in Action 1, 2, ...

Discussions similaires

  1. R�ponses: 1
    Dernier message: 28/03/2011, 15h58
  2. R�ponses: 1
    Dernier message: 26/12/2010, 21h20
  3. R�ponses: 1
    Dernier message: 11/01/2008, 17h54
  4. R�ponses: 4
    Dernier message: 03/05/2005, 09h03

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo