Implement wxTreeCtrl::SetDoubleBuffered() in MSW wxTreeCtrl

Also don't erase background when the control is double-buffered because
it's not necessary and can cause flicker.

See https://github.com/wxWidgets/wxWidgets/pull/374
This commit is contained in:
Steve Browne
2016-12-20 12:44:14 -05:00
committed by Vadim Zeitlin
parent 061e6f9a3c
commit ef91e5ecbe
4 changed files with 53 additions and 0 deletions

View File

@@ -443,6 +443,7 @@ wxMSW:
- Use correct parent for the native modal dialogs (Andreas Falkenhahn).
- Fix layout of wxSlider with wxSL_VALUE_LABEL only (gafatoa).
- Fix flicker when resizing columns of report-mode wxListCtrl.
- Implement wxTreeCtrl::SetDoubleBuffered() (Steve Browne).
wxOSX/Cocoa:

View File

@@ -239,6 +239,10 @@
#define TV_FIRST 0x1100
#endif
#ifndef TVS_EX_DOUBLEBUFFER
#define TVS_EX_DOUBLEBUFFER 0x0004
#endif
#ifndef TVS_FULLROWSELECT
#define TVS_FULLROWSELECT 0x1000
#endif
@@ -248,6 +252,11 @@
#define TVM_SETTEXTCOLOR (TV_FIRST + 30)
#endif
#ifndef TVM_SETEXTENDEDSTYLE
#define TVM_SETEXTENDEDSTYLE (TV_FIRST + 44)
#define TVM_GETEXTENDEDSTYLE (TV_FIRST + 45)
#endif
// Various defines used by the webview library that are needed by mingw
#ifndef DISPID_COMMANDSTATECHANGE

View File

@@ -202,6 +202,9 @@ public:
// returns true if the platform should explicitly apply a theme border
virtual bool CanApplyThemeBorder() const wxOVERRIDE { return false; }
virtual bool IsDoubleBuffered() const wxOVERRIDE;
virtual void SetDoubleBuffered(bool on) wxOVERRIDE;
protected:
// Implement "update locking" in a custom way for this control.
virtual void DoFreeze() wxOVERRIDE;

View File

@@ -795,6 +795,46 @@ bool wxTreeCtrl::Create(wxWindow *parent,
return true;
}
bool wxTreeCtrl::IsDoubleBuffered() const
{
if ( !GetHwnd() )
return false;
// Notice that TVM_GETEXTENDEDSTYLE is supported since XP, so we can always
// send this message, no need for comctl32.dll version check here.
const LRESULT
exTreeStyle = ::SendMessage(GetHwnd(), TVM_GETEXTENDEDSTYLE, 0, 0);
return (exTreeStyle & TVS_EX_DOUBLEBUFFER) != 0;
}
void wxTreeCtrl::SetDoubleBuffered(bool on)
{
if ( !GetHwnd() )
return;
// TVS_EX_DOUBLEBUFFER is only supported since Vista, don't try to set it
// under XP, who knows what could this do.
if ( wxApp::GetComCtl32Version() >= 610 )
{
const HRESULT hr = ::SendMessage(GetHwnd(),
TVM_SETEXTENDEDSTYLE,
TVS_EX_DOUBLEBUFFER,
on ? TVS_EX_DOUBLEBUFFER : 0);
if ( hr == S_OK )
{
// There is no need to erase background for a double-buffered
// window, so disable it when enabling double buffering and restore
// the default background style value when disabling it.
SetBackgroundStyle(on ? wxBG_STYLE_PAINT : wxBG_STYLE_ERASE);
}
else
{
wxLogApiError("TreeView_SetExtendedStyle(TVS_EX_DOUBLEBUFFER)", hr);
}
}
}
wxTreeCtrl::~wxTreeCtrl()
{
m_isBeingDeleted = true;