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 :

Gestion des evenements et callback


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé
    Profil pro
    Inscrit en
    Avril 2005
    Messages
    309
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2005
    Messages : 309
    Par défaut Gestion des evenements et callback
    Bonjour à tous

    Lors d'une de mes discussions, il me semble qu'un membre m'avait dit que la gestion des evenements d'une fenetre et de ses controles ne passait pas obligatoirement par une callback

    J'ai fait des recherches mais a part un code de Hook de microsoft, j'ai pas trouvé grand chose
    Et encore je ne sais meme pas si cela marche pour le C
    http://msdn.microsoft.com/fr-fr/libr...(v=VS.71).aspx

    J'ai pensé à un SWITCH dans la boucle
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    While (GetMessage(&msg, NULL, 0, 0))
        {
           TranslateMessage(&msg);
           DispatchMessage(&msg);
        }
    Mais avant de faire des betises ....
    Pourriez vous me guider sur les divers moyens de receptionner les evenements ???

    Merci et bonne journée

  2. #2
    Membre Expert
    Avatar de prgasp77
    Homme Profil pro
    Ingénieur en systèmes embarqués
    Inscrit en
    Juin 2004
    Messages
    1 306
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Eure (Haute Normandie)

    Informations professionnelles :
    Activité : Ingénieur en systèmes embarqués
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Juin 2004
    Messages : 1 306
    Par défaut
    Qu'as-tu contre les callbacks ? Ça reste une solution correcte dans la majorité des cas. Car au final insérer ton switch dans la boucle d'interception d'événements revient en théorie à le mettre dans le callback et lier les deux, avec le défaut principal de risquer l'engorgement (trop d'événements arrivant d'un coup) et de rendre le code peu lisible.

    Ensuite, le principe du hook est celui du callback, mais il est en général pas approprié (on l'utilise lorsque des événements dont on est pas le propriétaire nous intéresse).

    Cordialement,

  3. #3
    Membre éclairé
    Profil pro
    Inscrit en
    Avril 2005
    Messages
    309
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2005
    Messages : 309
    Par défaut
    Oh je n'ai pas réellement de dent parmi mes 32 contre les callbacks

    Je trouve que cela fait une fonction de plus a gérer dans le code
    Je suis debutant et je ne connais pas les tenants et aboutissants du langage, c'est juste que je voulais savoir, si il etait possible de ne pas les utiliser ??

    J'avais juste pris l'habitude de ne les utiliser que dans certains cas, ou justement je voulais de la rapidité ou intercepter un message

    Mais pour gérer le retour d'un clic, que un bouton, je trouve que ça fait beaucoup de code.

    C'est pour cette raison que je voulais savoir si cela ne posait pas de problème, si je mettais mon switch directement dans la boucle d'interception d'événements, et je supprimais la callback, dans le cas ou je n'ai que quelques événements simples à surveiller

  4. #4
    Membre Expert
    Avatar de prgasp77
    Homme Profil pro
    Ingénieur en systèmes embarqués
    Inscrit en
    Juin 2004
    Messages
    1 306
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Eure (Haute Normandie)

    Informations professionnelles :
    Activité : Ingénieur en systèmes embarqués
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Juin 2004
    Messages : 1 306
    Par défaut
    Tu peux toujours essayer pour voir ce que ça fait (jamais tenté de mon coté), mais j'ai bien peur que tu ne compliques le code sans rien apporter en retour.

    Sinon un bon code est un code divisé et subdivisé en fonctions (ou autres entités de même genre) tel qu'une personne découvrant le code comprenne ce qu'il fait. Ceci dit, que penses tu de ces deux codes :
    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
    while(un_evenement_a_gerer()) {
       switch(premier_evenement()) {
       case TRUCBIDUL1:
          // 50 lignes de code pas trop claires
          break;
       case TRUCBIDUL2:
          // 20 lignes obscures
          break;
       case TRUCBIDULE3:
          // 30 lignes incompréhensibles
          break;
       default:
          // blabla
       }
    }
    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
    while(un_evenement_a_gerer()) {
       switch(premier_evenement()) {
       case TRUCBIDUL1:
          onClic()
          break;
       case TRUCBIDUL2:
          onDoubleClic()
          break;
       case TRUCBIDULE3:
          onRightClic()
          break;
       default:
          // blabla
       }
    }
     
    void onClic() {
       // 50 lignes de code pas trop claires
    }
    void onDoubleClic() {
       // 20 lignes obscures
    }
    void onRightClic() {
       // 30 lignes incompréhensibles
    }

  5. #5
    Membre éclairé
    Profil pro
    Inscrit en
    Avril 2005
    Messages
    309
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2005
    Messages : 309
    Par défaut
    Oui oui...tu as mille fois raison...j'ai du mal m'exprimer

    Je ne veut pas du tout supprimer les fonctions, tres loin de la et bien au contraire.
    Justement j'ai appris bien trop tard ce qu'etait une fonction et avant je codais en QBasic sans aucune fonction en repetant tout et a chaque fois
    Des milliers de lignes pour un programme simple

    Maintenant grace a des gens comme toi que j'ai rencontré dans un autre langage, j'ai appris...(Du moin je l'espere) le B-a-ba de la programmation.
    Et ce que tu viens de me montrer est evidemment la meilleure methode.

    Non ma seule question est de ne pas mettre les evenements dans la callback si l'on est pas obligé parfois peut aussi soulager un code.

    Imagine que tu ai une fenetre avec quelques boutons et un controle String
    Le nombre d'evenements pouvant se produire est extremement reduit.

    Je cherche depuis hier un code ou la gestion de l'evenement n'est pas faite dans une callback et je n'en trouve pas

    Alors ma question est :
    Est il possible si l'on a que quelques evenements de les mettre dans la boucle
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    while (GetMessage(&msg, NULL, 0, 0))
        {
           TranslateMessage(&msg);
           DispatchMessage(&msg);
     }
    Ou bien il ne faut jamais faire cela en C ???

    Regarde deux exemples à ton tour
    Le premier long pour pas grand chose (Enfin a mon avis et si encore une fois...c'est pas obligé )
    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
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    #include <windows.h>
     
    LRESULT CALLBACK WndProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
    {
        static HINSTANCE hInstance;
     
        switch (message)
        {
        case WM_CREATE:
     
            hInstance = ((LPCREATESTRUCT)lParam)->hInstance;
            CreateWindow("BUTTON", "OK", WS_CHILD | WS_VISIBLE, 0, 0, 100,24, hwnd, (HMENU)1, hInstance, NULL);
     
            break;
     
        case WM_COMMAND:
            /***************************************************\
            * LOWORD(wParam) = ID du contrôle ou du menu        *
            * HIWORD(wParam) = Raison du message (notification) *
            \***************************************************/
     
            switch(LOWORD(wParam))
            {
     
            case 1:
     
                switch(HIWORD(wParam))
                {
     
                case BN_CLICKED:
                    Beep(1000, 100);
                    break;
     
                default:
                    break;
                }
     
                break;
     
            case 2:
     
                switch(HIWORD(wParam))
                {
     
                case BN_CLICKED:
     
                    Beep(100, 100);
                    break;
     
                default:
     
                    break;
     
                }
     
                break; 
     
            default:
     
                break;
     
            }
     
            break; /* case WM_COMMAND */
     
        case WM_DESTROY:
     
            PostQuitMessage(0);
            break;
     
        default:
     
            return DefWindowProc(hwnd, message, wParam, lParam);
     
        }
     
        return 0;
     
    }
     
    void Bip(/*paramètres ou non*/)
    {
     Beep(100, 100);
    }
     
    int Principal(HINSTANCE hInstance, int nCmdShow)
    {
     
        HWND hWnd;
        MSG msg;
        HWND hWndB1;
        HWND hWndB2;
     
        hWnd = CreateWindow("Classe 1", "Notre première fenêtre", WS_OVERLAPPEDWINDOW,100, 100, 600, 300, NULL,NULL,hInstance,NULL);
        hWndB1 = CreateWindow("BUTTON", "OK1", WS_CHILD | WS_VISIBLE, 100,100, 100,24, hWnd, (HMENU)1, hInstance, NULL);
        hWndB2 = CreateWindow("BUTTON", "OK2", WS_CHILD | WS_VISIBLE, 200,200, 100,24, hWnd, (HMENU)2, hInstance, NULL);
        ShowWindow(hWnd, nCmdShow);
       Bip();
     
    	while (GetMessage(&msg, NULL, 0, 0))
        {
           TranslateMessage(&msg);
           DispatchMessage(&msg);
     
    	 }
     
        return (int)msg.wParam;
     
    }
     
    int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow)
    {
     
     
        WNDCLASS wc;
        wc.cbClsExtra     = 0;
        wc.cbWndExtra     = 0;
        wc.hbrBackground  = (HBRUSH)(COLOR_WINDOW + 1);
        wc.hCursor        = LoadCursor(NULL, IDC_ARROW);
        wc.hIcon          = LoadIcon(NULL, IDI_APPLICATION);
        wc.hInstance      = hInstance;
        wc.lpfnWndProc    = WndProc;
        wc.lpszClassName  = "Classe 1";
        wc.lpszMenuName   = NULL;
        wc.style          = CS_HREDRAW | CS_VREDRAW;
     
        RegisterClass(&wc);
     
        return Principal(hInstance, nCmdShow);
     
    }
    Le second sans callback (Si c'est possible...)
    C'est du pseudo code...
    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
    #include <windows.h>
     
    int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow)
    {
        WNDCLASS wc;
        wc.cbClsExtra     = 0;
        wc.cbWndExtra     = 0;
        wc.hbrBackground  = (HBRUSH)(COLOR_WINDOW + 1);
        wc.hCursor        = LoadCursor(NULL, IDC_ARROW);
        wc.hIcon          = LoadIcon(NULL, IDI_APPLICATION);
        wc.hInstance      = hInstance;
        wc.lpfnWndProc    = WndProc;
        wc.lpszClassName  = "Classe 1";
        wc.lpszMenuName   = NULL;
        wc.style          = CS_HREDRAW | CS_VREDRAW;
     
        RegisterClass(&wc);
     
        return Principal(hInstance, nCmdShow);
    }
     
    void Bouton1()
    {
     // 200 lignes de code
    }
     
    void Bouton2()
    {
     // 200 lignes de code
    }
     
    int Principal(HINSTANCE hInstance, int nCmdShow)
    {
        HWND hWnd;
        MSG msg;
        HWND hWndB1;
        HWND hWndB2;
     
        hWnd = CreateWindow("Classe 1", "Notre première fenêtre", WS_OVERLAPPEDWINDOW,100, 100, 600, 300, NULL,NULL,hInstance,NULL);
        hWndB1 = CreateWindow("BUTTON", "OK1", WS_CHILD | WS_VISIBLE, 100,100, 100,24, hWnd, (HMENU)1, hInstance, NULL);
        hWndB2 = CreateWindow("BUTTON", "OK2", WS_CHILD | WS_VISIBLE, 200,200, 100,24, hWnd, (HMENU)2, hInstance, NULL);
        ShowWindow(hWnd, nCmdShow);
     
    	while (GetMessage(&msg, NULL, 0, 0))
        {
     
    	  switch msg.hwnd // Je recupere le message, je ne sait encore pas trop comment
    	  {
     
    	   case hWndB1 // On a cliqué sur le bouton OK1
     
    		Bonton1(); 
     
    	   case hWndB2 // On a cliqué sur le bouton OK2
     
    		Bonton2(); 
     
    	   case WM_DESTROY: // On a fermé la fenetre, enfin si je peux recuperer l'evenement de cette maniere ???
     
            PostQuitMessage(0);
            break;
    	  }
    	}
        }

  6. #6
    Membre Expert
    Avatar de prgasp77
    Homme Profil pro
    Ingénieur en systèmes embarqués
    Inscrit en
    Juin 2004
    Messages
    1 306
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Eure (Haute Normandie)

    Informations professionnelles :
    Activité : Ingénieur en systèmes embarqués
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Juin 2004
    Messages : 1 306
    Par défaut
    Citation Envoyé par andrebernard Voir le message
    Non ma seule question est de ne pas mettre les evenements dans la callback si l'on est pas obligé parfois peut aussi soulager un code.
    Tente et tu verra bien ^^ Dans la majorité des cas simples cela n'a pas de grande influence.

    Citation Envoyé par andrebernard Voir le message
    Imagine que tu ai une fenetre avec quelques boutons et un controle String
    Le nombre d'evenements pouvant se produire est extremement reduit.
    En réalité, la simple existance d'une fenêtre implique pas mal d'évènements, mais la plupart (repaint/resize/move/mousemouve/...) ne t'intéressent pas.

    Le meilleur conseil que je puisse te donner est : fais des essais et prends tes aises. Tu finira rapidement par comprendre les avantages et désavantages des callbacks à la win32. Une fois cela fait, j'essaierai de te convertir à Qt ou GTK xD

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

Discussions similaires

  1. Gestion des evenements d'un Menu
    Par juk dans le forum AWT/Swing
    Réponses: 1
    Dernier message: 05/12/2006, 16h37
  2. Gestion des evenements avec la SDL
    Par gusgus dans le forum Ogre
    Réponses: 5
    Dernier message: 01/11/2006, 10h47
  3. Réponses: 3
    Dernier message: 25/08/2006, 23h11
  4. Réponses: 11
    Dernier message: 15/02/2006, 14h45
  5. [C#] Gestion des evenements
    Par zebulix13 dans le forum Windows Forms
    Réponses: 2
    Dernier message: 12/06/2004, 18h40

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