CTreeCtrl背景图的实现在网上已经有很多了,比较著名的是这两篇: http://www.vckbase.net/document/viewdoc/?id=355 http://www.codeguru.com/Cpp/controls/treeview/misc-advanced/article.php/c679/ 这俩篇都实现了最基本的绘制,以及收缩和展开节点时候的刷新问题,后一篇还处理了滚动条刷新问题。这里提几点自己的实验体会,与大家共享: (1)OnEraseBkgnd和OnPaint中的处理过程基本相同。 (2)在动态添加子项时(InsertItem),如果是插入到父节点的第一个子节点,处理OnTvnItemexpanding和OnTvnItemexpanded,刷新正常。但是如果是开始插入第二个子节点,那么不会响应OnTvnItemexpanding和OnTvnItemexpanded(因为父节点已经展开),因此会发现背景图产生偏移。这是由于InsertItem时未刷新导致的。因此只需要在调用代码InsertItem前加上下面一句即可: m_treectrl.SetRedraw(TRUE); (3)滚动条滚动刷新时 与(2)是同样的原理,要调用SetRedraw (4) http://www.codeproject.com/KB/GDI-plus/what_is_a_basename_.aspx 处理了一般CTreeCtrl等控件闪烁的问题,很为实用

评论