相互嵌入 wxWidget 控件

Embedding wxWidget controls ontop of each other

我已经定义了一个包含 wxFlexGridSizer 的 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);

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

虽然不是你的问题的一部分,但我认为更好的选择是使用 sizer 标志来定义间隙,而不是为 flex grid sizer 指定水平和垂直间隙。这将帮助您的表单在处理高 dpi 屏幕时更加灵活。

为此,像这样定义 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(wxBOTTOM|wxLEFT));
fgs->Add(Enter_EN, wxSizerFlags().Expand().Border(wxBOTTOM|wxLEFT|wxRIGHT));
fgs->Add(CrossSection_Name,
         wxSizerFlags().Align(wxALIGN_RIGHT|wxALIGN_CENTER_VERTICAL)
                       .Border(wxBOTTOM|wxLEFT));
fgs->Add(Enter_CSN,
         wxSizerFlags().Expand().Border(wxBOTTOM|wxLEFT|wxRIGHT));
fgs->Add(Additional_Notes,
         wxSizerFlags().Align(wxALIGN_RIGHT).Border(wxBOTTOM|wxLEFT));
fgs->Add(Enter_AN, wxSizerFlags().Expand().Border(wxBOTTOM|wxLEFT|wxRIGHT));

这会产生这样的布局:

(我还对齐了文本框旁边的静态文本。如果您不喜欢,可以删除 Align(wxALIGN_RIGHT) 部分。)


我意识到,对于 wxWidgets 的新手来说,处理 sizer 可能很棘手。有一些图形图形用户界面生成器,例如 wxFormbuilder or wxCrafter,您可能会觉得有用。