VC++ CSWDirectoryListCtrl问题集锦

       总体来说,这个控件难度值并不大,但是却卡了我1天时间,用于解决控件列表内容刷新导致主窗体闪烁问题。究其原因:最初我并不是从CListCtrl继承下来的,而是继承自己成熟的控件CSWListCtrl。CSWListCtrl控件自绘,我采用的是重载virtual void DrawItem(LPDRAWITEMSTRUCT /*lpDrawItemStruct*/);来实现的,目的是实现一个强大的CListCtrl控件,其接口功能有:

1、自定义背景色或图片

2、自定义单元格颜色和字体

3、自定义标题栏颜色和字体

4、单元格可编辑文本

5、单元格可显示按钮(图标)触发鼠标事件

6、单元格可显示任务进度条

7、单元格支持下拉列表框

8、单元格可显示位图

9、单元格支持多行文本显示

10、支持滚动条样式自定义

问题出现在刷新列表内容的时候,会造成父窗体和兄弟子控件刷新,从而造成窗体闪烁。这么个简单问题,很容易让人联想到是双缓存引起的,采用双缓存就应该能解决问题,其实不然,我所有控件设计其实都是采用的双缓存绘制机制,所以问题肯定不是在这儿,于是我给数据刷新前后加个LockWindowUpdate()和UnLockWindowUpdate();父窗体以及兄弟控件刷新抖动问题是解决了,但是自己的抖动问题依然存在。于是我换成了Redraw(FALSE)和Redraw(TRUE)。眼前一亮,自身抖动问题总算是解决了,总以为这个时候大功告成了,但是新的问题又出现了,非单元格数据显示区域背景色(图)不会自动刷新了,导致整个客户区背景颜色不统一,这不是坑爹嘛,为了解决这个问题尝试了很多方法,总之是来回折腾,花了半天时间,最后的结果是要么就是抖动,要么就是背景不刷新。内心不免有些烦躁起来,但是肯定是不会认输的,最终决定冷静下来,重新构思了整个控件的功能,其实控件要实现的功能很简单(类似文件管理器):就是显示磁盘文件/目录列表,双击目录进入下一级目录,用户可自定义双击文件的操作,CSWListCtrl所谓强大的功能在这里好像一无是处,干脆直接继承CListCtrl好了,这样代码少了,问题解决起来也方便,也不用重载virtual void DrawItem(LPDRAWITEMSTRUCT /*lpDrawItemStruct*/);只需要响应NM_CUSTOMDRAW消息事件就行了,代码量也少了很多,没想到一次实验就成功了。这个时候总该可以好好休息片刻了吧,结果问题又来了,由于控件里面响应了NM_DBLCLK消息(双击目录,进入下一级目录),父窗体响应NM_DBLCLK消息,但是消息体里面始终进不来,不过这个问题解决起来相对就简单很多了,将ON_NOTIFY_REFLECT(NM_DBLCLK, &CSWDirectoryListCtrl::OnNMDblclk)改为ON_NOTIFY_REFLECT_EX(NM_DBLCLK, &CSWDirectoryListCtrl::OnNMDblclk),这样父窗体也就可以正常接收到NM_DBLCLK消息了。

猜你喜欢

转载自blog.csdn.net/u012156872/article/details/107017974