wxWidgets/wx窗体生成器继承类事件



Windows 11,VS Studio 19wx 3.1.5版

我使用wx Form Builder生成代码,然后生成继承类(一次(,但每当我单击菜单项(m_Mod(时,它都不会调用派生类函数(应该创建一个带有文本"CALLED"的消息框,但什么都没有显示(,从我所看到的情况来看,这就是它的工作方式。

我尝试添加override,将事件设置为Connect和Table,以及impl_virtual、decl和pure-virtual,经过一个小时的搜索,没有任何重大帮助。

(如果我把代码放在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();
};

cGUI.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();
}

如果你真的把菜单项附加到菜单栏上,这样你就可以点击它(@New Pagodi已经提到过(,这个代码肯定会起作用。正如@mmacroland所提到的,你不需要wxCommandEventHandlerBind(),使用它可以隐藏潜在的错误(尽管这里不是这样(。推荐的更简单的方法是将这行写为:

m_New->Bind(wxEVT_MENU, &cMainFrame::newMod, this, m_Mod->GetId());

但是,同样,所示的代码确实有效,所以你真的需要显示你使用的实际代码,因为你似乎在简化问题的同时以某种方式解决了问题。当然,既然你已经解决了问题,你也应该能够通过将你在这里发布的版本与你现有的版本进行比较来轻松地自己找到问题。

从cMainFrame继承的cMain对象不会在完整代码中的任何位置创建。cApp类应按如下所示进行修改。

cApp.h

#include "cMain.h"
class cApp : public wxApp
{
//...
public:
cMain* m_main = nullptr;
//...
}

cApp.cpp

bool cApp::OnInit()
{
m_main = new cMain(nullptr);
m_main->Show();
return true;
}

最新更新