From 242ec2f7e9e964025400a72581dfa9762850e98b Mon Sep 17 00:00:00 2001 From: Vadim Zeitlin Date: Sun, 14 Sep 2008 19:50:30 +0000 Subject: [PATCH] really, really fix handling Enter in spin controls: only request it for the control if wxTE_PROCESS_ENTER is used to avoid breaking the use of Enter for the default item activation if it isn't; also document wxTE_PROCESS_ENTER style for wxSpinCtrl and add it to the sample git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@55617 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775 --- interface/wx/spinctrl.h | 9 +++++++-- samples/widgets/spinbtn.cpp | 21 +++++++++++++-------- src/msw/spinctrl.cpp | 16 ++++++++++++++-- 3 files changed, 34 insertions(+), 12 deletions(-) diff --git a/interface/wx/spinctrl.h b/interface/wx/spinctrl.h index ce25c046a8..5e59c4c85f 100644 --- a/interface/wx/spinctrl.h +++ b/interface/wx/spinctrl.h @@ -14,9 +14,14 @@ @beginStyleTable @style{wxSP_ARROW_KEYS} - The user can use arrow keys to change the value. + The user can use arrow keys to change the value. @style{wxSP_WRAP} - The value wraps at the minimum and maximum. + The value wraps at the minimum and maximum. + @style{wxTE_PROCESS_ENTER} + Indicates that the control should generate wxEVT_COMMAND_TEXT_ENTER + events. Using this style will prevent the user from using the Enter key + for dialog navigation (e.g. activating the default button in the + dialog) under MSW. @endStyleTable @library{wxcore} diff --git a/samples/widgets/spinbtn.cpp b/samples/widgets/spinbtn.cpp index 722b024027..3f1ebdbc5f 100644 --- a/samples/widgets/spinbtn.cpp +++ b/samples/widgets/spinbtn.cpp @@ -127,7 +127,8 @@ protected: // the check/radio boxes for styles wxCheckBox *m_chkVert, - *m_chkWrap; + *m_chkWrap, + *m_chkProcessEnter; // the spinbtn and the spinctrl and the sizer containing them wxSpinButton *m_spinbtn; @@ -195,6 +196,7 @@ SpinBtnWidgetsPage::SpinBtnWidgetsPage(WidgetsBookCtrl *book, { m_chkVert = NULL; m_chkWrap = NULL; + m_chkProcessEnter = NULL; m_spinbtn = NULL; m_spinctrl = NULL; m_spinctrldbl = NULL; @@ -202,15 +204,10 @@ SpinBtnWidgetsPage::SpinBtnWidgetsPage(WidgetsBookCtrl *book, m_textMin = NULL; m_textMax = NULL; - // init everything m_min = 0; m_max = 10; - m_chkVert = - m_chkWrap = (wxCheckBox *)NULL; - - m_spinbtn = (wxSpinButton *)NULL; - m_sizerSpin = (wxSizer *)NULL; + m_sizerSpin = NULL; } void SpinBtnWidgetsPage::CreateContent() @@ -223,6 +220,8 @@ void SpinBtnWidgetsPage::CreateContent() m_chkVert = CreateCheckBoxAndAddToSizer(sizerLeft, _T("&Vertical")); m_chkWrap = CreateCheckBoxAndAddToSizer(sizerLeft, _T("&Wrap")); + m_chkProcessEnter = CreateCheckBoxAndAddToSizer(sizerLeft, + _T("Process &Enter")); sizerLeft->Add(5, 5, 0, wxGROW | wxALL, 5); // spacer @@ -287,6 +286,7 @@ void SpinBtnWidgetsPage::Reset() { m_chkVert->SetValue(true); m_chkWrap->SetValue(false); + m_chkProcessEnter->SetValue(false); } void SpinBtnWidgetsPage::CreateSpin() @@ -302,6 +302,9 @@ void SpinBtnWidgetsPage::CreateSpin() if ( m_chkWrap->GetValue() ) flags |= wxSP_WRAP; + if ( m_chkProcessEnter->GetValue() ) + flags |= wxTE_PROCESS_ENTER; + int val = m_min; if ( m_spinbtn ) { @@ -426,7 +429,9 @@ void SpinBtnWidgetsPage::OnUpdateUIMinMaxButton(wxUpdateUIEvent& event) void SpinBtnWidgetsPage::OnUpdateUIResetButton(wxUpdateUIEvent& event) { - event.Enable( !m_chkVert->GetValue() || m_chkWrap->GetValue() ); + event.Enable( !m_chkVert->GetValue() || + m_chkWrap->GetValue() || + m_chkProcessEnter->GetValue() ); } void SpinBtnWidgetsPage::OnCheckOrRadioBox(wxCommandEvent& WXUNUSED(event)) diff --git a/src/msw/spinctrl.cpp b/src/msw/spinctrl.cpp index 20df40a30e..05965d0c3d 100644 --- a/src/msw/spinctrl.cpp +++ b/src/msw/spinctrl.cpp @@ -175,8 +175,20 @@ LRESULT APIENTRY _EXPORT wxBuddyTextWndProc(HWND hwnd, break; case WM_GETDLGCODE: - // we want to get WXK_RETURN in order to generate the event for it - return DLGC_WANTALLKEYS; + if ( spin->HasFlag(wxTE_PROCESS_ENTER) ) + { + long dlgCode = ::CallWindowProc + ( + CASTWNDPROC spin->GetBuddyWndProc(), + hwnd, + message, + wParam, + lParam + ); + dlgCode |= DLGC_WANTMESSAGE; + return dlgCode; + } + break; } return ::CallWindowProc(CASTWNDPROC spin->GetBuddyWndProc(),