Search code examples
c++user-interfacelayoutwxwidgetssizer

Fitting a big grid (wxGrid) in a dialog (wxDialog)


Here is my layout:

  • I have a sizer that contains a grid (with a proportion of 1) and a ok/cancel button bar

  • The all thing is in a wxDialog

Here it is:

|||||||||||||||
|             |
|    GRID     |
|             |
|             |
|             |
|||||||||||||||
| OK  CANCEL  |
|||||||||||||||

The issue is that the grid contains too many row, and over flow the screen, so in the end I don't see the top part of the dialog. Is there a way, when calling Fit() on the dialog, to limit its height ?

I have tried stuff like this: SetSizeHints(-1,-1,-1,500); and SetMaxSize(500,500) but it did not worked.

Also I have tried to do that: this->SetSize(this->GetSize().GetX(), 500);, but since the vertical scroll bar appears on the grid, it is not wide enough and a horizontal scroll bar shows up.

EDIT

In the constructor I call wxGrid(parent, wxID_ANY, wxDefaultPosition, wxDefaultSize)


Solution

  • The easiest way to handle this is to use a grid of fixed size. If there are more rows than will fit, then a scroll bar will appear. You set the size you want in the constructor.

    new wxGrid( this, IDC_grid, wxPoint(-1,-1),wxSize(igridxsize,igridysize));
    

    If you want the size of the grid to adjust, e.g. when the user resizes the application window, things are a bit more complex. You need handle the window size event and change the grid size as appropriate.

    Something along these lines:

    myDialog::OnSize(wxSizeEvent& event);
    {
    wxSize dialogSize = event.GetSize();
    myGrid->OnSize( wxSizeEvent(
         dialogSize.GetWidth() * 0.9, dialogSize.GetHeight() * 0.7 ));
    }