FIX: button handle key event

Change-Id: If3ecd2356e516105c2054c9b85a122f3ccc72d91
This commit is contained in:
chunmao.guo 2022-07-29 11:18:33 +08:00 committed by Lane.Wei
parent 6c4b1f79da
commit a74fb14613
6 changed files with 59 additions and 9 deletions

View file

@ -7,6 +7,8 @@ BEGIN_EVENT_TABLE(Button, StaticBox)
EVT_LEFT_DOWN(Button::mouseDown)
EVT_LEFT_UP(Button::mouseReleased)
EVT_KEY_DOWN(Button::keyDownUp)
EVT_KEY_UP(Button::keyDownUp)
// catch paint events
EVT_PAINT(Button::paintEvent)
@ -241,9 +243,46 @@ void Button::mouseReleased(wxMouseEvent& event)
}
}
void Button::keyDownUp(wxKeyEvent &event)
{
if (event.GetKeyCode() == WXK_SPACE || event.GetKeyCode() == WXK_RETURN) {
wxMouseEvent evt(event.GetEventType() == wxEVT_KEY_UP ? wxEVT_LEFT_UP : wxEVT_LEFT_DOWN);
event.SetEventObject(this);
GetEventHandler()->ProcessEvent(evt);
return;
}
event.Skip();
}
void Button::sendButtonEvent()
{
wxCommandEvent event(wxEVT_COMMAND_BUTTON_CLICKED, GetId());
event.SetEventObject(this);
GetEventHandler()->ProcessEvent(event);
}
#ifdef __WIN32__
WXLRESULT Button::MSWWindowProc(WXUINT nMsg, WXWPARAM wParam, WXLPARAM lParam)
{
if (nMsg == WM_GETDLGCODE) { return DLGC_WANTMESSAGE; }
if (nMsg == WM_KEYDOWN) {
wxKeyEvent event(CreateKeyEvent(wxEVT_KEY_DOWN, wParam, lParam));
switch (wParam) {
case WXK_RETURN: {
GetEventHandler()->ProcessEvent(event);
return 0;
}
case WXK_TAB:
case WXK_LEFT:
case WXK_RIGHT:
case WXK_UP:
case WXK_DOWN:
if (HandleAsNavigationKey(event))
return 0;
}
}
return wxWindow::MSWWindowProc(nMsg, wParam, lParam);
}
#endif

View file

@ -47,6 +47,11 @@ public:
void Rescale();
protected:
#ifdef __WIN32__
WXLRESULT MSWWindowProc(WXUINT nMsg, WXWPARAM wParam, WXLPARAM lParam) override;
#endif
private:
void paintEvent(wxPaintEvent& evt);
@ -57,6 +62,7 @@ private:
// some useful events
void mouseDown(wxMouseEvent& event);
void mouseReleased(wxMouseEvent& event);
void keyDownUp(wxKeyEvent &event);
void sendButtonEvent();

View file

@ -248,9 +248,11 @@ void ComboBox::keyDown(wxKeyEvent& event) {
break;
case WXK_UP:
case WXK_DOWN:
if (event.GetKeyCode() == WXK_UP && GetSelection() > 0) {
case WXK_LEFT:
case WXK_RIGHT:
if ((event.GetKeyCode() == WXK_UP || event.GetKeyCode() == WXK_LEFT) && GetSelection() > 0) {
SetSelection(GetSelection() - 1);
} else if (event.GetKeyCode() == WXK_DOWN && GetSelection() + 1 < texts.size()) {
} else if ((event.GetKeyCode() == WXK_DOWN || event.GetKeyCode() == WXK_RIGHT) && GetSelection() + 1 < texts.size()) {
SetSelection(GetSelection() + 1);
} else {
break;
@ -263,6 +265,9 @@ void ComboBox::keyDown(wxKeyEvent& event) {
GetEventHandler()->ProcessEvent(e);
}
break;
case WXK_TAB:
HandleAsNavigationKey(event);
break;
default:
event.Skip();
break;