在列表视图控件中插入图标

最近在做一个小软件,可以查看本地的所以文件,包括文件名,文件类型,文件大小,文件修改时间以及图标等属性。

首先想到的用列表视图控件了,报表样式。唯一不晓得的是如何获取文件图标,并显示出来,查了相关资料,总算实现了,现在总结一下。

1、SHFILEINFO结构体

typedef struct _SHFILEINFO
{
HICON hIcon;//图标句柄
int iIcon;//图标在系统图标列表的索引
DWORD dwAttributes;//文件属性
char szDisplayName[MAX_PATH];//文件路径
char szTypeName[80];//文件类型
} SHFILEINFO;


2、SHGetFileInfo函数

DWORD SHGetFileInfo(
LPCTSTR pszPath,//文件路径
DWORD dwFileAttributes,//文件属性
SHFILEINFO FAR* psfi,//SHFILEINFO类型指针
UINT cbFileInfo,//SHFILEINFO结构体大小
UINT uFlags//标志位
);

函数的关键在uFlags的取值,可以取以下一个或几个值:
SHGFI_ICON:将文件的HICON类型的图标Handle存储到结构SHFILEINFO的hIcon成员中。
SHGFI_DISPLAYNAME:将指向文件显示名串的指针存储到结构SHFILEINFO的szDisplayName成员中。
SHGFI_TYPENAME:将指向文件类型串的指针存储到结构SHFILEINFO的szTypeName成员中。
SHGFI_ATTRIBUTES:将DWORD类型的给定文件所有要恢的属性值存储到SHFILEINFO结构的dwAttributes成员中。
SHGFI_ICONLOCATION:将指向包含了Shell正在用于指定对象的图标的文件名串的指针存储到SHFILEINFO结构的szDisplayName中。因此,这个标志不能和SHGFI_DISPLAYNAME标志一起使用。
SHGFI_SYSICONINDEX:引起函数返回一个包含图标的系统图标列表Handle。图标的索引存储在SHFILEINFO 结构的iIcon字段中。
这样就可以得到系统图标列表,文件的类型和图标索引号了。
而文件的遍历和查找可以CFileFind类的成员函数FindFile和FindNextFile,同时也能获取文件的大小,和修改时间

3、LVITEM结构体
typedef struct _LVITEM {
UINT mask;//说明LVITEM结构中哪些成员有效
int iItem;//项目的索引值(可以视为行号)从0开始
int iSubItem;//子项的索引值(可以视为列号)从0开始
UINT state;//子项的状态,若有效,mask需取值:LVIF_STATE,下同
UINT stateMask;//状态有效的屏蔽位
LPTSTR pszText;//主项或子项的名称,LVIF_TEXT
int cchTextMax;//pszText所指向的缓冲区大小
int iImage;//关联图像列表中指定图像的索引值,LVIF_IMAGE
LPARAM lParam;//程序定义的32位参数,LVIF_LPARAM
int iIndent;//表示图像位置缩进的单位,LVIF_INDENT
} LVITEM, FAR *LPLVITEM;
在添加行的时候,需要使用LVITEM结构体,指定图标的索引值;pszText为项目名称。
成员变量mask的取值LVIF_IMAGE | LVIF_TEXT指定iImage和pszText成员有效,iSubItem取值为0,表示第一列,iItem是项目索引值,也就是行号


4、了解了上面3个知识点,就可以制作一个文件浏览器了,效果截图:

在列表视图控件中插入图标_第1张图片

开发工具VS2010,MFC
新建一个基于对话框的MFC应用程序,添加一个List Control和Combo Box控件。
显然List Control用于显示文件,Combo Box用于显示文件路径,List Control使用报表样式,外观View处设置
首先在初始化函数中,添加以下代码,获取系统图标列表和本地盘符,初始化Combo Box
BOOL C列表视图控件1Dlg::OnInitDialog()
{
/*部分代码省略*/
// TODO: 在此添加额外的初始化代码

HIMAGELIST hImageList;//创建ImageList
SHFILEINFO shFi;//定义文件信息变量
//获取文件图标信息
hImageList = (HIMAGELIST)SHGetFileInfo(L"c:\\",0,&shFi,sizeof(shFi),SHGFI_SYSICONINDEX|SHGFI_SMALLICON);
//将文件图象列表存入m_ctImageList
CImageList m_ctImageList;
m_ctImageList.m_hImageList = hImageList;
m_list.SetImageList(&m_ctImageList,LVSIL_SMALL);//使用获取的系统图标列表设置列表视图控件的图像列表
m_list.InsertColumn(0,_T("名称"),LVCFMT_LEFT,160);//即设置各列表头的样式
m_list.InsertColumn(1,_T("修改日期"),LVCFMT_LEFT,100);
m_list.InsertColumn(2,_T("类型"),LVCFMT_LEFT,100);
m_list.InsertColumn(3,_T("大小"),LVCFMT_RIGHT,100);
//为列表视图控件添加全行选中和栅格风格
m_list.SetExtendedStyle(m_list.GetExtendedStyle()|LVS_EX_FULLROWSELECT|LVS_EX_GRIDLINES);

//添加本地盘符
size_t szAllDriveStrings = GetLogicalDriveStrings(0,NULL);
TCHAR *pDriveStrings = new TCHAR[szAllDriveStrings+sizeof(_T(" "))];
GetLogicalDriveStrings(szAllDriveStrings,pDriveStrings);
size_t szDriveString = wcslen(pDriveStrings);
while(szDriveString>0)
{
m_combo1.AddString(pDriveStrings);
pDriveStrings += szDriveString+1;
szDriveString = wcslen(pDriveStrings);
}
m_combo1.SetCurSel(0);

FindDirectory(_T("C:\\*.*"));//遍历指定路径下所有文件
return TRUE; // 除非将焦点设置到控件,否则返回 TRUE
}
接下来编写FindDirectory()函数,遍历指定路径下所有文件
编写GetFileIcon()函数,获取指定文件的文件类型和图标索引号
添加Combo Box的选定内容更改事件处理程序
添加List Control的双击鼠标左键事件响应程序

具体代码:

http://download.csdn.net/detail/huchenguang/7005503


你可能感兴趣的:(mfc)