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 :

Encapsuler un WndMainProc


Sujet :

C++

  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Août 2006
    Messages
    80
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2006
    Messages : 80
    Par défaut Encapsuler un WndMainProc
    bonjour

    est ce possible d'encapsuler un WndMainProc, cest a dire avoir un truc du genre :

    LRESULT CALLBACK MyClass::WndMainProc (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)

    ?

    merci

  2. #2
    Rédacteur
    Avatar de Laurent Gomila
    Profil pro
    Développeur informatique
    Inscrit en
    Avril 2003
    Messages
    10 651
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651
    Par défaut
    Si elle est statique ça ne pose aucun problème.

    Après si tu as une classe qui représente une fenêtre, et que tu veux une technique pour dispatcher les messages vers une fonction membre spécifique de la bonne instance, il y a aussi moyen (avec un peu de bidouille).

  3. #3
    Membre confirmé
    Profil pro
    Inscrit en
    Août 2006
    Messages
    80
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2006
    Messages : 80
    Par défaut
    ok

    effectivement, j'ai une classe qui représente une fenetre et mon pb est que si "LRESULT CALLBACK MyClass::WndMainProc (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam) ,
    est static alors elle ne peut pas accéder aux membres non static (et privé) de MyClass

    cest là quentre en jeu une bidouille mais je ne vois pas laquelle

    merci

  4. #4
    Rédacteur
    Avatar de Laurent Gomila
    Profil pro
    Développeur informatique
    Inscrit en
    Avril 2003
    Messages
    10 651
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651
    Par défaut
    Tu passes un pointeur vers ton instance (this) en tant que dernier paramètre de Createwindow, afin de la récupérer plus tard.

    Ensuite il faut intercepter l'évènement WM_CREATE, récupérer l'instance de la fenêtre et l'associer au HWND d'une manière ou d'une autre. Une méthode couramment utilisée est de la stocker dans les user data :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    if (Message == WM_CREATE)
    {
        long This = reinterpret_cast<long>(reinterpret_cast<CREATESTRUCT*>(LParam)->lpCreateParams);
     
        SetWindowLongPtr(Handle, GWLP_USERDATA, This);
    }
    Ensuite lorsque tu interceptes un message dans ta callback globale, tu le dispatches à l'instance de cette manière :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    MyClass* Window = reinterpret_cast<MyClass*>(GetWindowLongPtr(Handle, GWLP_USERDATA));
     
    Window->OnMessage(Message, Lparam, Wparam);
    Il y a aussi une méthode qui consiste à associer le HWND et l'instance dans une table globale juste après CreateWindow, mais avec ça tu perds tous les messages qui interviennent entre WM_CREATE et la fin de l'appel à CreateWindow.

  5. #5
    Membre confirmé
    Profil pro
    Inscrit en
    Août 2006
    Messages
    80
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2006
    Messages : 80
    Par défaut
    super merci, je vais essayer

  6. #6
    Membre confirmé
    Profil pro
    Inscrit en
    Août 2006
    Messages
    80
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2006
    Messages : 80
    Par défaut
    ca donne qqch comme ca ?:

    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
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
     
    LRESULT CALLBACK WCapturer::WndMainProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
    {
      if (message == WM_CREATE)
      {
        long This = reinterpret_cast<long>(reinterpret_cast<CREATESTRUCT*>(lParam)->lpCreateParams);
        SetWindowLongPtr(hwnd, GWLP_USERDATA, This);
      }
      else
      {
        WCapturer* wcapturer = reinterpret_cast<WCapturer*>(GetWindowLongPtr(hwnd, GWLP_USERDATA));
     
        switch (message)
        {
        case WM_SIZE:
            wcapturer->ResizeVideoWindow();
            break;
     
        case WM_CLOSE:            
            wcapturer->hideWindow() ;
            break;
     
        case WM_DESTROY:
            PostQuitMessage(0);
            return 0;
        }
      }
     
      return DefWindowProc (hwnd , message, wParam, lParam);
    }

  7. #7
    Rédacteur
    Avatar de Laurent Gomila
    Profil pro
    Développeur informatique
    Inscrit en
    Avril 2003
    Messages
    10 651
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651
    Par défaut
    Ca a l'air, oui. Reste plus qu'à vérifier que ça fonctionne bien

  8. #8
    Membre confirmé
    Profil pro
    Inscrit en
    Août 2006
    Messages
    80
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2006
    Messages : 80
    Par défaut
    Bon alors ya un souci, il rentre dabord dans la second block (donc plante puisque que this pas encore mis dans les data user) et ne passe pas dans la premier block

    (jen suis sur, jai utiliser le débugueur de vs2005 pour ca)

    une idée ?

    je vais essayer de voir ce que vaut le premier message exactement

  9. #9
    Membre confirmé
    Profil pro
    Inscrit en
    Août 2006
    Messages
    80
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2006
    Messages : 80
    Par défaut
    ok erf, il y a des messages avant le message CREATE (je suppose), donc jai modifié comme suit et c'est bon:

    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
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
     
     
    LRESULT CALLBACK WCapturer::WndMainProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
    {
     
      static bool isCreated = false ;
      if (message == WM_CREATE)
      {
        long This = reinterpret_cast<long>(reinterpret_cast<CREATESTRUCT*>(lParam)->lpCreateParams);
        SetWindowLongPtr(hwnd, GWLP_USERDATA, This);
        isCreated = true ;
      }
      else if (isCreated)
      {
        WCapturer* wcapturer = reinterpret_cast<WCapturer*>(GetWindowLongPtr(hwnd, GWLP_USERDATA));
     
        switch (message)
        {
     
        case WM_SIZE:
            wcapturer->ResizeVideoWindow();
            break;
     
        case WM_CLOSE:            
            wcapturer->hideWindow() ;
            break;
     
        case WM_DESTROY:
            PostQuitMessage(0);
            return 0;
        }
      }
     
      return DefWindowProc (hwnd , message, wParam, lParam);
    }

  10. #10
    Rédacteur
    Avatar de Laurent Gomila
    Profil pro
    Développeur informatique
    Inscrit en
    Avril 2003
    Messages
    10 651
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651
    Par défaut
    Effectivement il y a quelques messages avant WM_CREATE (qu'il est impossible de dispatcher à l'instance dans ton cas).

    La feinte du booléen ne fonctionnera que pour la première fenêtre. Une meilleure méthode est simplement de tester le pointeur wcapturer (il sera nul tant que tu n'auras pas intercepté WM_CREATE).

  11. #11
    Membre confirmé
    Profil pro
    Inscrit en
    Août 2006
    Messages
    80
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2006
    Messages : 80
    Par défaut
    ok merci bcp, comme j'instancie qune fenetre, jai pas vu le pb venir (la mauvaise rustine koi)

    et bien merci pour toute ton aide, c'est un peu plus cair dans ma tete maintenant

  12. #12
    Membre confirmé
    Profil pro
    Inscrit en
    Août 2006
    Messages
    80
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2006
    Messages : 80
    Par défaut
    hum non en fait, le WCapturer est deja instancié à ce moment la, cest ca le pb.

    Le WCapturer ne représente pas vraiment une feneter, cest juste lui qui la crée et la gère.

    la finte me suffira pour lutilisation que jen fait.

    encore merci

  13. #13
    Rédacteur
    Avatar de Laurent Gomila
    Profil pro
    Développeur informatique
    Inscrit en
    Avril 2003
    Messages
    10 651
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651
    Par défaut
    N'hésite pas à cliquer sur si tout est ok

  14. #14
    Membre confirmé
    Profil pro
    Inscrit en
    Août 2006
    Messages
    80
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2006
    Messages : 80
    Par défaut
    ah oui cest vrai

  15. #15
    Rédacteur
    Avatar de Laurent Gomila
    Profil pro
    Développeur informatique
    Inscrit en
    Avril 2003
    Messages
    10 651
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651
    Par défaut
    Oups je n'avais pas vu ton dernier message.

    hum non en fait, le WCapturer est deja instancié à ce moment la, cest ca le pb.

    Le WCapturer ne représente pas vraiment une feneter, cest juste lui qui la crée et la gère.

    la finte me suffira pour lutilisation que jen fait.
    Il est déjà instancié, mais tu ne l'as pas placé dans les user data de la fenêtre. D'ailleurs ça plante bien parce que tu récupères un wcapturer qui vaut NULL, non ?

  16. #16
    Membre confirmé
    Profil pro
    Inscrit en
    Août 2006
    Messages
    80
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2006
    Messages : 80
    Par défaut
    oui le serpent se mort la queue là

  17. #17
    Rédacteur
    Avatar de Laurent Gomila
    Profil pro
    Développeur informatique
    Inscrit en
    Avril 2003
    Messages
    10 651
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651
    Par défaut
    Citation Envoyé par jhonnyBravo
    oui le serpent se mort la queue là
    Pas vraiment non.
    quel problème est-ce que cela te pose ?

  18. #18
    Membre confirmé
    Profil pro
    Inscrit en
    Août 2006
    Messages
    80
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2006
    Messages : 80
    Par défaut
    bah effectivement je peux creer qune fenetre mais comme jen veux qune, et que je développe une API vraiment de test, je changerai plus tard si besoin

    merci

  19. #19
    Rédacteur
    Avatar de Laurent Gomila
    Profil pro
    Développeur informatique
    Inscrit en
    Avril 2003
    Messages
    10 651
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651
    Par défaut
    Je parlais de l'autre solution, qui permet de créer plusieurs fenêtres. C'est ce que j'utilise toujours et je n'ai jamais eu de problème.

  20. #20
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 395
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 395
    Par défaut
    Au fait: Utiliser des LONG_PTR et non des long pour les appels à SetWindowLongPtr().
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 31
    Dernier message: 30/03/2006, 16h57
  2. Réponses: 9
    Dernier message: 29/03/2005, 09h36
  3. Réponses: 5
    Dernier message: 26/03/2005, 12h07
  4. Encapsulation graphique d'un outil en ligne de commande
    Par Leishmaniose dans le forum Composants VCL
    Réponses: 3
    Dernier message: 12/11/2003, 11h59
  5. [MFC](encapsulation ADO) ou placer le code
    Par philippe V dans le forum MFC
    Réponses: 2
    Dernier message: 13/06/2002, 14h58

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