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

Windows Discussion :

[API Win32 C++ sans MFC] Une méthode CALLBACK ?


Sujet :

Windows

  1. #1
    Membre régulier Avatar de kidpaddle2
    Inscrit en
    Avril 2006
    Messages
    430
    Détails du profil
    Informations forums :
    Inscription : Avril 2006
    Messages : 430
    Points : 95
    Points
    95
    Par défaut [API Win32 C++ sans MFC] Une méthode CALLBACK ?
    Bonjour,

    J'aimerais faire une refonte en C++ d'un programme (NeoBlast) que j'ai fait, avec des améliorations. Néanmoins, afin de profiter de l'encapsulation et non du passage de paramètre à CreateWindow(), je souhaite encapsuler la fonction callback de ma fenpêtre dans une classe.

    Je m'explique : Ma classe 'Player' désigne en fait le lecteur prioncipal (la fenêtre principale) et contiendra comme membres privés des classes 'Dialog', pour les boîtes de dialogue, 'Button' pour des boutons ownerdraw, 'MusicModule' pour le module Audio etc. Mais pour avoir accès à ces membres (plsu d'autres bien évidemment), je devrais encapsuler la fonction Callback de la fenêtre représentée par Player (dans le constructeur, je crée la classe de fenêtre, la fenêtre, la stocke dans un membre privé etc.) dans ma classe 'Player'.

    Cependant, je n'ai pas réussi à le faire, soit disant le compilo ne la trouve pas (il me semble, c'était il y a quelques temps)...

    Serait il possible de le faire ? Si oui, comment ?

    Merci d'avance.
    Vive l'embarqué.

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

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 369
    Points : 41 518
    Points
    41 518
    Par défaut
    Une fonction CallBack est forcément statique.

    Ce que tu peux faire, c'est mémoriser le pointeur vers l'objet avec SetWindowLong() (tu le passes en paramètre, comme ça tu le reçois avec WM_CREATE pour le mémoriser) et ensuite, depuis une fonction statique, tu récupères le pointeur avec GetWindowLong() puis tu appelles la procédure non-statique...
    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.

  3. #3
    Membre régulier Avatar de kidpaddle2
    Inscrit en
    Avril 2006
    Messages
    430
    Détails du profil
    Informations forums :
    Inscription : Avril 2006
    Messages : 430
    Points : 95
    Points
    95
    Par défaut
    Hem. Je dois être stupide, car je n'ai pas compris grand chose... En gros, voici le code que j'utilise :
    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
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    #include <windows.h>
    
    #define NAME "Test"
    
    class Window
    {
        public:
            Window(HINSTANCE);
            void show(BOOL);
    
            LRESULT CALLBACK proc (HWND, UINT, WPARAM, LPARAM);
    
        private:
            HWND _hWindow;
    };
    
    Window::Window(HINSTANCE instance)
    {
        WNDCLASSEX wincl;
    
        wincl.hInstance = instance;
        wincl.lpszClassName = NAME;
        wincl.lpfnWndProc = proc;
        wincl.style = CS_DBLCLKS;
        wincl.cbSize = sizeof (WNDCLASSEX);
        wincl.hIcon = LoadIcon (NULL, IDI_APPLICATION);
        wincl.hIconSm = LoadIcon (NULL, IDI_APPLICATION);
        wincl.hCursor = LoadCursor (NULL, IDC_ARROW);
        wincl.lpszMenuName = NULL;
        wincl.cbClsExtra = 0;
        wincl.cbWndExtra = 0;
        wincl.hbrBackground = (HBRUSH) COLOR_BACKGROUND;
    
        if (RegisterClassEx (&wincl))
        {
            _hWindow = CreateWindowEx (
                                       0,
                                       NAME,
                                       NAME,
                                       WS_OVERLAPPEDWINDOW,
                                       CW_USEDEFAULT,
                                       CW_USEDEFAULT,
                                       544,
                                       375,
                                       HWND_DESKTOP,
                                       NULL,
                                       instance,
                                       NULL
                                  );
        }
    }
    
    void Window::show(BOOL state)
    {
        ShowWindow(_hWindow, (state==TRUE)?SW_SHOW:SW_HIDE);
    
        return;
    }
    
    int WINAPI WinMain (HINSTANCE hThisInstance,
                         HINSTANCE hPrevInstance,
                         LPSTR lpszArgument,
                         int nFunsterStil)
    {
        MSG messages;
    
        Window window(hThisInstance);
        window.show(TRUE);
    
        while (GetMessage (&messages, NULL, 0, 0))
        {
            TranslateMessage(&messages);
            DispatchMessage(&messages);
        }
        return messages.wParam;
    }
    
    LRESULT CALLBACK Window::proc (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
    {
        switch (message)
        {
            case WM_DESTROY:
                PostQuitMessage (0);
                break;
            default:
                return DefWindowProc (hwnd, message, wParam, lParam);
        }
        return 0;
    }
    A partir de celui ci, que dois-je faire ? Rendre statique la fonction callback ?

    [edit] Dingue, après avoir rajouté le mot clé 'static' devant le proto de la callback, ça marche !
    Ce que tu m'as dit, devrais-je le faire plus tard, dû à une complication, ou comme cela je pourrais faire comme avant ?

    [reedit] J'ai un peu compris ce que tu voulais faire... en fait, c'était pour utiliser la fonction callback, même si elle n'était pas statique. Et maintenant, normalement cela ne devrait plus poser de problème non ?
    Vive l'embarqué.

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

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 369
    Points : 41 518
    Points
    41 518
    Par défaut
    Si ta fonction CALLBACK marche très bien en statique, aucun problème.
    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.

  5. #5
    Membre régulier Avatar de kidpaddle2
    Inscrit en
    Avril 2006
    Messages
    430
    Détails du profil
    Informations forums :
    Inscription : Avril 2006
    Messages : 430
    Points : 95
    Points
    95
    Par défaut
    D'accord. Merci encore

    Tiens au fait pendant que j'y suis ... je viens de voir try et catch dans un code d'exemple du moteur ogre... J'en avais déjà entendu parler, mais à quoi ça sert exactement ? Juste pour les erreurs ?
    Vive l'embarqué.

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

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 369
    Points : 41 518
    Points
    41 518
    Par défaut
    try et catch, c'est pour les exceptions C++, lancées par des fonctions C++.

    Sous Windows, on trouve aussi __try et __except, pour les exceptions Win32.
    Les exceptions Win32 sont généralement des exceptions beaucoup plus sévères que les exceptions C++: Il s'agit notamment de l'Access Violation et de la Stack Overflow.
    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.

  7. #7
    Membre régulier Avatar de kidpaddle2
    Inscrit en
    Avril 2006
    Messages
    430
    Détails du profil
    Informations forums :
    Inscription : Avril 2006
    Messages : 430
    Points : 95
    Points
    95
    Par défaut
    D'accord, c'est bien ce que je pensais.
    Merci encore.

    Topic résolu
    Vive l'embarqué.

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

Discussions similaires

  1. Utiliser propriété de mon objet dans une méthode callback ?
    Par StringBuilder dans le forum Général JavaScript
    Réponses: 3
    Dernier message: 19/11/2014, 11h08
  2. Exécuter sans appeler une méthode
    Par Luke spywoker dans le forum Général Python
    Réponses: 4
    Dernier message: 08/04/2011, 07h50
  3. Réponses: 5
    Dernier message: 07/08/2008, 19h53
  4. [API Win32 sans MFC] Ajouter et récuperer du texte d'un EDIT
    Par dacid dans le forum Bibliothèques
    Réponses: 5
    Dernier message: 17/05/2006, 18h45
  5. [API win32 sans MFC] Création textbox et evenement bouton
    Par dacid dans le forum Bibliothèques
    Réponses: 2
    Dernier message: 17/05/2006, 12h03

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