没有边框和默认控件的框架。 Sizer不起作用

时间:2014-12-24 05:21:48

标签: wxwidgets

我尝试使用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 时才有效!但是我需要有没有边框的框架并捕捉和关闭|最小化|最大化按钮,我该如何才能完成这项工作?

1 个答案:

答案 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}}是必要的。