用我最多的分,寻求一个最简单问题的答案(关于Timagelist)(100分)

  • 主题发起人 主题发起人 shang_yan
  • 开始时间 开始时间
S

shang_yan

Unregistered / Unconfirmed
GUEST, unregistred user!
各位:能否告诉我TImageList的有关原理?
如:TImageList与TListView配合使用时,TImageList中的图标是怎么画到Listview中的?我想知道它的内部原理。平时我们用时,只是先将Icon添加到ImageList中,然后将ImageList指定到ListView。当Listview要显示某个Item时,Listview会根据Item的ImageIndex属性来显示ImageList中的对应图标。
1、ListView是如何根据Item的ImageIndex来调用并显示ImageList中的图标的?其中用到了哪些Api?
2、为什么我在ListView.onCustomDrawItem事件中用ImageList.draw方法将图标画到Listview中时,速度明显没有第一种方式快?
 
没人能回答吗
 
这个问题自己看一看VCL源代码吧
如果专门看这个组件源代码,谁又能够说清楚呢?
如果不是有特殊的用处,谁又会研究这个组件的源代码呢?
 
看到了!就回答:

1、ListView是如何根据Item的ImageIndex来调用并显示ImageList中的图标的?其中用到了哪些Api?
是用了一系列的ListView函数,

开始用:
ListView_SetImageList(listview的窗口句柄, ImageList.Handle, 0);指定某ImageList
再用
ListView_RedrawItems(listview的窗口句柄,开始ImageList索引,结束ImageList索引);来画ImageList的图标。
等等。

2、为什么我在ListView.onCustomDrawItem事件中用ImageList.draw方法将图标画到Listview中时,速度明显没有第一种方式快?
其实ImageList.draw方法和ListView_RedrawItems最后都是调用GDI函数例如刷子填充
Rect。没有多大速度差距,除非你有背景需要刷新!
 
To wql:
关于我的第2个问题,我在程序中确实发现两种方式的速度差别较大。通过设置Item.ImageIndex来显示ImageList 中的图标时,Listview中没有闪烁,而通过ImageList.draw来显示图标时,可以 见到闪烁。

产生这两个比较偏门的问题,是因为我想做一个类似于ACDSee的缩略图显示功能的软件,而通过研究,我发现早期的ACDSee版本用了ListView来显示缩略图,我试了很多种方案来显示缩略图,总达不到ACDSee的效果。所以我一直在推测:ACDSee中的缩略图是用ImageList.draw方式画上去的呢,还是设置ListView.Item.ImageIndex来显示的。
 
后退
顶部