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 :

Position par rapport au bureau et non à la fenêtre ! o_O


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 Position par rapport au bureau et non à la fenêtre ! o_O
    Bonjour,

    Prenant une petite pause conçernant mon gros projet de lecteur mp3 (un bug graphique impossible à résoudre conçernant le visualiseur), j'ai décidé de faire un petit programme de gestion de la BDR. Seulement, je ne sais pas pourquoi (je deviens dingue), les positions des contrôles sont par rapport au bureau !

    Je m'explique : le bouton que j'ai créé s'affiche bien dans la fenêtre (j'ai mis pas mal de temps à le voir) mais le fait que sa position soit aléatoire m'a mis la puce à l'oreille... en fait, vu que la position de la fenêtre parent (et principale) est en CW_USEDEFAULT, et donc aléatoire (enfin qui change pour la cascade quoi....), elle permettait d'apercevoir de temps à autre le bouton qui lui, est fixé à la position par rapport au bureau.

    C'est assez difficile à expliquer, comme si le bouton était "accroché" à une position définie sur le bureau (mais non visible puisque la fenêtre n'était pas dessus), et que l'on le voyait seulement s'il rentrait dans la zone active de la fenêtre...

    Conclusion : le bouton est créé et bien affiché dans la fenêtre (on peut le voir en agrandissant la fenêtre), mais aux positions normalement prévues pour le bureau. Le système métrique change alors. Vraiment bizarre...

    Quelqu'un peut m'aider ?

    Voici le code (sans MFC, j'ai quand même voulu utiliser des classes pour les onglets, sinon c'était "le bordel") :
    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
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    #include <windows.h>
    #include <commctrl.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)
    {
        static HWND hTabs = NULL;
        static IconsTab iconsTab(hwnd);
    
        switch (message)
        {
            case WM_CREATE:
                TC_ITEM tci;
    
                InitCommonControls();
    
                hTabs = CreateWindowEx(0 , WC_TABCONTROL, "",
                                       WS_CHILD | WS_VISIBLE,
                                       0, 0, 536, 341, hwnd, 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.show(true);
    
                return 0;
    
            case WM_DESTROY:
                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
    #ifndef INTERFACE_H
    #define INTERFACE_H
    
    #include <windows.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];
    
            HWND _parentWindow;
    };
    
    #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
    #include "Interface.h"
    
    extern HINSTANCE hInst;
    
    IconsTab::IconsTab(HWND parent) : _parentWindow(parent)
    {
        _buttons[0] = CreateWindow("BUTTON",
                                  #ifdef ENGLISH
                                  "Apply"
                                  #elif defined FRENCH
                                  "Appliquer"
                                  #endif
                                  ,
                                  BS_PUSHBUTTON | WS_CHILD,
                                  620, 300,
                                  #ifdef ENGLISH
                                  70
                                  #elif defined FRENCH
                                  14*8
                                  #endif
                                  , 30,
                                  _parentWindow,
                                  (HMENU)NULL,
                                  hInst,
                                  NULL);
    }
    
    void IconsTab::show(bool state)
    {
        ShowWindow(_buttons[0], (state==true)?SW_SHOW:SW_HIDE);
    
        return;
    }
    Sans bien sûr parler du manifest.h et resource.rc permettant l'affichage "windows XP style".

    Merci d'avance.

    P.S : Je précise que le contrôle Tab s'affiche correctement aux coordonnées voulues (c'est à dire (0;0)). Cela vient t il de la gestion de la classe ? Soyez indulgent, je suis fatigué et étourdi en ce moment

    [edit] Je confirme, il s'agit de l'implémentation en classes... sans, tout marche. Je ne peux tout de même pas me passer de ceci ! Pourquoi ???
    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 519
    Points
    41 519
    Par défaut
    Je dois avouer que j'ai des doutes sur la construction:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    static IconsTab iconsTab(hwnd);
    À mon avis, il ne faut pas que tu mettes ça en statique. Tu peux à la rigueur utiliser un pointeur et l'instancier dans le traitement de WM_CREATE, par contre...
    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
    Mais si je ne le met pas en static, la variable sera de toute façon supprimée à la fin du callback non ? Et comme elle détient des handles de contrôles, ils seront remplis dans le WM_CREATE (instanciation) mais au deuxième passage, ne passant pas dans le WM_CREATE, la variable sera inexploitable, et les contrôles invisibles puisque pas créés...

    Ai-je tort ?

    [edit] Bon je l'ai quand même fait... et effectivement, après avoir encore plus encapsulé le tout, j'ai un contrôle qui marche !
    J'explique : j'ai créé plutôt une classe Tabs qui contient con constructeur, une méthode permettant de changer d'onglet, et les onglets en question en private.
    Au début, j'avais mis son instanciation en static, et j'avais le même problème pour les onglets. Mais maintenant que je fonctionne par pointeurs, seuls les onglets sont bien mis ! Pourquoi la deuxième couche ne marche pas ?

    Voici le code en question :
    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
    #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_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
    #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);
            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
    #include "Interface.h"
    
    extern HINSTANCE hInst;
    
    void Tabs::changeTab(int selection)
    {
        switch(selection)
        {
            case 0:
                _icons.show(true);
                break;
            default:
                return;
        }
        return;
    }
    
    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,
                                  620, 300,
                                  #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;
    }
    Pouvez vous me dire ce qui ne va pas maintenant ?

    Merci d'avance.
    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 519
    Points
    41 519
    Par défaut
    Je pense que je manque un peu d'informations ici.
    Quand j'ai moi-même fait des classes pour cela, j'ai suivi un peu le principe de MFC : En faire aussi peu que possible dans le constructeur, et utiliser une fonction membre pour faire le CreateWindow() au bon moment...
    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
    Penses tu que cela vienne du constructeur ? A ce moment là, dois je plutôt faire une liste d'initialisation du handle de la fenêtre parent dans un membre privé, et l'utiliser pour créer les contrôles ultérieurement ?

    Bon d'accord je vais essayer. Mais cela me paraît assez bizarre...

    [edit] En fait j'avais des coordonnées (que j'avais changé pour faire des tests) fausses, ce qui me faisait penser que cela ne marchait pas... En fait si, même avec le constructeur.
    Mais j'avais réellement ce problème, qui a été réglé par l'instanciation par pointeur. J'aimerais bien comprendre quand même ... quelqu'un a une idée ?
    Vive l'embarqué.

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

Discussions similaires

  1. [XL-2007] Recherche d'une position par rapport a une valeur
    Par 0x44-0x43-0x53-0x43 dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 03/02/2010, 11h17
  2. Position par rapport à l'écran
    Par Rifton007 dans le forum VB.NET
    Réponses: 6
    Dernier message: 20/05/2009, 14h09
  3. Réponses: 5
    Dernier message: 22/12/2008, 23h59
  4. Position d'un bloc par rapport au bord gauche de la fenêtre
    Par Lindorie dans le forum Général JavaScript
    Réponses: 18
    Dernier message: 27/08/2007, 12h04
  5. background positionné par rapport à l'écran et non au cadre
    Par muaddibx dans le forum Mise en page CSS
    Réponses: 2
    Dernier message: 30/03/2007, 11h48

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