我正在写一些用于教育目的的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将零部件居中的另一种更有效的方法,请与我联系。
发布于 2011-08-23 05:00:09
通过将网格的列或行标记为“可增长”,可以使网格布局的单元格居中。当网格单元格被标记为可增长时,所有单元格都将增长以占据父窗口给它的所有空间(同时,当父窗口调整大小时,单元格的大小也会自动调整)。例如,如果您有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方法确保列将占据父面板的整个高度。
https://stackoverflow.com/questions/7148421
复制相似问题