Probleme mit wxSizer



  • Hallo Forum

    Habe auf einem Frame ein Panel in einem Sizer. Das soll sich beim Grösse verändern des Fensters nicht verändern, aber auf Userwunsch (mit SetSize).
    Das Problemist, das sich das restliche Layout nicht anpasst, dh entweder ist es zu gross oder zu klein.

    Hier ein Minitest:

    helloFrame::helloFrame(wxFrame *frame, const wxString& title)
        : wxFrame(frame, -1, title)
    {
        m_field = new FieldPanel( 10, this );
    
        m_stats = new wxTextCtrl( this,
                                  -1,
                                  _( "" ),
                                  wxDefaultPosition,
                                  wxDefaultSize,
                                  wxTE_MULTILINE | wxTE_BESTWRAP
                                );
    
        wxBoxSizer* top_sizer   = new wxBoxSizer( wxVERTICAL );
    
        wxBoxSizer* upper_sizer = new wxBoxSizer( wxHORIZONTAL );
        upper_sizer->Add( m_field, wxSizerFlags(0).Border( wxALL, 5 ) );
    
        wxStaticBoxSizer* control_sizer
            = new wxStaticBoxSizer( wxVERTICAL, this, _("Control") );
        control_sizer->Add( new wxButton( this, 0, _("OK") ),
                            wxSizerFlags(0).Left().Border( wxALL, 5 ) );
        control_sizer->Add( new wxButton( this, 0, _("Cancel") ),
                            wxSizerFlags(0).Left().Border( wxALL, 5 ) );
    
        upper_sizer->Add( control_sizer,
                          wxSizerFlags(1).Center().Expand().Border( wxALL, 5 ) );
    
        wxBoxSizer* lower_sizer = new wxBoxSizer( wxHORIZONTAL );
        lower_sizer->Add( m_stats, wxSizerFlags(1).Expand().Border( wxALL, 5 ) );
    
        top_sizer->Add( upper_sizer,
                        wxSizerFlags(0).Left().Expand().Border( wxALL, 5 ) );
        top_sizer->Add( lower_sizer,
                        wxSizerFlags(1).Left().Expand().Border( wxALL, 5 ) );
    
        SetSizer( top_sizer );
        Fit();
        // Bis hier alles gut
    
        // Grösse ändern
        m_field->set_field_size( 20 );
        // Ab hier haperts
        Fit();
        // Hab auch schon 
        // top_sizer->SetSizeHints( this );
        // und
        // Layout();
        // probiert
    }
    /**********************************************************************/
    void FieldPanel::set_field_size( int size )
    {
        m_fields_size = size;
        m_size = m_fields_count * m_fields_size + 2 * m_fields_space;
        SetSize( m_size, m_size );
    }
    

    Was muss ich tun, damit das Layout neu berechnet wird?


  • Mod

    Du musst beim Frame danach nochmals Fit/Layout aufrufen.



  • Das funktioniert nicht, die Grösse ändert sich nicht. 😞



  • Ich weiss geht nicht ist keine Fehlerbeschreibung.
    Aber ich hab so ziemlich alles probiert, was ich in den Docs und anderen Tutorials gefunden hab. Das Panel behält seine ursprüngliche Grösse bei.


  • Mod

    Evtl. hilft auch ein Refresh nach dem SetSize.
    Es kann aber auch sein, das du an das Fenster selber einen wxSizeEvent schicken musst.



  • Also ein Refresh nützt nichts.
    WIe geht das denn mit dem Event senden?


Anmelden zum Antworten