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

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé
    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
    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 confirmé
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2005
    Messages
    5 515
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Val de Marne (Île de France)

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

    Informations forums :
    Inscription : Février 2005
    Messages : 5 515
    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 éclairé
    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
    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 confirmé
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2005
    Messages
    5 515
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Val de Marne (Île de France)

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

    Informations forums :
    Inscription : Février 2005
    Messages : 5 515
    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 éclairé
    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
    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
    Avatar de koala01
    Homme Profil pro
    aucun
    Inscrit en
    Octobre 2004
    Messages
    11 644
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : Belgique

    Informations professionnelles :
    Activité : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 644
    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

+ 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