【发布时间】:2016-10-19 03:56:09
【问题描述】:
上周我一直在学习 wxWidgets,包括使用 IDE 和编写 C++ 代码。我开始对获得看起来不错的东西感到绝望,因为放置物品的能力似乎非常有限。
出于成本原因,我正在将一个大型项目从 C++Builder 移植到 VStudio。我有很多对话框要重新创建。它们通常包含输入“块”的不同组合——因为没有更好的词。我为我的 GUI 选择了 wxWidgets,因为我认为我可以通过生成一行表单的函数在代码中构建对话框。例如,在下面显示的对话框中,我可能具有 CreateLabelEdit、CreateLabelCombo、CreateBoldLabel 等函数。实际上,我在该部分取得了一些成功,但在设置对话框样式时却惨遭失败。
以下是这种特殊形式的一些设计标准:
所有输入都是左对齐的,并且不同的宽度适合其内容。
输入标签全部右对齐。
-
对齐点(即包含输入标签的列的宽度在所有对话框中都是相同的,各种输入的宽度也是如此。当然也有例外!
其他类型的标签在不同的位置对齐。在这种情况下加粗标签。
基本上我想控制我的对象的大小、位置和对齐方式。 这是否是我选择工具的心态错误?或者这些类型的事情可以用这个工具完成吗?
部分解决方案 我尝试过将绝对位置与 sizers 混合使用,但这根本不起作用。
然后我尝试使用 flexgrid sizer 来完成示例的一部分,如果我可以制作其中一个块,那么我可以将多个块拼接在一起。一切都很好,除非我使用 SetItemMinSize 设置第一列的宽度,正如@VZ 建议的那样,该项目失去了它的 sizerflag 设置:
form4::form4() :wxDialog(nullptr, wxID_ANY, "title")
{
wxSizerFlags flagT1(1);
flagT1.Align(wxALIGN_CENTER_VERTICAL | wxALIGN_RIGHT).Border(wxTOP | wxLEFT, 10);
wxSizerFlags flagT2(1);
flagT2.Align(wxALIGN_CENTER_VERTICAL ).Border(wxTOP | wxLEFT, 10);
wxSizerFlags flagT3(1);
flagT3.Align(wxALIGN_CENTER_VERTICAL).Border(wxTOP | wxLEFT| wxRIGHT, 10);
wxBoxSizer* bSize = new wxBoxSizer(wxVERTICAL);
wxStaticText* _Text = new wxStaticText(this, wxID_ANY, "this should be bold");
wxFont _Font = _Text->GetFont();
_Font.MakeBold();
_Font.SetPixelSize(_Font.GetPixelSize()*1.1);
_Text->SetFont(_Font);
bSize->Add(_Text, wxSizerFlags().Border(wxTOP, 10).Center());
bSize->Add(new wxStaticText(this, wxID_ANY, "this should be bold"),
wxSizerFlags().Border(wxTOP, 10).Center());
wxFlexGridSizer* bSizer = new wxFlexGridSizer(3,0,0);
_Text = new wxStaticText(this, wxID_ANY, "bob");
// bSizer->SetItemMinSize(_Text, wxSize(150, -1)); //this has no effect here
bSizer->Add(_Text, flagT1);
bSizer->SetItemMinSize(_Text, wxSize(150, -1));// loses styling of flagT1
bSizer->Add(new wxTextCtrl(this, wxID_ANY, "default_value", wxDefaultPosition, wxSize(150, -1)), flagT2);
bSizer->Add(new wxStaticText(this, wxID_ANY, "cm", wxPoint(200, 20)), flagT3);
bSizer->Add(new wxStaticText(this, wxID_ANY, " longer"), flagT1);
bSizer->Add(new wxTextCtrl(this, wxID_ANY, "default_value2", wxPoint(-1, -1), wxSize(150, -1)), flagT2);
bSizer->Add(new wxStaticText(this, wxID_ANY, "cm", wxPoint(200, 20)), flagT3);
bSizer->Add(new wxStaticText(this, wxID_ANY, "bob"), flagT1);
bSizer->Add(new wxTextCtrl(this, wxID_ANY, "default_value3", wxPoint(-1, -1), wxSize(150, -1)), flagT2);
bSizer->Add(new wxStaticText(this, wxID_ANY, "cm", wxPoint(200, 20)), flagT3);
bSize->Add(bSizer);
bSize->Add(CreateStdDialogButtonSizer(wxOK | wxCANCEL), wxSizerFlags(0).Border(wxALL, 10));
this->SetSizerAndFit(bSize);
// this->Layout();
this->Centre(wxBOTH);
}
产生这个:
【问题讨论】:
-
你是做绝对定位还是使用sizer布局?
-
试试 wxFormBuilder
-
@smcd,我一直在尝试使用 sizers,因为所有文档都建议这样做,但现在我认为为 x 组件提供大小并让 sizer 处理 y 组件可能是解决方案。
-
如果你愿意使用 CodeLite IDE,这里有 wxCrafter。
标签: wxwidgets