关于TListBox自绘状态下的repaint闪烁问题

又是一个flicker prob.但这个控件的闪烁问题和以往遇到的有些不同,一般情况下只要禁止控件重绘背景(WM_ERASEBKGND这个消息)就可以解决。我先用了简单的设置方式(那个直接设置vcl控件属性禁止重绘背景),但发现没有效果,后来又用了窗口子类化,重写了窗口过程拦下了重绘背景的消息,但是实际运行发现也没有效果,最后我用SPY++查看这个控件时发现,一个TListBox实际上是由2部分组成,一个TScrollBox负责控制2边滚动条的显示,还有一个InnerListBox是实际显示item的控件,以前的几种尝试方式都是针对错了对象的,如果将子类化的hwnd用inner的就没问题了,基本解决了重绘整个控件时的闪烁问题,但是还是有一点小bug:由于TListBox自绘时并不会卡准最后一个Item的下边一定和控件的下边位置一致,所以有可能在控件内空出一部分空间,如果禁用了背景重画,则空出的这部分空间的颜色无法控制,而另一种方式通过打开inner的双缓冲也可以解决闪烁的问题,但是还是这部分空出的空间的颜色会有时正常(拖动滚动条移动时)有时不正常(用滚轮移动时),这个问题还有待解决。

博主友情提示:

如您在评论中需要提及如QQ号、电子邮件地址或其他隐私敏感信息,欢迎使用>>博主专用加密工具v3<<处理后发布,原文只有博主可以看到。