From 6c6b938377211da1987c8b6e44134fb0f32c84df Mon Sep 17 00:00:00 2001 From: Julian Smart Date: Sun, 11 Mar 2012 05:31:06 +0000 Subject: [PATCH] A fix for flicker when the top-level window is disabled or enabled (e.g. by modal dialogs). Achieved by using IsThisEnabled to determine the visual disabled state and thus requiring no refresh on top-level window enabling/disabling. git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@70870 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775 --- src/msw/choice.cpp | 2 +- src/msw/combo.cpp | 4 ++-- src/msw/textctrl.cpp | 2 +- src/msw/toplevel.cpp | 16 +++++++++++++++- 4 files changed, 19 insertions(+), 5 deletions(-) diff --git a/src/msw/choice.cpp b/src/msw/choice.cpp index ee5f46167e..74ec10a47b 100644 --- a/src/msw/choice.cpp +++ b/src/msw/choice.cpp @@ -758,7 +758,7 @@ bool wxChoice::MSWCommand(WXUINT param, WXWORD WXUNUSED(id)) WXHBRUSH wxChoice::MSWControlColor(WXHDC hDC, WXHWND hWnd) { - if ( !IsEnabled() ) + if ( !IsThisEnabled() ) return MSWControlColorDisabled(hDC); return wxChoiceBase::MSWControlColor(hDC, hWnd); diff --git a/src/msw/combo.cpp b/src/msw/combo.cpp index 12db6bf584..51bad16e5c 100644 --- a/src/msw/combo.cpp +++ b/src/msw/combo.cpp @@ -294,7 +294,7 @@ wxComboCtrl::PrepareBackground( wxDC& dc, const wxRect& rect, int flags ) const if ( !(flags & wxCONTROL_ISSUBMENU) ) { // Drawing control - isEnabled = IsEnabled(); + isEnabled = IsThisEnabled(); doDrawFocusRect = ShouldDrawFocus(); #if wxUSE_UXTHEME @@ -429,7 +429,7 @@ void wxComboCtrl::OnPaintEvent( wxPaintEvent& WXUNUSED(event) ) wxColour bgCol = GetBackgroundColour(); #if wxUSE_UXTHEME - const bool isEnabled = IsEnabled(); + const bool isEnabled = IsThisEnabled(); wxMSWDCImpl *impl = (wxMSWDCImpl*) dc.GetImpl(); HDC hDc = GetHdcOf(*impl); diff --git a/src/msw/textctrl.cpp b/src/msw/textctrl.cpp index 659cf21077..4f02fbaf85 100644 --- a/src/msw/textctrl.cpp +++ b/src/msw/textctrl.cpp @@ -2055,7 +2055,7 @@ bool wxTextCtrl::MSWCommand(WXUINT param, WXWORD WXUNUSED(id)) WXHBRUSH wxTextCtrl::MSWControlColor(WXHDC hDC, WXHWND hWnd) { - if ( !IsEnabled() && !HasFlag(wxTE_MULTILINE) ) + if ( !IsThisEnabled() && !HasFlag(wxTE_MULTILINE) ) return MSWControlColorDisabled(hDC); return wxTextCtrlBase::MSWControlColor(hDC, hWnd); diff --git a/src/msw/toplevel.cpp b/src/msw/toplevel.cpp index 1db870f1e8..85c221a45b 100644 --- a/src/msw/toplevel.cpp +++ b/src/msw/toplevel.cpp @@ -1344,7 +1344,21 @@ void wxTopLevelWindowMSW::DoEnable(bool enable) // so we have to issue explicit refresh to avoid rendering artifacts. // // TODO: find out just what exactly is wrong here - Refresh(); + //Refresh(); + + // JS: From observing other application behaviour, such as VS 2010, controls such + // as text fields and comboboxes do not indicate a disabled state when the parent + // is disabled due to a modal dialog being shown. Therefore I have changed these + // controls' behaviour to only indicate a disabled state when IsThisEnabled returns false, + // i.e. the application has specifically disabled each control. Since the colour + // no longer changes when the top-level window is disabled, this means we can avoid + // doing a refresh that causes a distracting flicker in some controls. + // Windows should probably be sending a paint event to each child control just in + // case the state change requires a refresh, but this would cause flicker so perhaps + // it's as well that it doesn't. + // The result of this change is to remove the flicker and also remove the distraction + // of individual controls greying-out due to a dialog being shown, which I think was + // the wrong behaviour. } void wxTopLevelWindowMSW::DoFreeze() -- 2.47.2