绑定 wxEVT_CHAR_HOOK 在 wxWidgets 3.1.2 中不起作用
Binding wxEVT_CHAR_HOOK not working in wxWidgets 3.1.2
我试图在每次按下某个键时调用一个函数。出于某种原因,我无法将 wxEVT_CHAR_HOOK 事件绑定到函数。
创建按钮并在按下按钮时将按钮绑定到函数没有任何问题。
我正在使用 Visual Studio 2017 和 wxWidgets 3.1.2
我已经尝试将 wxEVT_CHAR_HOOK 与 wxEVT_KEY_DOWN 进行交换,但这行不通。
但是,将相同的函数与另一个事件(如 wxEVT_BUTTON)绑定是可行的。
enum
{
ID_Hello = wxID_HIGHEST + 1,
ID_Button1 = wxID_HIGHEST + 2,
ID_Panel1 = wxID_HIGHEST + 3
};
wxIMPLEMENT_APP(MyApp);
bool MyApp::OnInit()
{
MyFrame *frame = new MyFrame();
frame->Show(true);
return true;
}
MyFrame::MyFrame() : wxFrame(NULL, wxID_ANY, "Hello World")
{
panel1 = new wxPanel(this, ID_Panel1, wxDefaultPosition, wxDefaultSize);
wxSize buttonSizeHelloWorld = wxSize(200, 200);
wxPoint buttonPosHelloWorld = wxPoint(50, 50);
HelloWorldButton = new wxButton(panel1, ID_Button1,
"Hello", buttonPosHelloWorld, buttonSizeHelloWorld);
//These work fine
Bind(wxEVT_MENU, &MyFrame::OnHello, this, ID_Hello);
Bind(wxEVT_BUTTON, &MyFrame::OnExit, this, ID_Button1);
//This is what fails
Bind(wxEVT_CHAR_HOOK, &MyFrame::ProcessKeypress, this);
}
void MyFrame::ProcessKeypress(wxCommandEvent& event) {
wxLogMessage("A key was pressed");
}
void MyFrame::OnHello(wxCommandEvent& event)
{
wxLogMessage("Hello world from wxWidgets!");
}
void MyFrame::OnExit(wxCommandEvent& event)
{
Close(true);
}
错误信息(我搜索过但没有找到有用的信息):
C2664 "void wxEventFunctorMethod::CheckHandlerArgument(EventArg *)":无法将 "wxKeyEvent *" 的参数 1 转换为 "EventArg *"(event.h -> 行:374)
wxEVT_CHAR_HOOK
的处理程序必须采用 wxKeyEvent&
参数而不是 wxCommandEvent&
并且错误消息告诉您正是这样(您还应该看到 EventArg
是wxCommandEvent
在编译器输出中)。
我试图在每次按下某个键时调用一个函数。出于某种原因,我无法将 wxEVT_CHAR_HOOK 事件绑定到函数。 创建按钮并在按下按钮时将按钮绑定到函数没有任何问题。 我正在使用 Visual Studio 2017 和 wxWidgets 3.1.2
我已经尝试将 wxEVT_CHAR_HOOK 与 wxEVT_KEY_DOWN 进行交换,但这行不通。 但是,将相同的函数与另一个事件(如 wxEVT_BUTTON)绑定是可行的。
enum
{
ID_Hello = wxID_HIGHEST + 1,
ID_Button1 = wxID_HIGHEST + 2,
ID_Panel1 = wxID_HIGHEST + 3
};
wxIMPLEMENT_APP(MyApp);
bool MyApp::OnInit()
{
MyFrame *frame = new MyFrame();
frame->Show(true);
return true;
}
MyFrame::MyFrame() : wxFrame(NULL, wxID_ANY, "Hello World")
{
panel1 = new wxPanel(this, ID_Panel1, wxDefaultPosition, wxDefaultSize);
wxSize buttonSizeHelloWorld = wxSize(200, 200);
wxPoint buttonPosHelloWorld = wxPoint(50, 50);
HelloWorldButton = new wxButton(panel1, ID_Button1,
"Hello", buttonPosHelloWorld, buttonSizeHelloWorld);
//These work fine
Bind(wxEVT_MENU, &MyFrame::OnHello, this, ID_Hello);
Bind(wxEVT_BUTTON, &MyFrame::OnExit, this, ID_Button1);
//This is what fails
Bind(wxEVT_CHAR_HOOK, &MyFrame::ProcessKeypress, this);
}
void MyFrame::ProcessKeypress(wxCommandEvent& event) {
wxLogMessage("A key was pressed");
}
void MyFrame::OnHello(wxCommandEvent& event)
{
wxLogMessage("Hello world from wxWidgets!");
}
void MyFrame::OnExit(wxCommandEvent& event)
{
Close(true);
}
错误信息(我搜索过但没有找到有用的信息):
C2664 "void wxEventFunctorMethod::CheckHandlerArgument(EventArg *)":无法将 "wxKeyEvent *" 的参数 1 转换为 "EventArg *"(event.h -> 行:374)
wxEVT_CHAR_HOOK
的处理程序必须采用 wxKeyEvent&
参数而不是 wxCommandEvent&
并且错误消息告诉您正是这样(您还应该看到 EventArg
是wxCommandEvent
在编译器输出中)。