将wxWidget控件彼此叠加

问题描述 投票:0回答:1

我已经定义了一个wxPanel,其中包含一个wxFlexGridSizer,其中包含4行2列的控件(wxStaticText和wxTextCtrl)。

出于无神论的目的,我想用wxRadioBox(不带单选按钮)覆盖此sizer的内容,因为它在希望用户输入的数据周围显示了一个很好的轮廓,并带有一些描述。

我将如何实现这一目标?

谢谢!

编辑:

void MyFrame::Initialize_Project_Info() {

//wxStaticText* s = new wxStaticText(this, wxID_ANY, _T("")); //Random control assigned to the parent to overide wxEVT_SIZE (check wxFrame documentation)

//To try and implement Project Panel
int xx = 5, yy = 10;
int delta_x = 10, delta_y = 10;


wxBoxSizer* hbox = new wxBoxSizer(wxHORIZONTAL);
wxFlexGridSizer* fgs = new wxFlexGridSizer(4, 2, 10, 15);
wxPanel* Project_Panel = new wxPanel(this, wxID_ANY, wxDefaultPosition, wxSize(200, 200), wxTAB_TRAVERSAL, _T(""));

wxStaticBoxSizer* sbox = new wxStaticBoxSizer(wxVERTICAL, Project_Panel, _T("Project Information"));


//Project_Info_OverLay = new wxRadioBox(Project_Panel, wxID_ANY, _T("Project Information"), wxPoint(5, 0), wxSize(400, 250), 0, NULL, 1, wxRA_SPECIFY_COLS, wxDefaultValidator, _T(""));


//Note wsSize(width,height).
Project_Name = new wxStaticText(Project_Panel,wxID_ANY,_T("Project:"));
Engineer_Name = new wxStaticText(Project_Panel, wxID_ANY, _T("Engineer:"));
CrossSection_Name = new wxStaticText(Project_Panel, wxID_ANY, _T("Cross Section ID:"));
Additional_Notes = new wxStaticText(Project_Panel, wxID_ANY, _T("Additional Notes:"));


Enter_PN = new wxTextCtrl(Project_Panel, wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, wxTE_PROCESS_ENTER | wxTE_PROCESS_TAB, wxDefaultValidator, _T(""));
Enter_EN = new wxTextCtrl(Project_Panel, wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, wxTE_PROCESS_ENTER | wxTE_PROCESS_TAB, wxDefaultValidator, _T(""));
Enter_CSN = new wxTextCtrl(Project_Panel,wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, wxTE_PROCESS_ENTER | wxTE_PROCESS_TAB, wxDefaultValidator, _T(""));
Enter_AN = new wxTextCtrl(Project_Panel, wxID_ANY, wxEmptyString, wxDefaultPosition, wxSize(250,100), wxTE_PROCESS_ENTER | wxTE_PROCESS_TAB | wxTE_MULTILINE, wxDefaultValidator, _T(""));

fgs->Add(Project_Name);
fgs->Add(Enter_PN, 1, wxEXPAND);
fgs->Add(Engineer_Name);
fgs->Add(Enter_EN, 1, wxEXPAND);
fgs->Add(CrossSection_Name);
fgs->Add(Enter_CSN, 1, wxEXPAND);
fgs->Add(Additional_Notes);
fgs->Add(Enter_AN, 1, wxEXPAND);

sbox->Add(fgs);

Project_Panel->SetSizer(sbox);
wxwidgets
1个回答
0
投票

您快到了。只需更改

 Project_Panel->SetSizer(sbox);

to

hbox->Add(sbox,wxSizerFlags().Border(wxALL));
Project_Panel->SetSizer(hbox);

尽管不是您所要问的问题,但我认为,使用sizer标志来定义间隙,而不是为flex grid sizer指定水平和垂直间隙是一个更好的选择。即像这样定义sizer:

wxFlexGridSizer* fgs = new wxFlexGridSizer(4, 2, 0, 0);

然后像这样向其中添加元素:

fgs->Add(Project_Name,
         wxSizerFlags().Align(wxALIGN_RIGHT|wxALIGN_CENTER_VERTICAL)
                       .Border(wxTOP|wxBOTTOM|wxLEFT));
fgs->Add(Enter_PN,wxSizerFlags().Expand().Border(wxALL));
fgs->Add(Engineer_Name,
         wxSizerFlags().Align(wxALIGN_RIGHT|wxALIGN_CENTER_VERTICAL)
                       .Border(wxTOP|wxBOTTOM|wxLEFT));
fgs->Add(Enter_EN,
         wxSizerFlags().Expand().Border(wxBOTTOM|wxLEFT|wxRIGHT));
fgs->Add(CrossSection_Name,
         wxSizerFlags().Align(wxALIGN_RIGHT|wxALIGN_CENTER_VERTICAL)
                       .Border(wxTOP|wxBOTTOM|wxLEFT));
fgs->Add(Enter_CSN, wxSizerFlags().Expand().Border(wxBOTTOM|wxLEFT|wxRIGHT));
fgs->Add(Additional_Notes,
         wxSizerFlags().Align(wxALIGN_RIGHT).Border(wxTOP|wxBOTTOM|wxLEFT));
fgs->Add(Enter_AN, wxSizerFlags().Expand().Border(wxBOTTOM|wxLEFT|wxRIGHT));

这将产生此布局:

enter image description here

这将使您的表单在处理高dpi屏幕时更加灵活。 (我也将静态文本对齐到其文本框旁边。如果您不喜欢,可以删除Align(wxALIGN_RIGHT)部分。


我意识到,对于新手来说,使用sizer对于wxWidgets可能是棘手的。有一些图形GUI生成器,例如wxFormbuilderwxCrafter,可能会有所帮助。

© www.soinside.com 2019 - 2024. All rights reserved.