[原创]ListView控件如何使用系统图标 -- win32汇编

转载 2006年05月26日 13:24:00

        昨天为了弄这个花了好多时间,搞得心都烦了,还好最后成功了,给了一点安慰,为了让一些初学者少走点弯路,我在这里给大家说下ListView控件是如何使用系统图标的(如果有什么地方错了请大家指出:)),大虾们就不必看了,本文的程序是以win32汇编来写的,前提是大家对ListView控件有一定的了解.

       ListView4种显示模式,分别是大图标、小图标、列表、详细信息,除了大图标模式使用的是大图标外,其它3种模式都是使用小图标的,所以我们在给ListView关联图标列表(ImageList)的时候要有一个大图标列表和一个小图标列表,当然你可以添加自己喜欢的图标,不过这次我们的主角是系统图标:)。好了,不废话了,现在进入主题:(假定窗口中只有ListView控件)

 首先在ListView控件的属性中添加LVS_SHAREIMAGELISTS(共享图标列表),我是在资源文件中定义的ListView,其IDIDC_LIST1,定义几个全局变量,如: 

.data
                     pszPath          db  
"C:/",0
.data
?  
                    himageListLarge   HIMAGELIST   
?
                    himageListSmall   HIMAGELIST   
?

 

1。在窗口处理函数中的WM_INITDIALOG事件中添加如下代码:

   
LOCAL FileInfo:SHFILEINFO    ;定义文件信息变量

invoke SHGetFileInfo,offset pszPath,
0,addr FileInfo,sizeof SHFILEINFO,
              SHGFI_SYSICONINDEX
+SHGFI_LARGEICON        
mov hImageListLarge,eax
invoke SHGetFileInfo,offset pszPath,
0,addr FileInfo,sizeof SHFILEINFO,
              SHGFI_SYSICONINDEX
+SHGFI_SMALLICON
mov hImageListSmall,eax
.
if hImageListLarge && hImageListSmall      
          invoke SendDlgItemMessage,MainhWnd,IDC_LIST2,LVM_SETIMAGELIST,LVSIL_NORMAL,hImageListLarge
          invoke SendDlgItemMessage,MainhWnd,IDC_LIST2,LVM_SETIMAGELIST,LVSIL_SMALL,hImageListSmall      
.endif

 

2。给ListView控件关联好之后就是如何将这些图标显示出来了,可是我们怎么知道哪一项目用哪个图标呢?比如说我第一项目想用txt文件图标,而第二项想用exe文件图标,应该怎么获取呢?这就必须取这些图标在图标列表里(ImageList)的序号,如果你需要取的图标不多,可以从1、2、3。。。一个一个测试,如果你要取很多种图标那可以用如下函数:

ExtStr为扩展名字符串的地址,如:".txt",".exe"(如果是文件夹则置0) ---扩展名前面的'.'不能少

blsLargeIconTRUEFALSETRUE则取大图标序号,FALSE则取小图标序号

eax返回要查找图标的序号

如我想得到txt文件的小图标,调用方法为invoke GetIconIndex ,addr ExtStr,FALSE

   
GetIconIndex proc ExtStr:DWORD,bIsLargeIcon:DWORD
    LOCAL FileInfo:SHFILEINFO
    LOCAL nFlags:DWORD

    .
if bIsLargeIcon      ;大图标
        mov nFlags,SHGFI_USEFILEATTRIBUTES
+SHGFI_SYSICONINDEX+SHGFI_LARGEICON
    .
else             ;小图标
        mov nFlags,SHGFI_USEFILEATTRIBUTES
+SHGFI_SYSICONINDEX+SHGFI_SMALLICON
    .endif
    mov eax,ExtStr
    .
if byte ptr[eax]=='.'       ;ExtStr的第一个字节与'.'比较,相同则是一般文件,否则是文件夹
        invoke SHGetFileInfo,ExtStr,FILE_ATTRIBUTE_NORMAL,addr FileInfo,
sizeof SHFILEINFO,nFlags
    .
else
        invoke SHGetFileInfo,ExtStr,FILE_ATTRIBUTE_DIRECTORY,addr FileInfo,
sizeof SHFILEINFO,nFlags
    .endif        
    mov eax,FileInfo.iIcon    ;将图标序号保存在eax
    ret
