C+中的面板类模块初始化+;GUIapp 我是C++和WxWIDGET的新手,使用WXFrimeBu建器帮助我创建GUI。

C+中的面板类模块初始化+;GUIapp 我是C++和WxWIDGET的新手,使用WXFrimeBu建器帮助我创建GUI。,c++,wxwidgets,C++,Wxwidgets,我喜欢将类似的功能放在一个模块中,这意味着我的应用程序有多个模块。 其中一个模块用于GUI(它现在包含主框架的代码(只有一个菜单和任务栏)和 一个面板(带有两个静态文本控件和一个按钮)。 按钮增加一个计数器,数值显示在面板上的一个静态文本中 如此之好。(编译无误) 我可以使面板显示/隐藏,但我似乎错过了使面板按钮工作的基本知识。 我尝试过的方法都与主模块的编码方式相似,但都不起作用 我了解它如何与同一文件中的GUI类元素一起工作。 但是,我喜欢将所有GUI代码保存在一个模块(GUIFrame.h

我喜欢将类似的功能放在一个模块中,这意味着我的应用程序有多个模块。 其中一个模块用于GUI(它现在包含主框架的代码(只有一个菜单和任务栏)和 一个面板(带有两个静态文本控件和一个按钮)。 按钮增加一个计数器,数值显示在面板上的一个静态文本中

如此之好。(编译无误) 我可以使面板显示/隐藏,但我似乎错过了使面板按钮工作的基本知识。 我尝试过的方法都与主模块的编码方式相似,但都不起作用

我了解它如何与同一文件中的GUI类元素一起工作。 但是,我喜欢将所有GUI代码保存在一个模块(GUIFrame.h/.cpp)中, 以及面板模块(MyPanel.h/.cpp)中的所有“功能”代码

只是因为我不确定我在哪里犯了错误,我在这篇文章中展示了所有代码。 如果太多的话,我会告诉你

希望有人能帮助我弥合我对这种工作方式的认识差距

问候,, 路德

==GUIFrame.h

#pragma once
#include <wx/artprov.h>
#include <wx/xrc/xmlres.h>
#include <wx/string.h>
#include <wx/bitmap.h>
#include <wx/image.h>
#include <wx/icon.h>
#include <wx/menu.h>
#include <wx/gdicmn.h>
#include <wx/font.h>
#include <wx/colour.h>
#include <wx/settings.h>
#include <wx/statusbr.h>
#include <wx/frame.h>
#include <wx/stattext.h>
#include <wx/button.h>
#include <wx/sizer.h>
#include <wx/panel.h>
///////////////////////////////////////////////////////////////////////////
#define idMenuQuit 1000
///////////////////////////////////////////////////////////////////////////////
/// Class GUIFrame
///////////////////////////////////////////////////////////////////////////////
class GUIFrame : public wxFrame
{
    private:

    protected:
        wxMenuBar* mbar;
        wxMenu* mainMenu;
        wxStatusBar* statusBar;

        // Virtual event handlers, overide them in your derived class
        virtual void OnClose( wxCloseEvent& event ) { event.Skip(); }
        virtual void m_menuItemPanelMainOnMenuSelection( wxCommandEvent& event ) { event.Skip(); }
        virtual void OnQuit( wxCommandEvent& event ) { event.Skip(); }

    public:

        GUIFrame( wxWindow* parent, wxWindowID id = wxID_ANY, const wxString& title = wxT("Test application"), const wxPoint& pos = wxDefaultPosition, const wxSize& size = wxSize( 500,500 ), long style = wxDEFAULT_FRAME_STYLE );
        ~GUIFrame();

};
///////////////////////////////////////////////////////////////////////////////
/// Class PanelMAIN
///////////////////////////////////////////////////////////////////////////////
class PanelMAIN : public wxPanel
{
    private:

    protected:
        wxStaticText* m_staticText3;

        // Virtual event handlers, overide them in your derived class
        virtual void m_btn_Counter_OnButtonClick( wxCommandEvent& event ) { event.Skip(); }

    public:
        wxStaticText* m_staticTextPMain;
        wxButton* m_buttonPMain;

        PanelMAIN( wxWindow* parent, wxWindowID id = wxID_ANY, const wxPoint& pos = wxPoint( 3,3 ), const wxSize& size = wxSize( 350,300 ), long style = wxBORDER_RAISED, const wxString& name = wxEmptyString );
        ~PanelMAIN();

};
==wxPanelMain.h

#ifndef WXPANELMAIN_H
#define WXPANELMAIN_H
#include "wxPanelApp.h"
#include "GUIFrame.h"
#include "MyPanel.h"
#include <iostream>
class wxPanelFrame: public GUIFrame
{
    public:
        wxPanelFrame(wxFrame *frame);
        ~wxPanelFrame();

        wxPanel *m_wxpMain = new PanelMAIN(this, wxID_ANY);

    private:
        virtual void OnClose(wxCloseEvent& event);
        virtual void OnQuit(wxCommandEvent& event);

        void m_menuItemPanelMainOnMenuSelection( wxCommandEvent& event );
};
#endif // WXPANELMAIN_H
==MyPanel.h

#ifndef MYPANEL_H
#define MYPANEL_H
#include "GUIFrame.h"
#include <iostream>
class MyPanel : public PanelMAIN
{
    public:
        MyPanel(wxPanel *panel);
        virtual ~MyPanel();

        int i{0};

    protected:

    private:
        void m_btn_Counter_OnButtonClick( wxCommandEvent& event );

};
#endif // MYPANEL_H
#如果取消我的面板#
#定义MYPANEL_H
#包括“GUIFrame.h”
#包括
类MyPanel:PublicPanelMain
{
公众:
MyPanel(wxPanel*面板);
虚拟~MyPanel();
int i{0};
受保护的:
私人:
无效m_btn_计数器按钮单击(wxCommandEvent&event);
};
#endif//MYPANEL\u H
==MyPanel.cpp

#include "MyPanel.h"
MyPanel::MyPanel(wxPanel *panel) : PanelMAIN(panel)
{
    std::cout << "MyPanel::MyPanel /*CONSTRUCTOR*/\n";
}

MyPanel::~MyPanel()
{
    std::cout << "MyPanel::~MyPanel /*DESTRUCTOR*/\n";
}

void MyPanel::m_btn_Counter_OnButtonClick( wxCommandEvent& event )
{
    wxString wxs_Count{};
    i++;
    wxs_Count << i;
    m_staticText3->SetLabelText(wxs_Count);
}
#包括“MyPanel.h”
MyPanel::MyPanel(wxPanel*panel):PanelMAIN(panel)
{

std::cout在派生类MyPanel中定义事件处理程序,但从未创建它的实例

wxPanel *m_wxpMain = new PanelMAIN(this, wxID_ANY);
仅在基类的对象上创建

你应该把这个改成

MyPanel *m_wxpMain = new MyPanel(this);
MyPanel的构造函数也有问题。父项必须是
wxWindow
而不是
wxPanel
。因此声明应该类似于

MyPanel(wxWindow *panel);
MyPanel::MyPanel(wxWindow *panel) : PanelMAIN(panel)
{
    std::cout << "MyPanel::MyPanel /*CONSTRUCTOR*/\n";
}
身体应该看起来像

MyPanel(wxWindow *panel);
MyPanel::MyPanel(wxWindow *panel) : PanelMAIN(panel)
{
    std::cout << "MyPanel::MyPanel /*CONSTRUCTOR*/\n";
}
MyPanel::MyPanel(wxWindow*panel):PanelMAIN(panel)
{

天哪,我离正确的代码如此之近,但又如此之远。我现在知道我的想法在哪里出现了错误。谢谢你的澄清。
MyPanel(wxWindow *panel);
MyPanel::MyPanel(wxWindow *panel) : PanelMAIN(panel)
{
    std::cout << "MyPanel::MyPanel /*CONSTRUCTOR*/\n";
}