【问题标题】:Interaction between wxPanel and wxFramewxPanel 和 wxFrame 之间的交互
【发布时间】:2020-04-24 20:06:24
【问题描述】:

我试图了解 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,则此代码有效。如果我在 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 初始化)会改变结果?

【问题讨论】:

  • 请定义 doesn't work 的含义。另外我没看到你在第一个代码 sn-p 中初始化 Info_Panel...
  • @Igor 请看这里imgur.com/a/F3qfiZO上面的代码代表“不起作用”,我在构造函数中初始化了Info_Panel
  • 听起来您在面板没有“工作”时创建了两次。您在构造函数中有一行,在另一个函数中有 2 行,可以创建一个wxPanel。您确定只有 一个 在使用,而其余的都被注释掉了吗?
  • 有时候编程很奇怪。在我的代码中,我有一个名为 InitMenu() 的函数来初始化程序菜单,我没有在上面显示它。所以,我尝试将 Info_Panel 的初始化移到 InitMenu() 之后,结果程序现在可以运行了。这太奇怪了。

标签: c++ wxwidgets


【解决方案1】:

来自wx docs

frame 是一个窗口,其大小和位置(通常)可以更改 由用户。
它通常有粗边框和标题栏,并且可以 可选地包含菜单栏、工具栏和状态栏。

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

wxWindow 是任何类型的窗口都使用的泛型类。 wxDialog主要用作用户输入数据的表单。

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

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

这个面板是 主 wxFrame 的子,您可以在 wxFrame 的 ctor 处构建它。 因为在 wxWidgets 中,如果一个 wxFrame 有一个唯一的子级,那么这个子级会被扩展以适应 wxFrame 的整个客户端大小,那么您就不要使用 wxsizers 来进行这种面板到框架的拟合。

当您创建控件时(例如在 wxPanel ctor 中),您将此 wxPanel 设置为控件的父级。并使用 sizers 将它们布局到面板中。

所以每个控件都有你的面板作为父级;您的面板将框架作为父级。不要忘记“this”指针可以用作父级,或者将父级作为参数传递给创建窗口(面板、控件)的函数。

最后,指向任何 wxWindow 派生类的指针都是用“new”创建的,但您不需要删除它们,wxWigets 内部会处理它们的删除。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-09-06
    • 2016-11-11
    • 2016-05-15
    • 2015-03-31
    • 2014-06-28
    • 2015-07-17
    • 1970-01-01
    相关资源
    最近更新 更多