Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/145.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 布局wxWidgets框架时遇到问题_C++_Wxwidgets - Fatal编程技术网

C++ 布局wxWidgets框架时遇到问题

C++ 布局wxWidgets框架时遇到问题,c++,wxwidgets,C++,Wxwidgets,我正在尝试使用wxWidgets创建一些对话框。我正在努力让他们以一种吸引人的标准方式进行布局。在下面的例子中,我试图创建一个框布局,下面有一行ok&cancel按钮。下面的图片是我实际得到的 Form2::Form2() :wxFrame(nullptr, wxID_ANY, L"Simple form") { wxBoxSizer* bSizer1; bSizer1 = new wxBoxSizer(wxVERTICAL); wxStaticBox* box = n

我正在尝试使用wxWidgets创建一些对话框。我正在努力让他们以一种吸引人的标准方式进行布局。在下面的例子中,我试图创建一个框布局,下面有一行ok&cancel按钮。下面的图片是我实际得到的

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
命令,而根据文档,我本应该能够通过在各自的add命令中使用wxLEFT,10来为TextControl和Button添加左填充,但这没有任何作用

下一个问题是,顶行上的3个对象应该垂直对齐,但在所有3个组件上设置垂直对齐,例如
box2->Add(newText,wxALIGN_CENTER);“”或者
wxALIGN\u CENTER\u VERTICAL``只会更改它们之间的间距

最严重的问题是“确定”和“取消”按钮根本不出现。如果我删除
bSizer1->Add(stb)
命令,OK按钮会出现在最上面,可能会覆盖Cancel按钮,但我不能确定


我不知道去哪里寻求帮助。文档中没有太多示例,示例代码有点像狗的早餐。在我开始之前,有一个重要的建议:如果你用代码创建布局(而不是从XRC加载布局),那么一定要使用它使代码更具可读性(参见文档链接中的激励示例)。不幸的是,手工编写sizer代码仍然很容易出错,因为编译器实际上帮不了你多少忙,但是使用
wxSizerFlags
就不那么容易了

要回答您的第一个问题,使用borders肯定应该而且确实有效,如果没有看到您所做的,很难知道您到底出了什么问题,但是
Add(whatever,wxSizerFlags().Border(wxLEFT,10))
确实在“whatever”的左侧留下了10px的间隙。这方面的主要问题是,绝对不能使用硬编码的像素值,因此请不要这样做,而是使用类似于
DoubleBorder(wxLEFT)
的方法

第二个问题是由于您没有垂直对齐
wxStaticText
,还因为您似乎将对齐作为
Add()
比例
参数传递,这解释了为什么它会改为修改布局(按钮现在展开)。使用
wxSizerFlags
您就不会犯这个错误

我不太确定按钮的问题,你的代码似乎是正确的,我最初的想法是你的框架太小,无法显示按钮,但这并不能解释为什么它们会出现在它的顶部。不过,您应该在框架上调用
setSizerAndIt()
,而不是只调用
SetSizer()
,以确保最小框架大小足够大,可以显示其全部内容(顺便说一句,您不需要调用
Layout()
,尽管这样做没有坏处)



最后,手工编写sizer代码很烦人。特别是在启动时,首先在可视化对话框编辑器中做它是有用的,以确保在将其转录成C++之前,布局是有效的(并且一些对话框编辑器可以直接生成C++代码)。示例很好地查找了某些东西的使用细节,但它们确实不会教您如何创建好的布局,因为这不是它们真正的目标,它们倾向于尽可能简单地演示它们的主题。他们中的大多数人都很老了,所以他们甚至不应该使用
wxSizerFlags
(任何补丁改变他们使用它都是非常受欢迎的…。

这里有很多好的信息
SetSizerAndIt
和缺少的比例设置是关键。我现在在摆弄浆纱布。。。这绝对是一个更好的语法。你能推荐一个对话框编辑器吗?有几个对话框编辑器,我真的不想在这里玩最喜欢的,所以请从中选择一个(或者全部尝试…)。