wxPanel和wxFrame之间的交互。

问题描述 投票:0回答:1

我正试图了解wxFrame和wxPanel是如何一起工作的。我很难解释下面的代码行为。

我试图为我的应用程序设置GUI。我有一个创建数据输入表单的函数。

void MyFrame::Initialize_Project_Info() {


//Info_Panel = new wxPanel(this, wxID_ANY, wxDefaultPosition, wxSize(600, 1000), wxTAB_TRAVERSAL, _T(""));

//Info_Panel = new wxPanel(this, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxTAB_TRAVERSAL, _T(""));

Info_Box = new wxBoxSizer(wxHORIZONTAL);
Info_Staticbox = new wxStaticBoxSizer(wxHORIZONTAL, Info_Panel, _T("Project Information"));
Info_Grid = new wxFlexGridSizer(4, 2, 0, 0);


//Note wsSize(width,height).
Project_Name = new wxStaticText(Info_Panel, wxID_ANY, _T("Project:"));
Engineer_Name = new wxStaticText(Info_Panel, wxID_ANY, _T("Engineer:"));
CrossSection_Name = new wxStaticText(Info_Panel, wxID_ANY, _T("Cross Section ID:"));
Additional_Notes = new wxStaticText(Info_Panel, wxID_ANY, _T("Additional Notes:"));


Enter_PN = new wxTextCtrl(Info_Panel, ENTER_PN, wxEmptyString, wxDefaultPosition, wxDefaultSize, wxTE_PROCESS_ENTER | wxTE_PROCESS_TAB, wxDefaultValidator, _T(""));
Enter_EN = new wxTextCtrl(Info_Panel, wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, wxTE_PROCESS_ENTER | wxTE_PROCESS_TAB, wxDefaultValidator, _T(""));
Enter_CSN = new wxTextCtrl(Info_Panel, wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, wxTE_PROCESS_ENTER | wxTE_PROCESS_TAB, wxDefaultValidator, _T(""));
Enter_AN = new wxTextCtrl(Info_Panel, wxID_ANY, wxEmptyString, wxDefaultPosition, wxSize(250, 100), wxTE_PROCESS_ENTER | wxTE_PROCESS_TAB | wxTE_MULTILINE, wxDefaultValidator, _T(""));

Info_Grid->Add(Project_Name,
    wxSizerFlags().Align(wxALIGN_LEFT | wxALIGN_CENTER_VERTICAL)
    .Border(wxTOP | wxBOTTOM | wxLEFT));
Info_Grid->Add(Enter_PN, wxSizerFlags().Expand().Border(wxALL));
Info_Grid->Add(Engineer_Name,
    wxSizerFlags().Align(wxALIGN_LEFT | wxALIGN_CENTER_VERTICAL)
    .Border(wxBOTTOM | wxLEFT));
Info_Grid->Add(Enter_EN, wxSizerFlags().Expand().Border(wxBOTTOM | wxLEFT | wxRIGHT));
Info_Grid->Add(CrossSection_Name,
    wxSizerFlags().Align(wxALIGN_LEFT | wxALIGN_CENTER_VERTICAL)
    .Border(wxBOTTOM | wxLEFT));
Info_Grid->Add(Enter_CSN,
    wxSizerFlags().Expand().Border(wxBOTTOM | wxLEFT | wxRIGHT));
Info_Grid->Add(Additional_Notes,
    wxSizerFlags().Align(wxALIGN_LEFT).Border(wxBOTTOM | wxLEFT));
Info_Grid->Add(Enter_AN, wxSizerFlags().Expand().Border(wxBOTTOM | wxLEFT | wxRIGHT));

Info_Staticbox->Add(Info_Grid);
Info_Box->Add(Info_Staticbox, wxSizerFlags().Border(wxALL));
Info_Panel->SetSizer(Info_Box);

}

如果我只在函数的作用域中定义wxPanel时,将所有对象追加到wxPanel上,这段代码就会工作。如果我在 wxFrame 派生类的构造函数的范围内定义 wxPanel,则无法工作。

例如,这样做并不能按预期生成表单。

MyFrame::MyFrame() : wxFrame(NULL,wxID_ANY,"Cross Sectional Beam Properties",wxDefaultPosition,wxSize(1200,600),wxDEFAULT_FRAME_STYLE & ~(wxRESIZE_BORDER | wxMAXIMIZE_BOX)) {


Info_Panel = new wxPanel(this, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxTAB_TRAVERSAL, _T(""));


Initialize_Project_Info();

}

所以,我的问题是wxPanel如何与wxFrame接口。为什么移动一行代码(即 wxPanel 初始化)会改变结果?

c++ wxwidgets
1个回答
2
投票

wx docs:

A frame 是一个窗口,它的大小和位置(通常)可以由用户改变,它通常有厚厚的边框和标题栏,并可选择包含菜单栏、工具栏和状态栏。 它通常有厚厚的边框和标题栏,还可以选择包含菜单栏、工具栏和状态栏。

A panel 是一个放置控件的窗口。 它通常被放置在一个框架内。它比父类wxWindow的主要特点是处理子窗口和TAB遍历的代码。

wxWindow 是一个通用类,任何类型的窗口都可以使用。wxDialog 主要用作用户输入数据的窗体。

通常一个应用程序显示一个框架作为应用程序的主窗口。

==> 虽然你可以直接在wxFrame中放置控件,但由于 "TAB遍历 "和操作系统典型的背景功能,你最好使用wxPanel。

这个面板是一个 主wxFrame的子代 而且你可以在wxFrame的ctor中建立它.因为在wxWidgets中,如果一个wxFrame有一个独特的子代,那么这个子代就会被展开以适应整个wxFrame的客户端大小,那么你就不会使用wxsizers来实现这种面板到框架的拟合。

当您创建控件时(例如在wxPanel ctor),您可以将这个参数设置为 wxPanel作为控件的父节点. 并使用sizer将它们布局到面板中。

所以每个控件都以你的面板为父节点,而你的面板则以框架为父节点。不要忘了'this'指针可以作为父类使用,或者在创建窗口(面板、控件)的函数中把父类作为参数传递。

最后,任何wxWindow派生类的指针都是用 "new "创建的,但你不需要删除它们,wxWigets内部会负责删除它们。

© www.soinside.com 2019 - 2024. All rights reserved.