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

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    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
    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 émérite

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

    Informations forums :
    Inscription : Septembre 2006
    Messages : 717
    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 confirmé
    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
    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 confirmé
    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
    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 émérite

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

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

  6. #6
    Membre confirmé
    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
    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.

+ 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