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
This commit is contained in:
Julian Smart
2012-03-11 05:31:06 +00:00
parent b2596741a2
commit 6c6b938377
4 changed files with 19 additions and 5 deletions

View File

@@ -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);

View File

@@ -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);

View File

@@ -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);

View File

@@ -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()