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:
committed by
Vadim Zeitlin
parent
061e6f9a3c
commit
ef91e5ecbe
@@ -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:
|
||||
|
||||
|
@@ -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
|
||||
|
@@ -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;
|
||||
|
@@ -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;
|
||||
|
Reference in New Issue
Block a user