[原创]ListView控件如何使用系统图标 -- win32汇编
2006-05-26 13:24
537 查看
昨天为了弄这个花了好多时间,搞得心都烦了,还好最后成功了,给了一点安慰,为了让一些初学者少走点弯路,我在这里给大家说下ListView控件是如何使用系统图标的(如果有什么地方错了请大家指出:)),大虾们就不必看了,本文的程序是以win32汇编来写的,前提是大家对ListView控件有一定的了解.
ListView有4种显示模式,分别是大图标、小图标、列表、详细信息,除了大图标模式使用的是大图标外,其它3种模式都是使用小图标的,所以我们在给ListView关联图标列表(ImageList)的时候要有一个大图标列表和一个小图标列表,当然你可以添加自己喜欢的图标,不过这次我们的主角是系统图标:)。好了,不废话了,现在进入主题:(假定窗口中只有ListView控件)
首先在ListView控件的属性中添加LVS_SHAREIMAGELISTS(共享图标列表),我是在资源文件中定义的ListView,其ID为IDC_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) ---扩展名前面的'.'不能少
blsLargeIcon为TRUE或FALSE,TRUE则取大图标序号,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.iImage就OK了:)
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、2、3。。测试你想要的图标序号
……
invoke SendDlgItemMessage,hWnd ,IDC_LIST1,LVM_INSERTITEM,0,addr lvi
ListView有4种显示模式,分别是大图标、小图标、列表、详细信息,除了大图标模式使用的是大图标外,其它3种模式都是使用小图标的,所以我们在给ListView关联图标列表(ImageList)的时候要有一个大图标列表和一个小图标列表,当然你可以添加自己喜欢的图标,不过这次我们的主角是系统图标:)。好了,不废话了,现在进入主题:(假定窗口中只有ListView控件)
首先在ListView控件的属性中添加LVS_SHAREIMAGELISTS(共享图标列表),我是在资源文件中定义的ListView,其ID为IDC_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) ---扩展名前面的'.'不能少
blsLargeIcon为TRUE或FALSE,TRUE则取大图标序号,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.iImage就OK了:)
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、2、3。。测试你想要的图标序号
……
invoke SendDlgItemMessage,hWnd ,IDC_LIST1,LVM_INSERTITEM,0,addr lvi
相关文章推荐
- 如何在64位的linux系统上使用汇编和C语言混合编程
- 使用Win32 API做个系统托盘图标
- 使用Win32 API做个系统托盘图标
- 如何在64位的linux系统上使用汇编和C语言混合编程
- Win32汇编--如何使用资源 [菜单和加速键]
- 使用Win32 API做个系统托盘图标
- 如何在64位的linux系统上使用汇编和C语言混合编程
- 如何使用GTK让系统显示托盘图标
- 使用Win32 API做个系统托盘图标
- 如何在64位的linux系统上使用汇编和C语言混合编程-32汇编移植64位系统
- 如何使我开发的程序的图标不使用系统的玻璃效果
- QT 资源系统(如何使用小图片做图标)
- C#中如何取得并使用Windows系统图标
- 使用Win32 API做个系统托盘图标
- Win32汇编之使用资源--图标和光标
- 如何在64位的linux系统上使用汇编和C语言混合编程
- WIN32汇编: 23.系统托盘中的快捷图标
- [转]使用Win32 API做个系统托盘图标
- 【原创】Linux系统下如何配置SSH?如何开启SSH?SSH简单使用
- Common(五)—— 消息系统(二):如何使用