diff --git a/docs/changes.txt b/docs/changes.txt index 4b3e200dff..0fe16c3658 100644 --- a/docs/changes.txt +++ b/docs/changes.txt @@ -442,6 +442,8 @@ wxMSW: - Fix UTF-32 conversion for non-BMP characters (ARATA Mizuki). - 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: diff --git a/include/wx/msw/missing.h b/include/wx/msw/missing.h index 63ac97d69f..1443a1069e 100644 --- a/include/wx/msw/missing.h +++ b/include/wx/msw/missing.h @@ -244,6 +244,10 @@ #define TV_FIRST 0x1100 #endif +#ifndef TVS_EX_DOUBLEBUFFER + #define TVS_EX_DOUBLEBUFFER 0x0004 +#endif + #ifndef TVS_FULLROWSELECT #define TVS_FULLROWSELECT 0x1000 #endif @@ -253,6 +257,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 diff --git a/include/wx/msw/treectrl.h b/include/wx/msw/treectrl.h index dfd3c74ede..e2c1740b11 100644 --- a/include/wx/msw/treectrl.h +++ b/include/wx/msw/treectrl.h @@ -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; diff --git a/src/msw/listctrl.cpp b/src/msw/listctrl.cpp index ba30bd6e05..d46e7f000d 100644 --- a/src/msw/listctrl.cpp +++ b/src/msw/listctrl.cpp @@ -334,6 +334,10 @@ void wxListCtrl::MSWSetExListStyles() // it seems better to enable it by default than disable LVS_EX_HEADERDRAGDROP ); + + // As we use LVS_EX_DOUBLEBUFFER above, we don't need to erase our + // background and doing it only results in flicker. + SetBackgroundStyle(wxBG_STYLE_PAINT); } WXDWORD wxListCtrl::MSWGetStyle(long style, WXDWORD *exstyle) const diff --git a/src/msw/treectrl.cpp b/src/msw/treectrl.cpp index 1af3904d81..d7e9094a02 100644 --- a/src/msw/treectrl.cpp +++ b/src/msw/treectrl.cpp @@ -796,6 +796,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;