Allow calling EnableSystemTheme(false) before creating the window
This is important as enabling the system theme results in changes to the native ListView control appearance that are not undone later even if the system theme is disabled. Notably, the item rectangle width is reduced by 2 pixels when system theme is enabled and it's not increased to its original value even when it's disabled later, resulting in gaps between items through which the control background shows, for example. This also makes items drawn using our own HandleItemPaint() slightly, but noticeably, larger than the items using standard appearance, which looks bad. All these problems can be avoided if we skip enabling the system theme in the first place if EnableSystemTheme(false) had been called before creating the control, so support doing it like this and document that this is the preferred way of disabling the system theme use. Closes #17404, #18296.
This commit is contained in:
@@ -21,7 +21,21 @@ class WXDLLIMPEXP_FWD_CORE wxWindow;
|
||||
class WXDLLIMPEXP_CORE wxSystemThemedControlBase
|
||||
{
|
||||
public:
|
||||
wxSystemThemedControlBase() { }
|
||||
wxSystemThemedControlBase()
|
||||
{
|
||||
#ifdef wxHAS_SYSTEM_THEMED_CONTROL
|
||||
m_systemThemeDisabled = false;
|
||||
#endif // wxHAS_SYSTEM_THEMED_CONTROL
|
||||
}
|
||||
|
||||
bool IsSystemThemeDisabled() const
|
||||
{
|
||||
#ifdef wxHAS_SYSTEM_THEMED_CONTROL
|
||||
return m_systemThemeDisabled;
|
||||
#else // !wxHAS_SYSTEM_THEMED_CONTROL
|
||||
return false;
|
||||
#endif // wxHAS_SYSTEM_THEMED_CONTROL/!wxHAS_SYSTEM_THEMED_CONTROL
|
||||
}
|
||||
|
||||
virtual ~wxSystemThemedControlBase() { }
|
||||
|
||||
@@ -36,6 +50,11 @@ protected:
|
||||
(bool WXUNUSED(enable), wxWindow* WXUNUSED(window)) { }
|
||||
#endif // wxHAS_SYSTEM_THEMED_CONTROL
|
||||
|
||||
private:
|
||||
#ifdef wxHAS_SYSTEM_THEMED_CONTROL
|
||||
bool m_systemThemeDisabled;
|
||||
#endif // wxHAS_SYSTEM_THEMED_CONTROL
|
||||
|
||||
wxDECLARE_NO_COPY_CLASS(wxSystemThemedControlBase);
|
||||
};
|
||||
|
||||
@@ -54,6 +73,14 @@ public:
|
||||
}
|
||||
|
||||
protected:
|
||||
void EnableSystemThemeByDefault()
|
||||
{
|
||||
// Check if the system theme hadn't been explicitly disabled before
|
||||
// enabling it by default.
|
||||
if ( !this->IsSystemThemeDisabled() )
|
||||
DoEnableSystemTheme(true, this);
|
||||
}
|
||||
|
||||
wxDECLARE_NO_COPY_TEMPLATE_CLASS(wxSystemThemedControl, C);
|
||||
};
|
||||
|
||||
|
@@ -45,6 +45,27 @@
|
||||
};
|
||||
@endcode
|
||||
|
||||
Please also note that if you want to disable the system theme use in the
|
||||
control that use it by default, it's best to do it before actually creating
|
||||
the control as enabling the system theme can't always be completely undone
|
||||
later. I.e. instead of
|
||||
@code
|
||||
// THIS CODE IS WRONG, DO NOT DO IT LIKE THIS
|
||||
wxTreeCtrl* tree = new wxTreeCtrl(parent, wxID_ANY);
|
||||
tree->EnableSystemTheme(false);
|
||||
@endcode
|
||||
prefer the following version:
|
||||
@code
|
||||
// Use default ctor to create the object, avoiding creating the window.
|
||||
wxTreeCtrl* tree = new wxTreeCtrl();
|
||||
|
||||
// Then disable the system theme used by default.
|
||||
tree->EnableSystemTheme(false);
|
||||
|
||||
// And only then actually create the window.
|
||||
tree->Create(parent, wxID_ANY);
|
||||
@endcode
|
||||
|
||||
On non-MSW platforms this class currently does nothing but is still
|
||||
available, so that it can be used in portable code without any conditional
|
||||
compilation directives.
|
||||
|
@@ -5177,7 +5177,7 @@ bool wxDataViewCtrl::Create(wxWindow *parent,
|
||||
sizer->Add( m_clientArea, 1, wxGROW );
|
||||
SetSizer( sizer );
|
||||
|
||||
EnableSystemTheme();
|
||||
EnableSystemThemeByDefault();
|
||||
|
||||
#if wxUSE_ACCESSIBILITY
|
||||
wxAccessible::NotifyEvent(wxACC_EVENT_OBJECT_CREATE, this, wxOBJID_CLIENT, wxACC_SELF);
|
||||
|
@@ -302,7 +302,7 @@ bool wxListCtrl::Create(wxWindow *parent,
|
||||
if ( !MSWCreateControl(WC_LISTVIEW, wxEmptyString, pos, size) )
|
||||
return false;
|
||||
|
||||
EnableSystemTheme();
|
||||
EnableSystemThemeByDefault();
|
||||
|
||||
// explicitly say that we want to use Unicode because otherwise we get ANSI
|
||||
// versions of _some_ messages (notably LVN_GETDISPINFOA)
|
||||
|
@@ -23,10 +23,17 @@
|
||||
void wxSystemThemedControlBase::DoEnableSystemTheme(bool enable, wxWindow* window)
|
||||
{
|
||||
if ( wxGetWinVersion() >= wxWinVersion_Vista && wxUxThemeIsActive() )
|
||||
{
|
||||
// It's possible to call EnableSystemTheme(false) before creating the
|
||||
// window, just don't do anything in this case.
|
||||
if ( window->GetHandle() )
|
||||
{
|
||||
const wchar_t* const sysThemeId = enable ? L"EXPLORER" : NULL;
|
||||
::SetWindowTheme(GetHwndOf(window), sysThemeId, NULL);
|
||||
}
|
||||
|
||||
m_systemThemeDisabled = !enable;
|
||||
}
|
||||
}
|
||||
|
||||
#endif // wxHAS_SYSTEM_THEMED_CONTROL
|
||||
|
@@ -790,7 +790,7 @@ bool wxTreeCtrl::Create(wxWindow *parent,
|
||||
{
|
||||
// The Vista+ system theme uses rotating ("twist") buttons, so we map
|
||||
// this style to it.
|
||||
EnableSystemTheme();
|
||||
EnableSystemThemeByDefault();
|
||||
}
|
||||
|
||||
return true;
|
||||
|
Reference in New Issue
Block a user