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++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  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);
    }

+ 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