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 гарантирует, что столбцы будут занимать всю высоту родительской панели.