GetIconIndex endp

 

3。现在可以取序号了,那我们在ListView添加一个项目的时候把序号给lvi.iImageOK了:)

LOCAL lvi:LV_ITEM
 
mov lvi.imask,LVIF_TEXT
+LVIF_IMAGE 
 ……
mov,lvi.iSubItem,
0 
invoke GetIconIndex,addr ExtText,FALSE                        ;取得想要的图标序号(保存在eax中)
mov lvi.iImage,eax                       ;这个地方eax可以换成1、
。。测试你想要的图标序号
……
invoke SendDlgItemMessage,hWnd ,IDC_LIST1,LVM_INSERTITEM,
0,addr lvi 

 

跟我一起玩Win32开发(16):ListView的多个视图

在上一个例子中,我们只用到了ListView的Report视图,也就是详细视图。本文我们再把上一篇文章中所用的例子进行一下扩展,例子源码可以到俺的资源区下载。 我们为ListView中显示的数据加上...
  • tcjiaan
  • tcjiaan
  • 2013年02月08日 11:26
  • 10678

win32 listview控件添加图标

#include #include #include #include "resource.h"#pragma comment(lib,"comctl32.lib")HINSTANCE g_hInst...
  • Timmiy
  • Timmiy
  • 2016年05月30日 00:34
  • 993

在Dll中添加图标

如何在Dll添加图标,当然也可以添加其他资源。 Delphi开发的DLL 1、编辑rc文件 如:demo.rc myico ICON demo.ico 2、用Brcc32.EXE编译成demo.res...
  • jonahzheng
  • jonahzheng
  • 2013年09月27日 23:12
  • 1652

C#Winform开发,Listview根据文件路径或扩展名显示系统文件图标

在Winform开发中,大家普遍利用Listview来显示文件列表。 但是Listview本身并不具备显示当前系统图标的功能。所以要想实现类似的功能,需要利用Icon和Imagelist来辅助。 1...
  • blizzardlyk
  • blizzardlyk
  • 2013年04月22日 13:55
  • 3425

WIN32 控件ListView学习心得

最近学习的是WIN32控件ListView的使用,以下是个人的一点心得。    ListView控件,在直观上个人认为就是表格的意思。与表格一样,ListView也有表头,表头有几个项,下面的内容行...
  • qq2006lx
  • qq2006lx
  • 2015年10月28日 21:15
  • 355

Win32汇编之使用资源--菜单和加速键

///我们在使用软件时可以看到菜单、图标、版本信息等,它们是可执行文件的组成     部分也是Windows中的不同类型的资源。这些资源并不在源码的数据段中定义,     而是单独放在一个节区中,需...
  • u012869992
  • u012869992
  • 2014年08月10日 19:45
  • 575

win32 application 添加一个icon 资源 resource

用vs2013,创建一个win32 应用程序 ,工程名字是 HelloRes ,空项目。 此时,项目界面为:工程目录如下: 添加一个源文件hello.cpp:在源文件上 右键新建一个cpp文件 ...
  • wowocpp
  • wowocpp
  • 2018年02月06日 12:28
  • 7

Windows应用程序高级控件之ListView控件

ListView控件
  • u010792238
  • u010792238
  • 2014年06月08日 14:31
  • 1086

跟我一起玩Win32开发(15):ListView控件

这个控件其实不用阿拉来介绍,因为它太常见了,就好像我们一出门就会看到妹子一样常见。当然也可以说,它是对ListBox的扩充。 在使用该控件之前,我先介绍VS的一个相当好玩的功能。 在代码文件的#i...
  • tcjiaan
  • tcjiaan
  • 2013年02月06日 13:47
  • 13801

[Win32SDK基本]ListView Controls(1)Report (details) View 详解

本文由CSDN用户zuishiko所作,转载请注明出处:http://blog.csdn.net/zuishikonghuan/article/details/46872885 老规矩,先上MSD...
  • zuishikonghuan
  • zuishikonghuan
  • 2015年07月14日 13:54
  • 3816
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:[原创]ListView控件如何使用系统图标 -- win32汇编
举报原因:
原因补充:

(最多只允许输入30个字)