From: Julian Smart Date: Sun, 23 Oct 2005 10:53:16 +0000 (+0000) Subject: Applied patch [ 1307056 ] [wxMSW] Focus showing fix for Win2k/XP X-Git-Url: https://git.saurik.com/wxWidgets.git/commitdiff_plain/1ca78aa1dcbd491492aa8f191c4612d1eb740132?ds=sidebyside Applied patch [ 1307056 ] [wxMSW] Focus showing fix for Win2k/XP git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@35989 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775 --- diff --git a/include/wx/msw/missing.h b/include/wx/msw/missing.h index a27be621c6..fda8af03a7 100644 --- a/include/wx/msw/missing.h +++ b/include/wx/msw/missing.h @@ -34,6 +34,10 @@ #define WM_UPDATEUISTATE 0x0128 #endif +#ifndef WM_CHANGEUISTATE + #define WM_CHANGEUISTATE 0x0127 +#endif + #ifndef WM_PRINTCLIENT #define WM_PRINTCLIENT 0x318 #endif diff --git a/include/wx/msw/window.h b/include/wx/msw/window.h index bfd3cc190f..2a91ebb3c0 100644 --- a/include/wx/msw/window.h +++ b/include/wx/msw/window.h @@ -469,10 +469,13 @@ protected: // the background, false otherwise (i.e. the system should erase it) bool DoEraseBackground(WXHDC hDC); - // generate WM_UPDATEUISTATE if it's needed for the OS we're running under + // generate WM_CHANGEUISTATE if it's needed for the OS we're running under // - // the parameter should be one of UIS_XXX constants - void MSWUpdateUIState(int action); + // action should be one of the UIS_XXX constants + // state should be one or more of the UISF_XXX constants + // if action == UIS_INITIALIZE then it doesn't seem to matter what we use + // for state as the system will decide for us what needs to be set + void MSWUpdateUIState(int action, int state = 0); private: // common part of all ctors diff --git a/src/msw/window.cpp b/src/msw/window.cpp index 66fcdf4355..48d244b115 100644 --- a/src/msw/window.cpp +++ b/src/msw/window.cpp @@ -831,9 +831,9 @@ void wxWindowMSW::WarpPointer(int x, int y) } } -void wxWindowMSW::MSWUpdateUIState(int action) +void wxWindowMSW::MSWUpdateUIState(int action, int state) { - // WM_UPDATEUISTATE only appeared in Windows 2000 so it can do us no good + // WM_CHANGEUISTATE only appeared in Windows 2000 so it can do us no good // to use it on older systems -- and could possibly do some harm static int s_needToUpdate = -1; if ( s_needToUpdate == -1 ) @@ -845,11 +845,9 @@ void wxWindowMSW::MSWUpdateUIState(int action) if ( s_needToUpdate ) { - // NB: it doesn't seem to matter what we put in wParam, whether we - // include just one UISF_XXX or both, both are affected, no idea - // why - ::SendMessage(GetHwnd(), WM_UPDATEUISTATE, - MAKEWPARAM(action, UISF_HIDEFOCUS | UISF_HIDEACCEL), 0); + // we send WM_CHANGEUISTATE so if nothing needs changing then the system + // won't send WM_UPDATEUISTATE + ::SendMessage(GetHwnd(), WM_CHANGEUISTATE, MAKEWPARAM(action, state), 0); } } @@ -2106,9 +2104,8 @@ bool wxWindowMSW::MSWProcessMessage(WXMSG* pMsg) { // as we don't call IsDialogMessage(), which would take of // this by default, we need to manually send this message - // so that controls could change their appearance - // appropriately - MSWUpdateUIState(UIS_CLEAR); + // so that controls can change their UI state if needed + MSWUpdateUIState(UIS_CLEAR, UISF_HIDEFOCUS); return true; } @@ -4656,7 +4653,7 @@ bool wxWindowMSW::HandleMouseMove(int x, int y, WXUINT flags) GenerateMouseLeave(); } } -#endif // HAVE_TRACKMOUSEEVENT +#endif // HAVE_TRACKMOUSEEVENT #if wxUSE_MOUSEEVENT_HACK // Windows often generates mouse events even if mouse position hasn't