Page 1 of 1

2 ScrolledWindows on a ScrolledWindow no resize

Posted: Wed Jun 17, 2009 2:01 pm
by kea_
Hello together,

I have a wxScrolledWindow (Base) as a base and in this I have a wxBoxSizer in the BoxSizer I have two wxScrolledWindow (Win1 and Win2).
That works fine. But if I like to change the size of the Win1 the wxSizer does not Recalc the size.
See the examples below.

This is the source for the Base:

Code: Select all

coMyTable::coMyTable(wxWindow *wParent, wxWindowID id, long lStyle)
         : wxScrolledWindow(wParent, id, wxDefaultPosition, wxDefaultSize, lStyle)
         , csMyTableData(){

    m_szrTop = new wxBoxSizer(wxVERTICAL);
    SetSizer(m_szrTop);
    m_szrTop->Add(m_mtlLabel = new coMyTableLabel(this, ID_LABEL, this), 0, wxALL | wxEXPAND, 0);
    m_szrTop->Add(m_mtbBody = new coMyTableBody(this, ID_BODY, this), 1, wxALL | wxEXPAND, 0);
}


coMyTable::~coMyTable(){}


void coMyTable::SetLabelHeight(int iHeight){
    m_mtlLabel->SetSize(m_mtlLabel->GetSize().GetWidth(), iHeight);
//    m_mtlLabel->Refresh();
    //m_szrTop->RecalcSizes();
    //FitInside();
}
Win1:

Code: Select all

#include "coMyTableLabel.h"


BEGIN_EVENT_TABLE(coMyTableLabel, wxScrolledWindow)
    EVT_PAINT(coMyTableLabel::OnPaint)
    EVT_ERASE_BACKGROUND(coMyTableLabel::OnEraseBackground)
    EVT_MOUSE_EVENTS(coMyTableLabel::OnMouseEvent)
    //EVT_SIZE(coMyTableLabel::OnSize)
END_EVENT_TABLE()


coMyTableLabel::coMyTableLabel(wxWindow *wnd, wxWindowID id, csMyTableData *dt)
              : wxScrolledWindow(wnd, id, wxDefaultPosition, wxDefaultSize, wxFULL_REPAINT_ON_RESIZE){

    m_dt = dt;
    SetAutoLayout(true);
}


coMyTableLabel::~coMyTableLabel(){}


// **  E V E N T S  ***
void coMyTableLabel::OnEraseBackground(wxEraseEvent& event){}


void coMyTableLabel::OnPaint(wxPaintEvent &event){
    wxBufferedPaintDC dc(this);
    PrepareDC(dc);

    dc.SetFont(GetFont());
    dc.SetBackground(wxBrush(wxColour("#ffffff"), wxSOLID));
    dc.Clear();

    m_dt->DrawLabel(dc, GetSize());
}


void coMyTableLabel::OnMouseEvent(wxMouseEvent &event){
    /*wxString sCursor = "default";
    m_data->OnMouseEventLabel(event, sCursor);
    if(sCursor == "default"){
        wxScrolledWindow::SetCursor(*wxSTANDARD_CURSOR);
    }else if(sCursor == "sizewe"){
        wxScrolledWindow::SetCursor(wxCursor(wxCURSOR_SIZEWE));
    }

    Refresh();*/
}


void coMyTableLabel::OnSize(wxSizeEvent &event){
    Layout();
}
Win2:

Code: Select all

#include "coMyTableBody.h"


BEGIN_EVENT_TABLE(coMyTableBody, wxScrolledWindow)
    EVT_PAINT(coMyTableBody::OnPaint)
    EVT_ERASE_BACKGROUND(coMyTableBody::OnEraseBackground)
    //EVT_MOUSE_EVENTS(coMyTableBody::OnMouseEvent)
END_EVENT_TABLE()


coMyTableBody::coMyTableBody(wxWindow *wnd, wxWindowID id, csMyTableData *dt)
             : wxScrolledWindow(wnd, id, wxDefaultPosition, wxDefaultSize, wxFULL_REPAINT_ON_RESIZE){

    m_dt = dt;
    wxScrolledWindow::SetScrollRate(1, 1);
}


coMyTableBody::~coMyTableBody(){}


// **  E V E N T S  ***
void coMyTableBody::OnEraseBackground(wxEraseEvent& event){}


void coMyTableBody::OnPaint(wxPaintEvent &event){
    wxBufferedPaintDC dc(this);
    PrepareDC(dc);

    dc.SetFont(GetFont());
    dc.SetBackground(wxBrush(wxColour("#ffffff"), wxSOLID));
    dc.Clear();

    m_dt->DrawBody(dc);
}


void coMyTableBody::OnMouseEvent(wxMouseEvent &event){
    /*wxString sCursor = "default";

    m_mgdData->OnMouseEventTable(event, sCursor);
    if(sCursor == "default"){
        wxScrolledWindow::SetCursor(*wxSTANDARD_CURSOR);
    }else if(sCursor == "sizewe"){
        wxScrolledWindow::SetCursor(wxCursor(wxCURSOR_SIZEWE));
    }

    Refresh();*/
}
Does any body know a solution?
Please help me.

Greetings kea_

Posted: Wed Jun 17, 2009 2:10 pm
by Auria
Before even looking at your code, there's a question i really want to ask : why put scrolled windows inside a scrollwindow? This doubly-scrolling layout seems very uncommon and I can't think of any use.

Second, by looking at your code, I see you are using SetSize(). This method is useless if you are using sizers, because in this case the sizers will call it again and overwrite your values eventually. Try calling SetMinSize, SetPreferredSize, etc... (or whatever they're called) and calling Layout() after

Posted: Thu Jun 18, 2009 5:06 am
by kea_
Yes you have right it has no sense for a scrolledwindow in a scrolledwindow.

I will take a wxPanel for that.

For the second.
If you put a wxSizer to a top Window (wxFrame) the set size works. You can change the height of a sizer. This must have to do something width the top level window.

Thank you for your answer.

kea_