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

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