我正在尝试使用wxWidgets创建一些对话框。我正在努力如何让它们以一种吸引人的标准方式进行布局。在下面的示例中,我尝试使用一行ok和amp;来创建框布局。取消它下面的按钮。下面的图像是我实际得到的。
Form2::Form2() :wxFrame(nullptr, wxID_ANY, L"Simple form")
{
wxBoxSizer* bSizer1;
bSizer1 = new wxBoxSizer(wxVERTICAL);
wxStaticBox* box = new wxStaticBox(this, wxID_ANY, "BOX");
wxStaticBoxSizer *sz = new wxStaticBoxSizer(box, wxVERTICAL);
wxBoxSizer* box2 = new wxBoxSizer(wxHORIZONTAL);
box2->Add(new wxStaticText(box, wxID_ANY, "static text"));
box2->AddSpacer(10);
newText = new wxTextCtrl(box, wxID_ANY, "add me");
box2->Add(newText);
box2->AddSpacer(10);
wxButton* btnAdd = new wxButton(box, wxID_ANY, "Add");
box2->Add(btnAdd);
sz->Add(box2,0, wxALL, 5);
lstFile = new wxListBox(box, wxID_ANY, wxDefaultPosition, wxSize(400,500), 0, NULL, wxLB_SINGLE | wxLB_NEEDED_SB);
sz->Add(lstFile, 0, wxALL, 5);
bSizer1->Add(sz);
wxStdDialogButtonSizer* stb = new wxStdDialogButtonSizer( );
stb->AddButton(new wxButton(this, wxID_OK));
stb->AddButton(new wxButton(this, wxID_CANCEL));
stb->Realize();
bSizer1->Add(stb);
this->SetSizer(bSizer1);
this->Layout();
this->Centre(wxBOTH);
}
首先,我不明白为什么我需要box2->AddSpacer
命令,根据文档我应该能够通过使用wxLEFT,10 in in向TextControl和Button添加左边距他们各自的添加命令,但没有做任何事情。
下一个问题是顶行上的3个对象应该垂直对齐,但是在所有3个组件上设置垂直对齐,例如box2->Add(newText, wxALIGN_CENTER);''' or
wxALIGN_CENTER_VERTICAL```只会改变它们之间的间距。
最严重的问题是确定和取消按钮根本不会出现。如果我删除了bSizer1->Add(stb)
命令,则会在最顶部显示“确定”按钮,可能会覆盖“取消”按钮,但我无法确定。
我不会'知道在哪里寻求帮助。文档并没有包含很多示例,示例代码是一种狗的早餐。他们中的大多数都有相当随意的布局。
答案 0 :(得分:2)
在开始之前,有一个重要建议:如果您在代码中创建布局(而不是从XRC加载它们),那么请使用wxSizerFlags使您的代码更具可读性(请参阅文档中的激励示例链接)。不幸的是,编写sizer代码仍然很容易出错,因为编译器对你来说真的很有帮助,但是wxSizerFlags
它变得更不那么容易了。
要回答你的第一个问题,使用边框绝对应该而且确实有用,很难在不知道你做了什么的情况下知道到底出了什么问题,但是Add(whatever, wxSizerFlags().Border(wxLEFT, 10))
确实留下了10px的差距。左边的"无论如何"。这个问题的主要问题是你绝不能以像素为单位使用硬编码值,所以请不要这样做并使用类似DoubleBorder(wxLEFT)
的内容。
第二个问题是由于您没有垂直对齐wxStaticText
而且因为您似乎将对齐方式作为proportion
的{{1}}参数传递 - 解释了为什么它会修改你的布局(现在按钮展开)。使用Add()
,您不会犯这个错误。
我对按钮的问题不太确定,你的代码似乎是正确的,我最初的想法是你的框架太小而无法显示按钮,但这并不能解释他们为什么会这样做出现在它的顶部。不过,您应该在框架上调用wxSizerFlags
而不是SetSizerAndFit()
,以确保最小框架尺寸足以显示其全部内容(顺便说一下,您不需要调用{{} 1}},虽然它没有坏处。)
最后,手动编写sizer代码很烦人。特别是在启动时,首先在可视化对话框编辑器中执行它以确保您的布局在将其转录为C ++之前是有用的(并且一些对话框编辑器可以直接为您生成C ++代码)。样本很容易查找某些内容的使用细节,但他们确实不会教你如何创建漂亮的布局,因为它不是真正的目标,它们往往尽可能简单地展示他们的主题代替。而且他们中的大多数都很老,所以甚至不使用SetSizer()
,因为他们真的应该使用它(任何改变它们使用它的补丁肯定会受到欢迎......)。