相互嵌入 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,您可能会觉得有用。
我已经定义了一个包含 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,您可能会觉得有用。