Встраивание элементов управления wxWidget друг на друга - PullRequest
0 голосов
/ 20 апреля 2020

Я определил wxPanel, который содержит wxFlexGridSizer, который содержит 4 строки и 2 столбца элементов управления (wxStaticText и wxTextCtrl).

Для целей atheisti c я хочу наложить содержимое этого классификатора с помощью wxRadioBox (без переключателей), поскольку он показывает хороший контур вокруг данных, которые я хочу, чтобы пользователь вводил с небольшим описание.

Как мне go добиться этого?

Спасибо!

Редактировать:

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);

1 Ответ

2 голосов
/ 20 апреля 2020

Ты почти у цели. Просто измените

 Project_Panel->SetSizer(sbox);

на

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

Хотя это не часть вашего вопроса, я думаю, что лучший вариант вместо указания горизонтальных и вертикальных зазоров для гибкой сетки 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(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));

Это создаст этот макет:

enter image description here

(я также выровнял тексты stati c рядом с их текстовыми полями. Вы можете удалить части Align(wxALIGN_RIGHT), если не вот так.)


Я понимаю, что иметь дело с классификаторами может быть сложно для новичков в wxWidgets. Есть несколько графических gui компоновщиков, таких как wxFormbuilder или wxCrafter , которые могут оказаться полезными.

...