0

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

1 回答 1

0

如果您实际上将菜单项附加到菜单栏,则此代码肯定可以工作,因此您可以单击它(正如@New Pagodi 已经提到的)。正如@macroland 所提到的,你不需要wxCommandEventHandlerwith Bind(),使用它可以隐藏潜在的错误(即使这里不是这种情况)。推荐和更简单的方法是将这一行写成:

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

但是,再次显示的代码确实有效,因此您确实需要显示您使用的实际代码,因为您似乎在简化问题的同时以某种方式解决了问题。当然,既然您已经修复了它,您也应该能够很容易地自己找到问题,只需将您在此处发布的版本与您拥有的版本进行比较。

于 2021-11-20T17:21:29.647 回答