wxNotebook - Как я могу получить высоту и / или значение wxSize одной вкладки?

Я пишу несколько примеров wxWidgets для образовательных целей. Моя проблема проста: я использую wxNotebook, и мне нужен трюк, чтобы получить текущий размер отдельной вкладки, особенно высоту. Проще говоря, если я помещу wxNotebook внутри wxFrame, который имеет, например, его wxMenubar - который, очевидно, занимает место по высоте - я получу только значение высоты вкладки, а НЕ значение высоты wxFrame, которое также включает размер wxMenubar, Мне нужна эта информация, чтобы правильно центрировать новые компоненты.

Смотрите пример кода ниже для примера.

#include "wx/wx.h"
#include "wx/gbsizer.h"

class MyFrame : public wxFrame
{   
    public:
        MyFrame() : wxFrame(NULL, wxID_ANY, wxT("Application"), wxDefaultPosition, wxSize(500, 300))
        {
            wxNotebook *tabs = new wxNotebook(this, wxID_ANY, wxPoint(-1,-1), wxSize(-1,-1), wxNB_TOP); 

            wxPanel *extPanel = new wxPanel(tabs, wxID_ANY); // external panel will be directly added to wxNotebook 

            wxPanel *innerPanel = new wxPanel(extPanel, wxID_ANY, wxDefaultPosition, wxDefaultSize); /* for now, innerPanel has default size */

            innerPanel->SetBackgroundColour(wxColor(0, 0, 255)); // I change background color for debug only 

            innerPanel->SetMinSize(wxSize(200, 200)); // I use SetMinSize() method to communicate to the sizer _required_ size for the panel

            wxGridBagSizer *gbs = new wxGridBagSizer(3, 3); // I use a wxGridBagSizer to position one panel inside external

            /* **** THE FOLLOWING IS THE CRITICAL LINE **** */          

            wxSize mainSize = this->GetSize(); /* for now, I get the _wxFRAME_ wxSize; I would get wxNOTEBOOK size instead */


            wxSize innPSize = innerPanel->GetMinSize(); // I get current (Min)Size of innerPanel

            wxSize emptyCellSize((mainSize.GetWidth() - innPSize.GetWidth()) / 2, (mainSize.GetHeight() - innPSize.GetHeight()) / 2);       

            gbs->SetEmptyCellSize(emptyCellSize); // I Use SetEmptyCellSize() method to center the inner panel

            gbs->Add(innerPanel, wxGBPosition(1, 1)); // 1, 1: central cell 
            extPanel->SetSizer(gbs);

            tabs->AddPage(extPanel, wxT("Positioning test"));

            Show(true);
        }
};

class MyApp : public wxApp
{
    public:
        virtual bool OnInit()
        {
            MyFrame *frame = new MyFrame();
        }
};

IMPLEMENT_APP(MyApp);

Как видите, макет несовершенен. ps Если вы знаете другой, более эффективный способ центрировать компонент с помощью wxGridBagSizer, дайте мне знать.

1 ответ

Решение

Центрирование ячеек макетов мешков сетки можно сделать, пометив столбцы или строки сетки как "растущие". Когда ячейка сетки помечается как растущая, все ячейки будут расти, занимая все пространство, выделенное ей родительским окном (также размеры ячеек автоматически изменяются при изменении размера родительского окна). Например, если у вас было 3 столбца и вы хотите, чтобы средний столбец был центрирован, вы можете сделать это:

wxGridBagSizer *gbs = new wxGridBagSizer(3, 3);
gbs->AddGrowableCol(0, 1);
gbs->AddGrowableCol(1, 2);
gbs->AddGrowableCol(2, 1);
gbs->AddGrowableRow(0, 1);
gbs->Add(new wxPanel, wxGBPosition(0, 0), wxDefaultSpan, 0);
gbs->Add(innerPanel, wxGBPosition(0, 1), wxDefaultSpan, wxEXPAND | wxCENTER);
gbs->Add(new wxPanel, wxGBPosition(0, 2), wxDefaultSpan, 0);

Здесь созданы 3 столбца; для каждого столбца должен быть вызван метод AddGrowableCol() для расширения столбцов; переменная пропорции говорит о размере каждого столбца по отношению ко всем остальным. В этом случае средний столбец будет в два раза больше остальных. Метод AddGrowableRow гарантирует, что столбцы будут занимать всю высоту родительской панели.

Другие вопросы по тегам