Здесь есть несколько проблем.
- Вы действительно должны придерживаться символа c константа
wxID_ANY
вместо использования -1 в строке
Draw_Panel = new wxPanel(this, -1);.
Таким образом, в очень, очень маловероятном случае изменения wxID_ANY на что-то другое ваш код продолжит работать.
В строке
Draw_Panel ->Connect(wxEVT_PAINT, wxPaintEventHandler(MyFrame::OnPaint));
необходимо указать 2 дополнительных параметра : userData (который почти всегда будет NULL
) и eventSink (который будет почти всегда быть this
). Так что строка должна выглядеть так:
Draw_Panel ->Connect(wxEVT_PAINT, wxPaintEventHandler(MyFrame::OnPaint),NULL,this);
Вы не показываете свой конструктор, поэтому, исходя из предыдущих вопросов, я предполагаю, что это выглядит так
MyFrame::MyFrame...
Info_Panel = new wxPanel(this, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxTAB_TRAVERSAL, _T(""));
Initialize_Project_Info();
Initialize_Draw_Input();
}
Я предполагаю, что Final_Layout - это то, что в предыдущих вопросах называлось Info_Panel. Однако вы можете заметить, что это приводит к тому, что 2 панели рисуются друг на друге. Чтобы обойти это, добавьте еще 1 sizer к MyFrame
MyFrame::MyFrame....
wxBoxSizer* MainSizer = new wxBoxSizer(wxHORIZONTAL);
Info_Panel = new wxPanel(this, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxTAB_TRAVERSAL, _T(""));
Initialize_Project_Info();
Initialize_Draw_Input();
Info_Panel->Fit();
MainSizer->Add(Info_Panel,wxSizerFlags(0));
MainSizer->Add(Draw_Panel,wxSizerFlags(1).Expand());
SetSizer(MainSizer);
}
. Это создаст этот макет:
Обратите внимание на этот уродливый прямоугольник в левом нижнем углу. Это фон рамки. Чтобы избавиться от этого, вы можете добавить еще 1 панель к вашему классу. Я назову это
framePanel
, но это можно назвать как угодно. Тогда
framePanel
будет единственным потомком вашего фрейма, а остальные 2 панели будут потомками
framePanel
.
Так что новый конструктор может выглядеть так:
MyFrame::MyFrame
wxBoxSizer* MainSizer = new wxBoxSizer(wxHORIZONTAL);
framePanel = new wxPanel(this, wxID_ANY);
Info_Panel = new wxPanel(framePanel, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxTAB_TRAVERSAL, _T(""));
Initialize_Project_Info();
Initialize_Draw_Input();
Info_Panel->Fit();
MainSizer->Add(Info_Panel,wxSizerFlags(0));
MainSizer->Add(Draw_Panel,wxSizerFlags(1).Expand());
framePanel->SetSizer(MainSizer);
}
И вам также следует изменить определение для Draw_Panel
, чтобы новый родитель был таким:
Draw_Panel = new wxPanel(framePanel, wxID_ANY);
В конечном итоге это дает такой макет:
Вот почему в ответ на ваш предыдущий вопрос была включена часть
Хотя вы можете размещать элементы управления непосредственно в wxFrame из-за «обхода табуляции» и типичных фоновых функций ОС вам лучше использовать wxPanel.
На основе редактирования с помощью блока stati c вокруг панели рисования сначала необходимо создать классификатор box stati c, а затем создать панель как дочерний элемент блока stati c:
void MyFrame::Initialize_Draw_Input() {
Draw_StaticBox = new wxStaticBoxSizer(wxHORIZONTAL, Final_Panel, _T("Cross Section"));
Draw_Panel = new wxPanel(Draw_StaticBox->GetStaticBox(), wxID_ANY,wxDefaultPosition,wxSize(1000,1000),wxTAB_TRAVERSAL,"");
Draw_Sizer = new wxBoxSizer(wxHORIZONTAL);
Draw_Panel->Connect(wxEVT_PAINT, wxPaintEventHandler(MyFrame::OnPaint), NULL, this);
wxStaticText* x = new wxStaticText(Draw_StaticBox->GetStaticBox(),wxID_ANY,"");
Draw_Sizer->Add(x);
Draw_StaticBox->Add(Draw_Panel,wxSizerFlags(1).Expand());
Draw_StaticBox->Add(Draw_Sizer,wxSizerFlags().Expand());
}
Прямо сейчас ни Draw_Sizer
, ни пустой текст c text x
, кажется, не служат какой-либо цели, но я предполагаю, что они являются держателями для чего-то, что придет позже.
Наконец, вам нужно изменить конструктор, добавив Draw_StaticBox
к Output_and_Draw_vSizer
вместо Draw_Panel
. ie изменить
Output_and_Draw_vSizer->Add(Draw_Panel, wxSizerFlags(1).Expand().Border(wxLEFT| wxBOTTOM | wxRIGHT));
на
Output_and_Draw_vSizer->Add(Draw_StaticBox, wxSizerFlags(1).Expand().Border(wxLEFT| wxBOTTOM | wxRIGHT));