wxNotebook - 如何获取单个选项卡的高度和/或wxSize值?

时间:2011-08-22 13:44:34

标签: wxwidgets wxnotebook

我正在编写一些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);

如您所见,布局不完美。 附:如果您知道使用wxGridBagSizer集中组件的另一种更有效的方法,请告诉我。

1 个答案:

答案 0 :(得分: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方法确保列占据父面板的整个高度。