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

wxWidgets Discussion :

Un wxTextCtrl qui respecte la barre d'état


Sujet :

wxWidgets

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Février 2006
    Messages
    107
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Février 2006
    Messages : 107
    Points : 61
    Points
    61
    Par défaut Un wxTextCtrl qui respecte la barre d'état
    Bonjour.

    J'écris un programme qui commence par ouvrir un wxFrame de largeur 640 et de hauteur 480, comportant une barre de menus et une barre d'état. Le programme ne prescrit pas la hauteur de ces deux barres, parce qu'il me semble que ce n'est pas prévu.
    Ensuite, il faut ajouter un wxTextCtrl qui doit occuper
    1° toute la largeur du wxFrame
    2° la hauteur libre entre la barre de menus et la barre d'état.

    J'ai essayé ceci (dans une fonction membre d'une classe dérivée de wxFrame) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
      wxBoxSizer* Sizer1 = new wxBoxSizer(wxVERTICAL);
      SetSizer(Sizer1);
      ptrZoneTexte = new wxTextCtrl(this, ID_ZONETEXTE, wxEmptyString,
                         wxDefaultPosition, wxSize(640, 480),
                         wxTE_MULTILINE | wxTE_PROCESS_ENTER | wxTE_RICH | wxTE_NOHIDESEL);
      Sizer1->Add(ptrZoneTexte, 1, wxEXPAND, 0);
    mais, comme on peut s'y attendre, le wxTextCtrl cache la barre d'état quand le wxFrame apparaît, puisqu'on lui attribue une hauteur (480) égale à celle du wxFrame.
    Si on actionne deux fois (en sens inverses, donc) le petit bouton de redimensionnement en haut à droite du wxFrame (je travaille sous Windows), le résultat est satisfaisant : le wxTextCtrl n'empiète plus sur la barre d'état.

    J'aimerais obtenir ce résultat dès l'apparition du wxTextCtrl.
    On pourrait évidemment attribuer au wxTextCtrl une hauteur un peu plus petite que 480, en tenant compte de la hauteur des barres de menu et d'état (et aussi de titre ?), mais puisque, si je comprends bien, on ne peut pas prévoir avec certitude la hauteur de ces barres, cela me semble du chipotage.

    Quelqu'un peut-il m'aider (et me dire si j'ai eu raison de recourir à un "sizer", et à un "sizer" vertical) ?

    Merci d'avance.
    M.

    P.S. J'ai "édité" parce que j'avais chaque fois mis "barre de tâches" au lieu de "barre d'état".

  2. #2
    Membre éclairé

    Profil pro
    Inscrit en
    Septembre 2006
    Messages
    717
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2006
    Messages : 717
    Points : 858
    Points
    858
    Par défaut
    Un simple
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    new wxTextCtrl(this, ID_ZONETEXTE, wxEmptyString,
                         wxDefaultPosition, wxDefaultSize,
                         wxTE_MULTILINE | wxTE_PROCESS_ENTER | wxTE_RICH | wxTE_NOHIDESEL);
    devrait suffire ici, pas besoin de sizer, le control va prendre tout seul toute la surface disponible.

  3. #3
    Membre du Club
    Profil pro
    Inscrit en
    Février 2006
    Messages
    107
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Février 2006
    Messages : 107
    Points : 61
    Points
    61
    Par défaut
    Citation Envoyé par Sylvain Togni
    Un simple
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    new wxTextCtrl(this, ID_ZONETEXTE, wxEmptyString,
                         wxDefaultPosition, wxDefaultSize,
                         wxTE_MULTILINE | wxTE_PROCESS_ENTER | wxTE_RICH | wxTE_NOHIDESEL);
    devrait suffire ici, pas besoin de sizer, le control va prendre tout seul toute la surface disponible.
    Merci d'avoir répondu.
    J'avais essayé cette solution, mais bizarrement, elle ne dimensionne pas le wxTextCtrl de la même façon dans le premier Frame de la session et dans le second. Et pourtant les deux frames sont identiques.
    Dans le premier Frame, j'obtiens un wxTextCtrl de deux lignes et d'une largeur qui est peut-être 1/6 de la largeur de l'application. Dans le second Frame, le wxTextCtrl occupe toute la place entre la barre de menus et la barre d'état.

    (Dans le premier Frame, si l'utilisateur actionne deux fois le petit bouton de redimensionnement au-dessus à droite de la fenêtre, le résultat devient correct: le wxTextCtrl occupe toute la place entre la barre de menus et la barre d'état.)

    Si ça intéresse quelqu'un, je veux bien mettre le programme en ligne...

    Cordialement,
    M.

  4. #4
    Membre du Club
    Profil pro
    Inscrit en
    Février 2006
    Messages
    107
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Février 2006
    Messages : 107
    Points : 61
    Points
    61
    Par défaut
    Bonjour.
    Je mets en ligne un petit programme unifichier (GUI Ansi Static écrit à l'aide de Dev-C++) qui montre ce qui me semble bizarre dans le paramètre wxDefaultSize de wxTexCtrl.
    (Je n'ai rien prévu pour la fermetures des fenêtres, parce que je suppose qu'il y a toujours la croix de multiplication qui permet de fermer. A toutes fins utiles, je travaille sous Windows XP, avec une résolution de 1024 x 768.)
    Quand j'exécute ce programme, je reçois d'abord une fenêtre munie d'une barre d'état et d'une barre de menus avec un unique menu "Texte".
    Si dans ce menu, je choisis d'abord l'item "Ici", une zone de texte s'ajoute à la fenêtre déjà ouverte.
    Jusqu'ici, tout est normal, sauf que la zone de texte n'occupe pas (comme cela devrait être, je suppose, vu le paramètre wxDefaultSize) toute la place disponible entre la barre de menus et la barre d'état, loin de là : elle n'a que deux lignes de hauteur et, comme largeur, peut-être 1/6 de la largeur de la fenêtre.
    Si maintenant je choisis dans le menu "Texte" l'item "Ailleurs", une nouvelle fenêtre est créée avec une zone de texte qui, cette fois, a les bonnes dimensions.
    Merci d'avance si quelqu'un peut donner une explication ou seulement confirmer qu'il a le même problème en exécutant ce programme. (Je ne suis pas très sûr de ma plate-forme pour ce qui est du fenêtrage...)
    M.

    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
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
     
    #if defined(__GNUG__) && !defined(__APPLE__)
    #pragma implementation "monEditeurAnsiStaticApp.h"
    #endif
     
    // For compilers that support precompilation, includes "wx/wx.h".
    #include "wx/wxprec.h"
     
    #ifdef __BORLANDC__
    #pragma hdrstop
    #endif
     
    #ifndef WX_PRECOMP
    #include "wx/wx.h"
    #endif
     
    #include <wx/string.h>
    #include <wx/msgdlg.h> // Pour la fonction wxMessageBox
    #include <wx/textctrl.h> // Pour la classe wxTextCtrl
     
     
    class MonEditeurAnsiStaticApp: public wxApp
    {
       public:
          MonEditeurAnsiStaticApp();
          virtual bool OnInit();
    };
     
    DECLARE_APP(MonEditeurAnsiStaticApp);
     
    class MonEditeurAnsiStaticFrame: public wxFrame
    {
     
       public:
     
          MonEditeurAnsiStaticFrame(wxWindow* parent, wxWindowID id = -1,
                     const wxString& caption = _("Mon éditeur Ansi Static"),
                     const wxPoint& pos = wxDefaultPosition,
                     const wxSize& size = wxDefaultSize,
                     long style = wxDEFAULT_FRAME_STYLE);
     
          ~MonEditeurAnsiStaticFrame();
     
        protected:
          void CreerBarreMenus();
          void CreerBarreDEtat();
          void CreerZoneTexte();
     
          void QuidItemTexteIci(wxCommandEvent& event);
          void QuidItemTexteAilleurs(wxCommandEvent& event);
     
        private:
          enum {ID_STATUSBAR=wxID_HIGHEST+1,ID_ITEMMENU_TEXTE_ICI,
                  ID_ITEMMENU_TEXTE_AILLEURS, ID_ZONETEXTE};
          wxMenu* m_MenuTexte;
          wxTextCtrl* ptrZoneTexte;
    };
     
     
    ///////////////////////////////////////
    IMPLEMENT_APP(MonEditeurAnsiStaticApp)
     
    MonEditeurAnsiStaticApp::MonEditeurAnsiStaticApp() : wxApp()
    {
    // D'office, il y a un appel au constructeur de la classe de base (Dupin, p. 231-233).
    }
     
    bool MonEditeurAnsiStaticApp::OnInit()
    {
       wxApp::OnInit();
     
       MonEditeurAnsiStaticFrame* mainWindow = new MonEditeurAnsiStaticFrame(NULL);
    // Pourquoi le paramètre NULL ? (J'ai imité Fred Cailleau-Lepetit).
       mainWindow->SetSize(wxSize(640, 480));
       mainWindow->Show(true);
     
       return true;
    }
     
    MonEditeurAnsiStaticFrame::MonEditeurAnsiStaticFrame(wxWindow* parent, wxWindowID id, const wxString& caption,
                               const wxPoint& pos, const wxSize& size, long style)
    {
     
      wxFrame::Create(parent, id, caption, pos, size, style); // Ce n'est sans doute pas
    // un bon usage de Create(), mais peu importe.
     
      CreerBarreMenus();
      CreerBarreDEtat();
      Connect(ID_ITEMMENU_TEXTE_ICI, wxEVT_COMMAND_MENU_SELECTED, wxCommandEventHandler(MonEditeurAnsiStaticFrame::QuidItemTexteIci));
      Connect(ID_ITEMMENU_TEXTE_AILLEURS, wxEVT_COMMAND_MENU_SELECTED, wxCommandEventHandler(MonEditeurAnsiStaticFrame::QuidItemTexteAilleurs));
    }
     
     
     
    MonEditeurAnsiStaticFrame::~MonEditeurAnsiStaticFrame()
    {
    }
     
    void MonEditeurAnsiStaticFrame::CreerBarreMenus()
    {
      wxMenuBar* barreMenus = new wxMenuBar;
      m_MenuTexte = new wxMenu;
      m_MenuTexte->Append(ID_ITEMMENU_TEXTE_ICI, _("&Ici"));
      m_MenuTexte->Append(ID_ITEMMENU_TEXTE_AILLEURS, _("&Ailleurs"));
      barreMenus->Append(m_MenuTexte, _("&Texte"));
      SetMenuBar(barreMenus);
    }
     
    void MonEditeurAnsiStaticFrame::CreerBarreDEtat()
    {
       wxStatusBar* BarreDEtat = new wxStatusBar(this, ID_STATUSBAR,
                                                wxST_SIZEGRIP|wxNO_BORDER);                                            
       BarreDEtat->SetFieldsCount(3);
       SetStatusBar(BarreDEtat);
    }
     
    void MonEditeurAnsiStaticFrame::QuidItemTexteIci(wxCommandEvent& event)
    {
     
      MonEditeurAnsiStaticFrame * ptrSurFenetre;
      SetTitle(wxString("Résultat dans la fenêtre initiale."));
      ptrSurFenetre = this;
      ptrSurFenetre->CreerZoneTexte();
    }
     
     
    void MonEditeurAnsiStaticFrame::QuidItemTexteAilleurs(wxCommandEvent& event)
    {
      MonEditeurAnsiStaticFrame * ptrSurFenetre;
      ptrSurFenetre = new MonEditeurAnsiStaticFrame(NULL);
      ptrSurFenetre->SetSize(wxSize(640, 480));
      ptrSurFenetre->SetTitle(wxString("Résultat dans la nouvelle fenêtre.") );
      ptrSurFenetre->Show(true);
      ptrSurFenetre->CreerZoneTexte();
    }
     
     
    void MonEditeurAnsiStaticFrame::CreerZoneTexte()
    {
      ptrZoneTexte = new wxTextCtrl(this, ID_ZONETEXTE, wxEmptyString,
                         wxDefaultPosition, wxDefaultSize,
                         wxTE_MULTILINE | wxTE_PROCESS_ENTER | wxTE_RICH | wxTE_NOHIDESEL);
    }

  5. #5
    Membre éclairé

    Profil pro
    Inscrit en
    Septembre 2006
    Messages
    717
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2006
    Messages : 717
    Points : 858
    Points
    858
    Par défaut
    Tu peux mettre GetClientSize() à la place de wxDefaultSize, cela devrait résoudre le problème.

  6. #6
    Membre du Club
    Profil pro
    Inscrit en
    Février 2006
    Messages
    107
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Février 2006
    Messages : 107
    Points : 61
    Points
    61
    Par défaut
    Citation Envoyé par Sylvain Togni
    Tu peux mettre GetClientSize() à la place de wxDefaultSize, cela devrait résoudre le problème.
    En effet, cela semble marcher tout à fait bien !
    Et le comportement bizarre de wxDefaultSize ? Bug ou fonctionnalité ?
    En tout cas, grand merci.
    M.

  7. #7
    Rédacteur

    Avatar de Davidbrcz
    Homme Profil pro
    Ing Supaéro - Doctorant ONERA
    Inscrit en
    Juin 2006
    Messages
    2 307
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 32
    Localisation : Suisse

    Informations professionnelles :
    Activité : Ing Supaéro - Doctorant ONERA

    Informations forums :
    Inscription : Juin 2006
    Messages : 2 307
    Points : 4 732
    Points
    4 732
    Par défaut
    wxDefaultSize vaut (-1, -1)
    Ce n'est donc pas un bug.
    "Never use brute force in fighting an exponential." (Andrei Alexandrescu)

    Mes articles dont Conseils divers sur le C++
    Une très bonne doc sur le C++ (en) Why linux is better (fr)

  8. #8
    Membre du Club
    Profil pro
    Inscrit en
    Février 2006
    Messages
    107
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Février 2006
    Messages : 107
    Points : 61
    Points
    61
    Par défaut
    Citation Envoyé par Davidbrcz
    wxDefaultSize vaut (-1, -1)
    Ce n'est donc pas un bug.
    Vous pourriez expliquer ça ? Merci d'avance.
    M.

  9. #9
    Rédacteur

    Avatar de Davidbrcz
    Homme Profil pro
    Ing Supaéro - Doctorant ONERA
    Inscrit en
    Juin 2006
    Messages
    2 307
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 32
    Localisation : Suisse

    Informations professionnelles :
    Activité : Ing Supaéro - Doctorant ONERA

    Informations forums :
    Inscription : Juin 2006
    Messages : 2 307
    Points : 4 732
    Points
    4 732
    Par défaut
    la doc parlera mieux que moi :
    http://www.wxwidgets.org/manuals/sta...ml#wxframector
    Partie size.
    "Never use brute force in fighting an exponential." (Andrei Alexandrescu)

    Mes articles dont Conseils divers sur le C++
    Une très bonne doc sur le C++ (en) Why linux is better (fr)

  10. #10
    Membre du Club
    Profil pro
    Inscrit en
    Février 2006
    Messages
    107
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Février 2006
    Messages : 107
    Points : 61
    Points
    61
    Par défaut
    Citation Envoyé par Davidbrcz
    la doc parlera mieux que moi :
    http://www.wxwidgets.org/manuals/sta...ml#wxframector
    Partie size.
    Merci. J'ai regardé la doc : autant dire qu'on ne peut compter sur rien quand on utilise wxDefaultSize.
    M.

  11. #11
    Rédacteur

    Avatar de Davidbrcz
    Homme Profil pro
    Ing Supaéro - Doctorant ONERA
    Inscrit en
    Juin 2006
    Messages
    2 307
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 32
    Localisation : Suisse

    Informations professionnelles :
    Activité : Ing Supaéro - Doctorant ONERA

    Informations forums :
    Inscription : Juin 2006
    Messages : 2 307
    Points : 4 732
    Points
    4 732
    Par défaut
    Exactement.
    C'est pour cela qu'il faut mieux se défnir un truc du genre :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    #define MyDefaultSize wxSize(X,Y)
    "Never use brute force in fighting an exponential." (Andrei Alexandrescu)

    Mes articles dont Conseils divers sur le C++
    Une très bonne doc sur le C++ (en) Why linux is better (fr)

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

Discussions similaires

  1. la barre d'état...
    Par zarbiman dans le forum IHM
    Réponses: 3
    Dernier message: 14/06/2005, 08h56
  2. Réponses: 20
    Dernier message: 01/06/2005, 09h37
  3. Affichage d'un texte dans la barre d'état!
    Par chuart dans le forum Balisage (X)HTML et validation W3C
    Réponses: 7
    Dernier message: 12/04/2005, 12h47
  4. Pb d'affichage dans barre d'état
    Par linou dans le forum Général JavaScript
    Réponses: 2
    Dernier message: 01/04/2005, 11h21
  5. Réponses: 8
    Dernier message: 20/12/2004, 17h42

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