wxWidgets:Sizer和浪费的空间

时间:2013-10-21 13:06:15

标签: c++ wxwidgets sizer

目前在我的项目中,我有一个小组,其中包含的内容如下:

  • wxBoxSizer(wxVertical)
    • wxSearchControl(wxExpand)
    • wxListControl(wxExpand)
    • wxBoxSizer(wxHorizo​​ntal,wxALIGN_CENTER)
      • wxButton(wxALL)
      • wxButton(wxALL)

问题在于,当面板展开时,它会在按钮所在的位置下方产生浪费的空间,并且当面板收缩时也会出现相反的问题,这意味着在收缩wxListControl之前完全取消了按钮,这是不良行为。期望的行为将是这样的:当扩展我希望一切都达到它'漂亮的大小'然后唯一可以继续扩展的是wxListControl,当收缩wxListControl时应先收缩直到它达到最小尺寸然后按钮和搜索控制应该签订合同。以下图片应突出问题。

**

底部浪费的空间:http://i.stack.imgur.com/lsXOv.png

按钮被破坏:http://i.stack.imgur.com/U50In.png

所以这是我的代码(仅针对小宽度,保存的错误命名和所有内容进行编辑):

lbxEntityList = new wxListCtrl(this, wxID_ANY, wxDefaultPosition, wxDefaultSize,
                               wxLC_REPORT | wxLC_EDIT_LABELS | wxLC_HRULES,
                               wxDefaultValidator, wxT("Entity List Control")); 

lbxEntityList->AppendColumn("Entities",wxLIST_FORMAT_LEFT, 80);

srchControl = new wxSearchCtrl(this, wxID_ANY, "", wxDefaultPosition,
                               wxDefaultSize);

#ifndef __WXMAC__
    srchControl->ShowSearchButton( true );
#endif

srchControl->ShowCancelButton( false );

btn_RemoveEntity = new wxButton( this, wxID_ANY, wxT("Remove Entity"),
                                wxDefaultPosition, wxDefaultSize, 0);

btn_AddEntity = new wxButton(this, wxID_ANY, wxT("Add Entity"),
                             wxDefaultPosition, wxDefaultSize, 0);

sizer = new wxBoxSizer(wxVERTICAL);
wxBoxSizer* o = new wxBoxSizer(wxHORIZONTAL);
sizer->Add(srchControl, wxSizerFlags().Expand().Border(wxALL, 10));
sizer->Add( lbxEntityList, wxSizerFlags().Expand().Border(wxALL, 10));

sizer->Add(o, 1, wxALIGN_CENTER, 5);
o->Add( btn_RemoveEntity, 0, wxALL, 5 );
o->Add( btn_AddEntity, 0, wxALL, 5 );

SetSizer( sizer );
Layout();
sizer->Fit(this);

我尝试过的唯一的事情是不断尝试在wxFormBuilder中使用不同标志的不同配置中的随机不同的sizer,徒劳地试图让它工作,但这总是无结果地结束。我看了几个sizer教程,我得到的唯一结论是我需要编写自己的sizer,我希望我遗漏了一些东西,我不会那样做。

2 个答案:

答案 0 :(得分:0)

当调整包含它们的窗口大小时,Sizer提供首次通过默认行为。

但是,如果您需要默认行为以外的其他内容,则必须自己处理窗口调整大小事件,并重新计算小部件大小。

在你的情况下,你需要确定其他小部件的总“漂亮大小”,从窗口的新大小中减去它,并调整ListCtrl的大小以填充余数。

答案 1 :(得分:0)

我将这个问题交叉发布到wx-users邮件列表并收到了这个答案:

  

在垂直大小调整器中,EXPAND标志仅控制大小   控制水平方向。对于垂直方向,   “比例”参数是相关的。

     

为搜索控件和底部水平设置0的比例   box sizer。

     

为列表框设置1的比例。

     

这应该会给你你想要的行为。

虽然答案没有提供正确的合同行为,但它确实提供了正确的扩展行为,在我看来更为重要。