首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >wxNotebook -如何获取单个选项卡的高度和/或wxSize值?

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

Stack Overflow用户
提问于 2011-08-22 21:44:34
回答 1查看 1.2K关注 0票数 2

我正在写一些用于教育目的的wxWidgets样本。我的问题很简单:我正在使用wxNotebook,我需要一些技巧来获得单个选项卡的当前大小,特别是高度。简而言之,如果我将一个wxNotebook放在一个wxFrame中,例如,他的wxMenubar -很明显,它占据了-的位置,我将只得到制表符高度值,而不会得到wxFrame高度值,它也包括wxMenubar的大小。我需要这些信息来正确地将新组件居中。

有关示例,请参阅下面的示例代码。

代码语言:javascript
复制
#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将零部件居中的另一种更有效的方法,请与我联系。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2011-08-23 05:00:09

通过将网格的列或行标记为“可增长”,可以使网格布局的单元格居中。当网格单元格被标记为可增长时,所有单元格都将增长以占据父窗口给它的所有空间(同时,当父窗口调整大小时,单元格的大小也会自动调整)。例如,如果您有3列,并希望中间的列居中,则可以执行以下操作:

代码语言:javascript
复制
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方法确保列将占据父面板的整个高度。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/7148421

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档