分类: 技术/开发(原创/转载) |
CThumbnailView是WINDOWS资源管理器扩展视图-缩略图的实现类,当用户在资源管理器中选择了缩略图视图后,WINDOWS2000就会创建这个类的对象,以缩略图方式显示指定文件夹中的内容.
这些内容其实还是用一个List-View来显示的,只不过用了List-View的一种特殊模式即Virtual List-View,这种模式不同于List-View原来的模式(平辅,图标,列表,详细信息),用户装了IE3(DLL版本为4.7)后才能使用这种模式.创建这种模式其实非常简单,只要在CreateWindow时添加一个样式LVS_OWNERDATA即可.关于这种模式的详细信息,请查看MSDN.
这个类中List-View使用图像列表来实现缩略图的显示,也就是说,系统将会为这个List-View分配一个ImageList,然后在添加List-View的item时,将动态指定它的iImage,这样显示的时候,每个item都将会有一个图标.那这个ImageList怎么与缩略图联系起来呢?具体步骤是这样的,当缩略图方式显示一个文件如图像文件时,不可能一步到位显示这个图像文件的缩略图,只能在后台为这个图像文件生成缩略图后再显示这个缩略图,在生成缩略图之前,系统将用SHELL的一个图像列表来显示,这个图像列表包含了所有文件图标信息;当系统生成完缩略图后,再动态地换成缩略图.讲了这么多原理,看看CThumbnailView是怎么实现这些东东的.
第一步:在系统创建缩略图视图时创建3个图像列表.这步主要在CreateViewWindow2()这个函数中实现(这个函数是IShellView2的一个函数,主要由ShellFolder对象调用,创建视图对象),一个是m_hSysLargeImgLst,这里的图标主要用在缩略图生成结束前显示,它是Shell图像列表的一个副本.另一个是m_hSysSmallImgLst,这里的都是小图标,内容与上一个图像列表是一样的.第三个是m_himlThumbs,保存List-View将要用到的缩略图图像,这也是List-View最终用的一个图像列表.
第二步:Virtual List-View在显示某个item时,会向父窗口发送LVN_GETDISPINFO,父窗口必须在这个消息中设置item的所有信息.
这些内容其实还是用一个List-View来显示的,只不过用了List-View的一种特殊模式即Virtual List-View,这种模式不同于List-View原来的模式(平辅,图标,列表,详细信息),用户装了IE3(DLL版本为4.7)后才能使用这种模式.创建这种模式其实非常简单,只要在CreateWindow时添加一个样式LVS_OWNERDATA即可.关于这种模式的详细信息,请查看MSDN.
这个类中List-View使用图像列表来实现缩略图的显示,也就是说,系统将会为这个List-View分配一个ImageList,然后在添加List-View的item时,将动态指定它的iImage,这样显示的时候,每个item都将会有一个图标.那这个ImageList怎么与缩略图联系起来呢?具体步骤是这样的,当缩略图方式显示一个文件如图像文件时,不可能一步到位显示这个图像文件的缩略图,只能在后台为这个图像文件生成缩略图后再显示这个缩略图,在生成缩略图之前,系统将用SHELL的一个图像列表来显示,这个图像列表包含了所有文件图标信息;当系统生成完缩略图后,再动态地换成缩略图.讲了这么多原理,看看CThumbnailView是怎么实现这些东东的.
第一步:在系统创建缩略图视图时创建3个图像列表.这步主要在CreateViewWindow2()这个函数中实现(这个函数是IShellView2的一个函数,主要由ShellFolder对象调用,创建视图对象),一个是m_hSysLargeImgLst,这里的图标主要用在缩略图生成结束前显示,它是Shell图像列表的一个副本.另一个是m_hSysSmallImgLst,这里的都是小图标,内容与上一个图像列表是一样的.第三个是m_himlThumbs,保存List-View将要用到的缩略图图像,这也是List-View最终用的一个图像列表.
第二步:Virtual List-View在显示某个item时,会向父窗口发送LVN_GETDISPINFO,父窗口必须在这个消息中设置item的所有信息.