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 :

Déclaration d'une calback dans une classe ?


Sujet :

C++

  1. #1
    Membre habitué
    Profil pro
    Inscrit en
    Décembre 2006
    Messages
    412
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Décembre 2006
    Messages : 412
    Points : 149
    Points
    149
    Par défaut Déclaration d'une calback dans une classe ?
    Bonjours,

    Je voudrai savoir comment on déclare la fonction. l'exemple ici est celui fourni par défaut de code block
    *.hpp
    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
     
    #ifndef DEF_ME_WIN
    #define DEF_ME_WIN
     
    #include <tchar.h>
    #include <windows.h>
     
    #include <iostream>
    class C_MeDefaultWindows
    {
    	public:
    		C_MeDefaultWindows ();
     
    		void WinDefault(HINSTANCE & hThisInstance);
        //private:
            LRESULT CALLBACK WindowProcedure (HWND, UINT, WPARAM, LPARAM);
    };
    #endif

    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
     
    #include "cdefaultwindows.hpp"
    C_MeDefaultWindows::C_MeDefaultWindows(){}
     
    LRESULT CALLBACK WindowProcedure (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
    {
        switch (message)                  /* handle the messages */
        {
            case WM_DESTROY:
                PostQuitMessage (0);       /* send a WM_QUIT to the message queue */
                break;
            default:                      /* for messages that we don't deal with */
                return DefWindowProc (hwnd, message, wParam, lParam);
        }
     
        return 0;
    }
     
    void C_MeDefaultWindows::WinDefault(HINSTANCE & hThisInstance){
      HWND hwnd;               /* This is the handle for our window */
        MSG messages;            /* Here messages to the application are saved */
        WNDCLASSEX wincl;        /* Data structure for the windowclass */
        TCHAR szClassName[ ] = _T("CodeBlocksWindowsApp");
     
        /* The Window structure */
     
        wincl.hInstance = hThisInstance;
        wincl.lpszClassName = szClassName;
        wincl.lpfnWndProc = C_MeDefaultWindows::WindowProcedure;      /* comment déclarer ?? */
        wincl.style = CS_DBLCLKS;                 /* Catch double-clicks */
        wincl.cbSize = sizeof (WNDCLASSEX);
     
        /* Use default icon and mouse-pointer */
        wincl.hIcon = LoadIcon (NULL, IDI_APPLICATION);
        wincl.hIconSm = LoadIcon (NULL, IDI_APPLICATION);
        wincl.hCursor = LoadCursor (NULL, IDC_ARROW);
        wincl.lpszMenuName = NULL;                 /* No menu */
        wincl.cbClsExtra = 0;                      /* No extra bytes after the window class */
        wincl.cbWndExtra = 0;                      /* structure or the window instance */
        /* Use Windows's default colour as the background of the window */
        wincl.hbrBackground = (HBRUSH) COLOR_BACKGROUND;
    };
    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
     
    #if defined(UNICODE) && !defined(_UNICODE)
        #define _UNICODE
    #elif defined(_UNICODE) && !defined(UNICODE)
        #define UNICODE
    #endif
     
    #include <tchar.h>
    #include <windows.h>
     
    #include "cdefaultwindows.hpp"
    #include <iostream>
    /*  Declare Windows procedure  */
    //LRESULT CALLBACK WindowProcedure (HWND, UINT, WPARAM, LPARAM);
     
    /*  Make the class name into a global variable  */
    //TCHAR szClassName[ ] = _T("CodeBlocksWindowsApp");
     
    int WINAPI WinMain (HINSTANCE hThisInstance,
                         HINSTANCE hPrevInstance,
                         LPSTR lpszArgument,
                         int nCmdShow)
    {
        C_MeDefaultWindows CMDW;
        CMDW.WinDefault(hThisInstance);
        return 0;
    }

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    28:23: error: cannot convert 'C_MeDefaultWindows::WindowProcedure' from type 'LRESULT (C_MeDefaultWindows::)(HWND, UINT, WPARAM, LPARAM) {aka long int (C_MeDefaultWindows::)(HWND__*, unsigned int, unsigned int, long int)}' to type 'WNDPROC {aka long int (__attribute__((__stdcall__)) *)(HWND__*, unsigned int, unsigned int, long int)}'
         wincl.lpfnWndProc = C_MeDefaultWindows::WindowProcedure;      /* This function is called by windows */
    La ligne concernée c'est donc WindowProcedure.


    Merci d'avance

  2. #2
    Expert éminent sénior
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2005
    Messages
    5 073
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Conseil

    Informations forums :
    Inscription : Février 2005
    Messages : 5 073
    Points : 12 119
    Points
    12 119
    Par défaut
    Il doit manquer un "static" au début de la déclaration de la fonction "WindowProcedure".

    Pourquoi utiliser cette antiquité ???

  3. #3
    Membre habitué
    Profil pro
    Inscrit en
    Décembre 2006
    Messages
    412
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Décembre 2006
    Messages : 412
    Points : 149
    Points
    149
    Par défaut
    erf, merci c'est bien cela qui fallait, pour l'antiquité , je ne sais pas quoi utiliser, je recherche quelque chose de portable QT est trop lourd a coder seul.
    je me demande si la sdl serai pas plus adapter pour faire des applications.

  4. #4
    Expert éminent sénior
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2005
    Messages
    5 073
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Conseil

    Informations forums :
    Inscription : Février 2005
    Messages : 5 073
    Points : 12 119
    Points
    12 119
    Par défaut
    Votre bidouille avec l'antiquité Win32, c'est tout sauf portable, c'est Windows only.

    Bibliothèque pour IHM d'application Portable en C++, c'est Qt dans la très très grande majorité.

    On s'en fout un peu de la lourdeur de l'environnement de développement, et en plus il est modulaire, donc on peut pas mal réduire son empreinte disque.

    Pour l'environnement d'exécution, c'est pas si énorme, et si vous commencez sérieusement à faire une application, vous aurez bien plus lourd si vous refaite tout ce qui est nécessaire à la main.

    SDL, c'est une librairie C, pas C++, vous devrez faire ou utiliser un wrapper C++, pour avoir une bibliothèque orienté d'IHM "jeu" et rien pour des applications avec des contrôles "standards".

    Franchement, votre argumentaire pour écarter Qt, c'est plus que light, encore plus pour du portable.

  5. #5
    Membre habitué
    Profil pro
    Inscrit en
    Décembre 2006
    Messages
    412
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Décembre 2006
    Messages : 412
    Points : 149
    Points
    149
    Par défaut
    Finalement je pense que je vais me tourner du coter de la sdl2/opengl si j'arriver a l'installer ....
    Les tuto sont souvent bien fait mai je ne trouve pas pourquoi cela ne marche pas. je ferai un post si j'y parviens pas

    La ""majorité"" des librairies utilisées sont codée en C donc forcement on ce tape des wrapper en c++,
    bref il faut ré-inventer la roue pour s'en servir comme on le veux en c++ si il y a une alternative je suis bien sur ouvert

    Qt est vraiment lourd, rien qu'a télécharger les libraire de développement c'est avec leur utilitaire... Et rien pour compiler dans code block il faut sacrement s'accrocher pour trouver une solution, le meilleur moyen reste a utiliser ceux fournis par QT qui ne me plait guère.

    Qt offre clairement une bonne librairie. mai pas pour ce que je compte faire.

    Merci pour ta réponse

  6. #6
    Expert éminent sénior
    Avatar de koala01
    Homme Profil pro
    aucun
    Inscrit en
    Octobre 2004
    Messages
    11 614
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : Belgique

    Informations professionnelles :
    Activité : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 614
    Points : 30 626
    Points
    30 626
    Par défaut
    Salut,

    Et, sinon, au pire, il est possible, en C++ moderne (C++11 et ultérieurs) de mettre en place un système de signal et de slot en moins de deux cents lignes de code effectives (tous commentaires supprimés). Je le sais, je l'ai fait, et j'ai mis le résultat dans un projet disponible sur framagit (avec exemples, documentation et tests unitaires)

    Cette approche est non seulement beaucoup plus souple et portable que celle que tu envisages pour l'instant, mais aussi beaucoup plus dans le style du C++
    A méditer: La solution la plus simple est toujours la moins compliquée
    Ce qui se conçoit bien s'énonce clairement, et les mots pour le dire vous viennent aisément. Nicolas Boileau
    Compiler Gcc sous windows avec MinGW
    Coder efficacement en C++ : dans les bacs le 17 février 2014
    mon tout nouveau blog

  7. #7
    Membre habitué
    Profil pro
    Inscrit en
    Décembre 2006
    Messages
    412
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Décembre 2006
    Messages : 412
    Points : 149
    Points
    149
    Par défaut
    Vraiment un joli travaille, je me suis pas encore pencher sure les slot/connexion.
    Pour ce que j'ai pus voir comme exemple j'ai rien vu avec une interface, autre que la console si des fois tu l'aurais fait et que je suis passer à côter. ?
    Il n'y aurai pas un moyen de récupérer tous cela ?

    Merci pour ta réponse,

  8. #8
    Expert éminent sénior
    Avatar de koala01
    Homme Profil pro
    aucun
    Inscrit en
    Octobre 2004
    Messages
    11 614
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : Belgique

    Informations professionnelles :
    Activité : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 614
    Points : 30 626
    Points
    30 626
    Par défaut
    Le fait est que la bibliothèque standard est la seule bibliothèque pour laquelle je puisse avoir la certitude que n'importe quel développeur en dispose (à partir du moment où il a un compilateur C++)...

    Le fait d'afficher le résultat (après l'émission du signal) dans la console est donc l'une des seules actions que je puisse me permettre, même si j'aurais tout aussi bien pu effectuer l'affichage directement dans les différents slots

    Mais, ceci étant dit, le principe reste toujours le même, quelle que soit la bibliothèque externe que tu envisagera d'utiliser:

    Si tu estimes que "quelque chose" doit émettre sous la forme d'un signal des informations quelconques, tu "n'a qu'à" ajouter un Tools::Signal</* liste des type de données à transmettre */> (et, le cas échéant, ajouter une fonction qui délègue la connexion d'un slot au signal en question).

    Si tu estimes que "quelque chose" est intéressé par un signal émis, tu "n'as qu'à" t'arranger pour qu'une fonction capable de réagir au signal en question puisse servir de slot et à récupérer (et maintenir en vie aussi longtemps que nécessaire) la donnée de type Tools::Connection renvoyée par la fonction connect du signal.

    Il faut juste prendre en compte que ce système de signaux et de slots et totalement différent de n'importe quel système de signaux et de slots fourni par n'importe quelle bibliothèque externe (Qt et SFML, par exemple, fournissent un système équivalent) et qu'il en est en outre totalement indépendant.

    Il n'y a absolument aucun intérêt à utiliser mon système de signaux et de slots pour faire dialoguer deux éléments dérivé de QObject (celui de Qt étant largement aussi efficace, si ce n'est d'avantage sur certains points), mais rien en t'empêche d'utiliser mon système à la place de celui de Qt pour -- justement -- faire dialoguer une classe dérivée de QObject et une classe "personnalisée" qui n'a aucune raison de dépendre de Qt

    Maintenant, si tu y tiens, je pourrais -- juste pour toi -- prévoir des exemples de combinaisons avec Qt et / ou SFML
    A méditer: La solution la plus simple est toujours la moins compliquée
    Ce qui se conçoit bien s'énonce clairement, et les mots pour le dire vous viennent aisément. Nicolas Boileau
    Compiler Gcc sous windows avec MinGW
    Coder efficacement en C++ : dans les bacs le 17 février 2014
    mon tout nouveau blog

  9. #9
    Membre habitué
    Profil pro
    Inscrit en
    Décembre 2006
    Messages
    412
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Décembre 2006
    Messages : 412
    Points : 149
    Points
    149
    Par défaut
    Merci pour tes informations sa fait plaisir, pour Qt et / ou SFML , c'est pas juste pour moi qu'il te faut envisager , mai pour tous

  10. #10
    Expert éminent sénior
    Avatar de koala01
    Homme Profil pro
    aucun
    Inscrit en
    Octobre 2004
    Messages
    11 614
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : Belgique

    Informations professionnelles :
    Activité : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 614
    Points : 30 626
    Points
    30 626
    Par défaut
    A vrai dire, je n'en suis pas convaincu...

    D'abord, parce que, si je commence à fournir des exemples spécifiques pour l'utilisation de Qt ou de SFML, on va rapidement me demander "mais pourquoi Qt / SFML et pas WxWidget / Gtk / SDL / autre ".

    Or, chaque bibliothèque externe pour laquelle je pourrais envisager d'ajouter un exemple impose une dépendance : si la bibliothèque n'est pas présente sur le système de la personne qui récupère e projet, l'exemple ne compilera purement et simplement pas

    Bien sur, je pourrais faire en sorte que CMake ne prévoie la compilation que pour les bibliothèques présentes sur le système des gens.

    Mais je n'ai pas la science infuse, et on risque de me réclamer des exemples d'utilisation avec des bibliothèques que je ne connais absolument pas, voire, que je ne veux (ou ne peux) pas forcément installer sur mon système.

    Ensuite, parce que le mode de fonctionnement reste toujours le même... Or, si tu y regarde bien, j'ai donné:
    • un exemple pour la connexion à une fonction libre
    • deux exemples d'utilisation d'expression lambda
    • deux exemples de connexion à une fonction membre de classe
    • un exemple de connexion de connexion d'une classe à une autre
    • un exemple spécifique à la création d'un timer
    • un exemple spécifique à la création d'un compte à rebours

    (ils se trouvent tous dans le sous dossier examples/Tools/Signal/src)

    Je crois -- très sincèrement -- avoir couvert à peu près toutes les situations envisageables

    Enfin, les exemples ne sont -- a priori -- jamais que des exemples : ils n'ont absolument pas la prétention d'être utiles "tels quels" et nécessitent forcément "une certaine dose d'adaptation" aux besoins des gens.

    Or, je dois aussi partir du principe que le développeur C++ qui décide d'avoir recours à Qt ou à la SFML (ou à n'importe quelle bibliothèque externe, d'ailleurs) connaît un minimum le C++ et qu'il a un minimum de jugeote. Car agir différemment reviendrait à prendre les gens pour des imbéciles finis. Même si c'est ce que sont la plupart des gens, très peux d'entre eux supportent qu'on le leur fasse remarquer (et je me compte dans le lot )

    C'est pourquoi, je n'aurai aucun problème à te présenter un exemple spécifique à l'utilisation avec SFML ou avec Qt, mais que je tiens à ce que cela reste "une faveur" qui te sera accordée dans le cadre de l'aide que j'apporte régulièrement sur le forum
    A méditer: La solution la plus simple est toujours la moins compliquée
    Ce qui se conçoit bien s'énonce clairement, et les mots pour le dire vous viennent aisément. Nicolas Boileau
    Compiler Gcc sous windows avec MinGW
    Coder efficacement en C++ : dans les bacs le 17 février 2014
    mon tout nouveau blog

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

Discussions similaires

  1. Réponses: 7
    Dernier message: 26/03/2013, 13h07
  2. Pré-déclaration d'une classe dans un namespace
    Par Invité dans le forum C++
    Réponses: 6
    Dernier message: 30/07/2010, 09h38
  3. comment se fait la déclaration d'une class?
    Par dardoura2 dans le forum C++
    Réponses: 2
    Dernier message: 10/12/2006, 16h47
  4. [Héritage] Déclaration d'une classe amie
    Par nihlstroem dans le forum Delphi
    Réponses: 3
    Dernier message: 11/08/2006, 16h57
  5. Séparer la définition et la déclaration d'une classe
    Par prgasp77 dans le forum Langage
    Réponses: 5
    Dernier message: 24/08/2005, 21h37

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