Windows 11、VS Studio 19 wx 版本 3.1.5
我使用 wx Form Builder 生成代码,然后是继承类(一次),但是每当我单击菜单项(m_Mod)时,它都不会调用派生类函数(应该创建一个带有文本“CALLED”的消息框,但什么也没有出现),据我所知,这就是它的工作方式。
我尝试添加覆盖,将事件设置为 Connect 和 Table,以及 impl_virtual、decl 和纯虚拟,经过一个小时的搜索后没有任何重大帮助。
(如果我将代码放在它确实运行的 cMainFrame 函数声明中,而不是当它在 cMain 派生类函数中时)
完整代码位于:https ://github.com/Miitto/Arma-Mod-Assistant
cGUI.h(wxFormBuilder 生成,去除了一些杂乱)
class cMainFrame : public wxFrame
{
protected:
wxMenuBar* m_menuBar;
wxMenu* m_file;
wxMenu* m_New;
virtual void newMod( wxCommandEvent &event) {event.Skip();}
cMainFrame( wxWindow* parent, wxWindowID id = id_mainFrame, const wxString& title = wxEmptyString, const wxPoint& pos = wxDefaultPosition, const wxSize& size = wxSize( 1920,1080 ), long style = wxDEFAULT_FRAME_STYLE|wxTAB_TRAVERSAL );
wxAuiManager m_mgr;
~cMainFrame();
};
图形用户界面.cpp
cMainFrame::cMainFrame( wxWindow* parent, wxWindowID id, const wxString& title, const wxPoint& pos, const wxSize& size, long style ) : wxFrame( parent, id, title, pos, size, style )
{
this->SetSizeHints( wxDefaultSize, wxDefaultSize );
m_mgr.SetManagedWindow(this);
m_mgr.SetFlags(wxAUI_MGR_DEFAULT);
m_menuBar = new wxMenuBar( 0 );
m_file = new wxMenu();
m_New = new wxMenu();
wxMenuItem* m_NewItem = new wxMenuItem( m_file, wxID_ANY, wxT("New"), wxEmptyString, wxITEM_NORMAL, m_New );
wxMenuItem* m_Mod;
m_Mod = new wxMenuItem( m_New, id_newModMenu, wxString( wxT("Mod") ) , wxEmptyString, wxITEM_NORMAL );
m_New->Append( m_Mod );
m_mgr.Update();
this->Centre( wxBOTH );
// Connect Events
m_New->Bind(wxEVT_COMMAND_MENU_SELECTED, wxCommandEventHandler( cMainFrame::newMod ), this, m_Mod->GetId());
}
cMain.h(由 wxFormsBuilder 生成的继承类)
#ifndef __cMain__
#define __cMain__
#include "cGUI.h"
class cMain : public cMainFrame
{
protected:
// Handlers for cMainFrame events.
void newMod( wxCommandEvent& event );
public:
cMain( wxWindow* parent);
}
#endif
cMain.cpp
#include "cMain.h"
#include <wx/msgdlg.h>
cMain::cMain( wxWindow* parent )
:
cMainFrame( parent )
{
}
void cMain::newMod( wxCommandEvent& event )
{
wxMessageBox(wxT("CALLED"));
event.Skip();
}