我尝试使用wx和wxFrame为windows编写小型GUI程序。我在ctor中有这个代码:
MainFrame::MainFrame(wxPoint pos)
: wxFrame(NULL, wxID_ANY, wxT("Sample text"), pos,
wxDefaultSize, wxBORDER_NONE | wxFRAME_NOTASKBAR)
{
SetSize(wxSize(250, 100));
CreateLayout();
}
CreateLayout 功能:
void MainFrame::CreateLayout()
{
wxBoxSizer* sizer = new wxBoxSizer(wxHORIZONTAL);
sizer->Add(new wxStaticText(this, -1, "1000.56"), 0, wxLEFT|wxALIGN_CENTER_VERTICAL, 5);
SetSizer(sizer);
}
如您所见,我想将文本与帧的垂直中心对齐。但是这套框架样式标志sizer不起作用!它们仅在我设置 wxDEFAULT_FRAME_STYLE 时才有效!但是我需要有没有边框的框架并捕捉和关闭|最小化|最大化按钮,我该如何才能完成这项工作?
答案 0 :(得分:1)
在MainFrame
构造函数中,在调用SetSize()
之后将呼叫转移到CreateLayout()
。那就是它。
通常情况下,在创建框架后调用Show()
会使上面的内容变得不必要,但在这种情况下看起来并不是这样(请参阅下面的详细信息)。无论如何,我认为首先在窗口内设置所有sizer和控件,然后更改大小以触发Layout()
是有意义的,只是为了安全起见。
这也意味着另一种解决方案是将呼叫保留在SetSize()
所在的位置,并通过在Layout()
的最后添加对CreateLayout()
的呼叫来强制布局。但是......我喜欢高效(阅读: lazy );我会选择第一个解决方案。
对于使用wxFrame
创建的wxDEFAULT_FRAME_STYLE
,对Show()
的调用最终会调用::ShowWindow()
,这会触发WM_SIZE
,最终会触发Layout()
wxFrame
1}}。
对于使用wxBORDER_NONE
创建的::ShowWindow()
,WM_SIZE
似乎无法触发Layout()
,这就是上述解决方案强制调用{{}}的原因{1}}是必要的。