系统默认文件类型图标获取--上位机VC
系统默认文件类型图标获取--上位机VC
功能展示
操作系统上任何文件类型都有对应的图标,当前例程实现指定文件类型图标的获取,效果如图。在编辑框任意输入带后缀的文件名称,点击按钮或按回车键,程序都会将指定后缀文件的大图标与小图标对应的显示在列表框及树形控件上;
要点提示
例程通过简单封装一个自定义类class CSystemImageList ; 在类中通过函数int GetIcon( const CString& sName, BOOL bOpen =FALSE, BOOL bSmall = TRUE ) const; 获取图标。通过函数CImageList * GetImageList( BOOLbSmall = TRUE ) const;//获取大或小图标列表;
获取图标函数中是通过调用SHGetFileInfo()获取获取一个SHFILEINFO类型的结构体,结构体的成员变量iIcon就是我们要的图标 WINSHELLAPI DWORD WINAPI SHGetFileInfo( LPCTSTR pszPath,DWORD dwFileAttributes, SHFILEINFO FAR *psfi, UINT cbFileInfo, UINT uFlags ); pszPath 参数:指定的文件名。
当uFlags的取值中不包含 SHGFI_PIDL时,可直接指定;
当uFlags的取值中包含 SHGFI_PIDL时pszPath要通过计算获得,不能直接指定; dwFileAttributes参数:文件属性。
仅当uFlags的取值中包含SHGFI_USEFILEATTRIBUTES时有效,一般不用此参数;
psfi 参数:返回获得的文件信息,是一个记录类型,有以下字段:
_SHFILEINFOA = record
hIcon:HICON; { out: icon } //文件的图标句柄
iIcon:Integer; { out: icon index } //图标的系统索引号
dwAttributes WORD; { out: SFGAO_ flags } //文件的属性值
szDisplayName:array [0..MAX_PATH-1] of AnsiChar; { out: display name (or path) } //文件的显示名
szTypeName:array [0..79] ofAnsiChar; { out: type name } //文件的类型名
end; cbFileInfo 参数:psfi的比特值; uFlags 参数:指明需要返回的文件信息标识符,常用的有以下常数:
SHGFI_ICON; //获得图标
SHGFI_DISPLAYNAME; //获得显示名
SHGFI_TYPENAME; //获得类型名
SHGFI_ATTRIBUTES; //获得属性
SHGFI_LARGEICON; //获得大图标
SHGFI_SMALLICON; //获得小图标
SHGFI_PIDL; // pszPath是一个标识符
函数SHGetFileInfo()的返回值也随uFlags的取值变化而有所不同。 可见通过调用SHGetFileInfo()可以由psfi参数得到文件的图标句柄。但要注意在uFlags参数中不使用SHGFI_PIDL时,SHGetFileInfo()不能获得“我的电脑”等虚似文件夹的信息。
应该注意的是,在调用SHGetFileInfo()之前,必须使用 CoInitialize 或者OleInitialize 初始化COM,否则表面上能够使用,但是会造成不安全或者丧失部分功能。例如,一个常见的例子:如果不初始化COM,那么调用该函数就无法得到.htm/.mht/.xml文件的图标。
以下是两个例子:
1.获得系统图标列表:
//取得系统图标列表
uses
ShellAPI
var
ImageListHandle : THandle;
FileInfo: TSHFileInfo;
//小图标
ImageListHandle :=SHGetFileInfo('C:/',
0,
FileInfo,
SizeOf(FileInfo),
SHGFI_SYSICONINDEX or SHGFI_SMALLICON);
//把图标列表同一个名叫ListView1的ListView控件的小图标关联。
SendMessage(ListView1.Handle,LVM_SETIMAGELIST, LVSIL_SMALL, ImageListHandle);
//大图标
ImageListHandle :=SHGetFileInfo('C:/',
0,
FileInfo,
SizeOf(FileInfo),
SHGFI_SYSICONINDEX or SHGFI_LARGEICON);
//把图标列表同一个名叫ListView1的ListView控件的大图标关联。
SendMessage(ListView1.Handle,LVM_SETIMAGELIST, LVSIL_NORMAL, ImageListHandle); 2.获得一个文件的显示名和图标
var
sfi: TSHFileInfo;
IconIndex : Integer;
//取图标的索引号等信息
SHGetFileInfo(PAnsiChar(FileName),
0,
sfi,
sizeof(TSHFileInfo),
ShellAPI.SHGFI_DISPLAYNAME or ShellAPI.SHGFI_TYPENAME or ShellAPI.SHGFI_LARGEICONor ShellAPI.SHGFI_ICON);
//显示名和图标在系统图标列表中的编号就分别在sfi.szDisplayName和sfi.iIcon中
实现功能 1.新建基于对话框的应用程序
2.新建一个自定义的类class CSystemImageList ,并添加两个成员变量及四个成员函数,构造及析构函数中初始化及释放变量 - private:
- CImageList * m_gpLargeImageList;//大图标列表
- CImageList * m_gpSmallImageList;//小图标列表
- BOOL InitGlobalList( CImageList *& rpImageList, BOOL bSmall = TRUE );
- void DestroyGlobalList( CImageList *& rpImageList );//销毁图标列表
- public:
- CImageList * GetImageList( BOOL bSmall = TRUE ) const;//获取大/小图标列表
- int GetIcon( const CString& sName, BOOL bOpen = FALSE, BOOL bSmall = TRUE ) const; //获取图标
- CSystemImageList::CSystemImageList()
- {
- m_gpLargeImageList = NULL;
- m_gpSmallImageList = NULL;
- InitGlobalList( m_gpSmallImageList, TRUE );
- InitGlobalList( m_gpLargeImageList, FALSE );
- }
- CSystemImageList::~CSystemImageList()
- {
- DestroyGlobalList( m_gpLargeImageList );
- DestroyGlobalList( m_gpSmallImageList );
- }
复制代码3.类中代码的实现可参阅例程,然后是自定义类的使用。在主对话框中包含自定义类头文件#include “SystemImageList.h“,及一个初始成员变量CSystemImageList m_ImgList; 4.准备界面,添加一编辑框ID不变,一列表控件,树状控件,ID都保持不变。添加一按钮,关联按钮的点击函数 - void CGkbc8Dlg::OnButton1()
- {
- CString sFile;
- GetDlgItemText(IDC_EDIT1,sFile);
- CListCtrl*pList = (CListCtrl*)GetDlgItem(IDC_LIST1);
- CTreeCtrl*pTree = (CTreeCtrl*)GetDlgItem(IDC_TREE1);
- pTree->InsertItem( sFile, m_ImgList.GetIcon( sFile ), m_ImgList.GetIcon( sFile, TRUE ) );
- pList->InsertItem( 1, sFile, m_ImgList.GetIcon( sFile, FALSE, TRUE ) );
- }
复制代码5.这样就可以实现系统各种类型文件大小图标的获取;记得在程序初始化时设置列表控件及树状控件的图标列表
我们来演示下功能实现的整个过程 如果您认可,可联系功能定制! 如果您着急,充值会员可直接联系发您资料!
|