我已经定义了一个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);
您快到了。只需更改
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));
这将产生此布局:
这将使您的表单在处理高dpi屏幕时更加灵活。 (我也将静态文本对齐到其文本框旁边。如果您不喜欢,可以删除Align(wxALIGN_RIGHT)
部分。
我意识到,对于新手来说,使用sizer对于wxWidgets可能是棘手的。有一些图形GUI生成器,例如wxFormbuilder或wxCrafter,可能会有所帮助。