From: Václav Slavík Date: Sun, 1 Aug 2010 10:11:53 +0000 (+0000) Subject: Fix Tab navigation when focused control is disabled. X-Git-Url: https://git.saurik.com/wxWidgets.git/commitdiff_plain/0826c4d39a53f8691b9430207420e9d9e175a73f Fix Tab navigation when focused control is disabled. git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@65154 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775 --- diff --git a/include/wx/msw/window.h b/include/wx/msw/window.h index 33b4354107..9557141e5f 100644 --- a/include/wx/msw/window.h +++ b/include/wx/msw/window.h @@ -590,6 +590,8 @@ protected: int& x, int& y, int& w, int& h) const; + bool MSWEnableHWND(WXHWND hWnd, bool enable); + private: // common part of all ctors void Init(); diff --git a/src/msw/radiobox.cpp b/src/msw/radiobox.cpp index 8c8b204158..634d598476 100644 --- a/src/msw/radiobox.cpp +++ b/src/msw/radiobox.cpp @@ -403,7 +403,7 @@ bool wxRadioBox::Enable(unsigned int item, bool enable) wxCHECK_MSG( IsValid(item), false, wxT("invalid item in wxRadioBox::Enable()") ); - BOOL ret = ::EnableWindow((*m_radioButtons)[item], enable); + BOOL ret = MSWEnableHWND((*m_radioButtons)[item], enable); return (ret == 0) != enable; } diff --git a/src/msw/spinctrl.cpp b/src/msw/spinctrl.cpp index 80416bf320..bb867d36a8 100644 --- a/src/msw/spinctrl.cpp +++ b/src/msw/spinctrl.cpp @@ -625,7 +625,7 @@ bool wxSpinCtrl::Enable(bool enable) return false; } - ::EnableWindow(GetBuddyHwnd(), enable); + MSWEnableHWND(GetBuddyHwnd(), enable); return true; } diff --git a/src/msw/window.cpp b/src/msw/window.cpp index 5dd89b0bc3..3bc63109eb 100644 --- a/src/msw/window.cpp +++ b/src/msw/window.cpp @@ -699,9 +699,21 @@ wxWindow *wxWindowBase::DoFindFocus() void wxWindowMSW::DoEnable( bool enable ) { - HWND hWnd = GetHwnd(); - if ( hWnd ) - ::EnableWindow(hWnd, (BOOL)enable); + MSWEnableHWND(GetHwnd(), enable); +} + +bool wxWindowMSW::MSWEnableHWND(WXHWND hWnd, bool enable) +{ + if ( !hWnd ) + return false; + + // If disabling focused control, we move focus to the next one, as if the + // user pressed Tab. That's because we can't keep focus on a disabled + // control, Tab-navigation would stop working then. + if ( !enable && ::GetFocus() == hWnd ) + Navigate(); + + return ::EnableWindow(hWnd, (BOOL)enable); } bool wxWindowMSW::Show(bool show)