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 :

[C++ non MFC] Impossible de détecter un changement d'onglets (rapport d'erreur)


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 [C++ non MFC] Impossible de détecter un changement d'onglets (rapport d'erreur)
    Bonjour,

    Pour vous faire une idée en premier lieu, voici mon code :
    main.cpp:
    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
    #include <windows.h>
    
    #include "constants.h"
    #include "Interface.h"
    
    HINSTANCE hInst;
    
    int WINAPI WinMain (HINSTANCE hThisInstance,
                         HINSTANCE hPrevInstance,
                         LPSTR lpszArgument,
                         int nFunsterStil)
    {
        HWND hwnd;
        MSG messages;
        WNDCLASSEX wincl;
    
        hInst = hThisInstance;
    
        wincl.hInstance = hThisInstance;
        wincl.lpszClassName = NAME;
        wincl.lpfnWndProc = WindowProcedure;
        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)(1 + COLOR_BTNFACE);
    
        if (!RegisterClassEx (&wincl))
            return 0;
    
        hwnd = CreateWindowEx (
               0,
               NAME,
               NAME,
               WS_OVERLAPPEDWINDOW,
               CW_USEDEFAULT,
               CW_USEDEFAULT,
               542,
               373,
               HWND_DESKTOP,
               NULL,
               hThisInstance,
               NULL
               );
    
        ShowWindow (hwnd, nFunsterStil);
    
        while (GetMessage (&messages, NULL, 0, 0))
        {
            TranslateMessage(&messages);
            DispatchMessage(&messages);
        }
    
        return messages.wParam;
    }
    
    LRESULT CALLBACK WindowProcedure (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
    {
        Tabs *tabs;
    
        switch (message)
        {
            case WM_CREATE:
                tabs = new Tabs(hwnd);
                tabs->changeTab(0);
    
                return 0;
    
            case WM_NOTIFY:
            {
                LPNMHDR pnmhdr = (LPNMHDR)lParam  ;
                
                if(pnmhdr->code == TCN_SELCHANGE && tabs->whichOneSelected()==0)
                    tabs->changeTab(0);
                    
                if(pnmhdr->code == TCN_SELCHANGE && tabs->whichOneSelected()==1)
                    tabs->changeTab(1);
                    
                if(pnmhdr->code == TCN_SELCHANGE && tabs->whichOneSelected() == 2)
                    tabs->changeTab(2);
            }
            return 0;
    
    
            case WM_DESTROY:
                delete tabs;
                PostQuitMessage (0);
                break;
    
            default:
                return DefWindowProc (hwnd, message, wParam, lParam);
        }
    
        return 0;
    }
    Interface.h:
    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
    #ifndef INTERFACE_H
    #define INTERFACE_H
    
    #include <windows.h>
    #include <commctrl.h>
    
    #include "constants.h"
    
    class IconsTab
    {
        public:
            IconsTab(HWND);
            void show(bool);
    
        private:
            HWND _etchedFrames[3];
            HWND _icon;
            HWND _path;
            HWND _extension;
            HWND _buttons[2];
    };
    
    class Tabs
    {
        public:
            Tabs(HWND);
    
            int whichOneSelected();
            void changeTab(int);
    
        private:
            IconsTab _icons;
            HWND _hTabs;
    
    };
    
    #endif
    Interface.cpp:
    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 "Interface.h"
    
    extern HINSTANCE hInst;
    
    void Tabs::changeTab(int selection)
    {
        switch(selection)
        {
            case 0:
                _icons.show(false);
                break;
            case 1:
                _icons.show(true);
                break;
            case 2:
                _icons.show(false);
                break;
        }
        return;
    }
    
    int Tabs::whichOneSelected()
    {
        return TabCtrl_GetCurSel(_hTabs);
    }
    
    Tabs::Tabs(HWND parent) : _icons(parent)
    {
        TC_ITEM tci;
    
        InitCommonControls();
    
        _hTabs = CreateWindowEx(0 , WC_TABCONTROL, "",
                               WS_CHILD | WS_VISIBLE,
                               0, 0, 536, 341, parent, NULL, hInst, NULL);
    
        tci.mask = TCIF_TEXT;
    
        tci.pszText =
        #ifdef ENGLISH
        "Startup"
        #elif defined FRENCH
        "Démarrage"
        #endif
        ;
        TabCtrl_InsertItem(_hTabs, 1, &tci);
    
        tci.pszText =
        #ifdef ENGLISH
        "Icons"
        #elif defined FRENCH
        "Icônes"
        #endif
        ;
        TabCtrl_InsertItem(_hTabs, 2, &tci);
    
        tci.pszText = "Associations";
        TabCtrl_InsertItem(_hTabs, 3, &tci);
    };
    
    IconsTab::IconsTab(HWND parent)
    {
        _buttons[0] = CreateWindow("BUTTON",
                                  #ifdef ENGLISH
                                  "Apply"
                                  #elif defined FRENCH
                                  "Appliquer"
                                  #endif
                                  ,
                                  BS_PUSHBUTTON | WS_CHILD,
                                  50, 100,
                                  #ifdef ENGLISH
                                  70
                                  #elif defined FRENCH
                                  14*8
                                  #endif
                                  , 30,
                                  parent,
                                  (HMENU)NULL,
                                  hInst,
                                  NULL);
    }
    
    void IconsTab::show(bool state)
    {
        ShowWindow(_buttons[0], (state==true)?SW_SHOW:SW_HIDE);
    
        return;
    }
    En fait, j'ai remarqué que n'importe quelle action sur _hTabs, que cela soit directement TabCtrl_GetCurSel sur ce membre au préalable mis en public, ou encore par le biais d'une méthode etc..., plantait lamentablement. J'aimerais savoir pourquoi... pourtant, il est bien rempli ... Cela vient obligatoirement de l'implémentation C++ en classes puisqu'un code de ce même site, tout bête, marche parfaitement.

    Que faire ?

    Merci d'avance.
    Vive l'embarqué.

  2. #2
    mat.M
    Invité(e)
    Par défaut
    Tu initialises h_tabs avec CreateWindows mais tu ne testes pas si l'appel à la fonction a réussi ou non.

  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
    Elle a forcément réussi, puisque l'onglet est affiché non ? Ou alors... ah cela voudrait dire que createwindow créée et affiche le contrôle, et permet de le manier en retournant un handle ?

    Bref, que faire pour que _hTabs soit rempli ?

    [edit] Non c'est obligatoirement rempli, puisque les onglets sont rajoutés en utilisant _hTabs, et ils sont effectivement affichés.

    [reedit] Non plus. Après un test, en envoyant le message WM_DESTROY s'il était égal à NULL, j'ai pu remarquer qu'il ne quittait pas, ce qui prouve la validité de _hTabs.
    Vive l'embarqué.

  4. #4
    mat.M
    Invité(e)
    Par défaut
    Tu initialises h_tabs avec CreateWindows mais tu ne testes pas si l'appel à la fonction a réussi ou non.


    extern HINSTANCE hInst;
    >>> l'intérêt du C++ c'est justement d'éviter les variables globales comme on les déclarait en C.
    Pourquoi ne pas déclarer une HINSTANCE membre de CTabs et passer hInst initialisée lors du WinMain au contructeur de CTab ?

  5. #5
    mat.M
    Invité(e)
    Par défaut
    Je ne peux pas trop te répondre ; il faudrait tout décortiquer le code .
    Mettre des points d'arrêts là où c'est nécessaire

  6. #6
    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
    Un problème à la fois, voulez vous ?
    Il se trouve que cela vienne obligatoirement pas de l'instance... une variable globale ne pose obligatoirement pas de problèmes... (je l'ai mise globale puisque l'instance est utilisée partout, cela sera la seule.)


    J'ai déjà pas mal décortiqué le code, et à part retirer l'orientation objet, je ne vois pas comment y remédier...
    Et moi qui voulais me détendre sur un projet simple après les gros problèmes de NeoBlast...
    Vive l'embarqué.

  7. #7
    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 519
    Points
    41 519
    Par défaut
    C'est normal, que le POINTEUR tabs ne soit pas static ?

    Je n'ai jamais dit dans l'autre topic qu'un pointeur ne devait absolument pas être static, j'ai seulement dit ça des objets eux-mêmes qui devaient être alloués dynamiquement...
    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.

  8. #8
    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
    Ahhh d'accord j'avais compris qu'il fallait retirer le static ... je ne comprenais pas (c'était déjà le sujet du dernier post de mon autre topic) puisqu'il était supprimé à chaque nouveau passage. Merci, maintenant que je suis rassuré dans ma vision des choses (je ne comprenais plus sans le static... cela remettait en cause ce que je comprenais) et que j'ai remis le static, cela marche parfaitement.

    Merci encore. Toujours réponse à tout pas vrai ?
    Vive l'embarqué.

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

Discussions similaires

  1. détecter un changement d'onglet sur une TabControl
    Par ines4251 dans le forum Windows Forms
    Réponses: 3
    Dernier message: 09/02/2010, 10h03
  2. [JTabbedPane] Comment détecter le changement des onglets
    Par sinpay dans le forum Composants
    Réponses: 4
    Dernier message: 17/09/2009, 07h49
  3. Réponses: 6
    Dernier message: 26/09/2007, 10h55
  4. [JTabbedPane] détecter le changement d'onglet
    Par Invité dans le forum AWT/Swing
    Réponses: 1
    Dernier message: 31/08/2006, 10h20
  5. Réponses: 6
    Dernier message: 14/02/2003, 16h52

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