wxWidgets 2.8.8: wie Layout erzwingen?



  • Kann man in wxWidgets (Version 2.8.8) ein erneutes Berechnen des Layouts erzwingen?

    Bzw. ich beschreibe mal kurz das ursprüngliche Problem.
    Ich habe einen Sizer ( wxBoxSizer (V) ), und da drin steckt u.A. ein Panel.
    Das Panel möchte ich nun bei einer bestimmten Aktionen ausblenden und bei einer anderen wieder einblenben.
    Dazu verwende ich einfach ->Show(bool) auf das Panel.
    Das Panel verschwindet auch brav bzw. erscheint wieder, nur das Layout wird nicht neu berechnet.
    Sobald ich die Fenstergrösse ändere passt sich das Layout allerdings automatisch an.

    Ich habe bereits folgende Aufrufe nach dem ->Show(bool) probiert, alle ohne Erfolg:

    • wxMyFrame::Layout();
    • wxMyFrame::DoLayout();
    • wxMyFrame::SetSize(wxRect(GetPosition(), GetSize()), wxSIZE_FORCE);

    Ich hab jetzt mal folgenden Hack reingeflickt, der funktioniert, aber ich würde das gerne "sauber" machen, falls es dazu ne Möglichkeit gibt:

    // HACK: force a layout update by temporarily changing the window size
    		wxSize size = GetSize();
    		SetSize(wxRect(GetPosition(), size + wxSize(1, 0)), wxSIZE_FORCE);
    		SetSize(wxRect(GetPosition(), size), wxSIZE_FORCE);
    

    p.S.: wxMyFrame::SendSizeEvent() bringt auch genau nix 😞

    p.p.S.: Plattform ist Windows XP.

    p.p.p.S.: Der Hack geht leider nicht wenn das Fenster "maximized" ist. Ich suche also neben der bevorzugten "sauberen" Lösung auch einen Hack der auch mit "maximized" funktioniert.



  • Schonmal

    wxSizer::SetSizeHints(wxFrame*)
    

    http://wiki.wxwidgets.org/WxSizer
    http://docs.wxwidgets.org/trunk/classwx_sizer.html#bc460cd0e2bb3bde72142fdb434bc546

    probiert?

    Im Prinzip isses das selbe Problem das ich hatte :D. Siehe einige Threads weiter unten. Nur mit Sizern :P.
    rya.



  • Ich hab keinen "Top-Level Sizer". Das erste in der Hirarchie ist ein Panel. Erst in dem Panel drin gibt's dann Sizer.
    Vielleicht ist auch das das Problem.
    Werde mal versuchen irgend einen einfachen Sizer über das Panel drüber zu stülpen.



  • hustbaer schrieb:

    Ich hab keinen "Top-Level Sizer". Das erste in der Hirarchie ist ein Panel. Erst in dem Panel drin gibt's dann Sizer.
    Vielleicht ist auch das das Problem.
    Werde mal versuchen irgend einen einfachen Sizer über das Panel drüber zu stülpen.

    Dann hast Du genau das selbe Problem wie ich.
    Lösung: Sizer drüberstülpen wie Du schon sagtest oder wie ich ein wxSizeEvent senden an den Topframe. Das geht auch.
    HTH
    rya.



  • Alter Schwede!

    Man muss das Show()/Hide() über den "containing sizer" machen und/oder Layout() ebenfalls auf den "containing sizer" aufrufen. (Ich hab jetzt beides drin, weiss nicht ob eins davon auch reicht.)
    Wenn man nur Layout auf den Top-Level-Sizer macht, reicht das nicht, wenn das verschwundene Control nicht zufällig im Top-Level-Sizer hängt (was es bei mir nicht tut). Ebenso kann man das Show/Hide dann nicht über den Top-Level-Sizer machen.
    (Das hatte ich nämlich alles schon probiert)

    Und da ich fälschlicherweise angenommen hatte dass mir GetSizer() den "containing sizer" gibt (was es nicht tut), hab ich jetzt ca. 10000 Stunden damit verschissen.

    Nachdem ich nun weiss dass ich GetContainingSizer() verwenden muss, geht nun auch alles.

    Wenn scheissendreck wixWidgets sich selbst darum kümmern würde das Layout zu aktualisieren, wie ich es mir von einem ordentlichen Windowing-Toolkit erwartet hätte, hätte ich die 10000 Stunden in was sinnvolleres investieren können wie z.B. an die Decke zu starren. ARGH!


Log in to reply