http://blog.youkuaiyun.com/pknife/archive/2008/08/05/2772055.aspx
这个问题其实是由pocket pc的CFileDialog问题引发来的。
CFileDialog打开后,只能选择My Documents下的目录和文件,功能超弱的说(其实应该叫CDocumentFileDialog才对)。
好想自己做一个Dialog啊,就跟PC上一样,可以选择任务目录和文件......
枝节不叙,捡点重要的来啰嗦。
用到一个CListCtrl控件,来显示目录下的文件,当然图标最好跟系统的一样,这样才美观。
这里假设m_ListFile就是list控件,m_ImlSys为CImageList对象,都为对话框的成员变量。代码如下:
HIMAGELIST hImlSys;
SHFILEINFO ssfi;
memset(&ssfi,0,sizeof(ssfi));
hImlSys = (HIMAGELIST)SHGetFileInfo(
_T("hello"),
0,
&ssfi,
sizeof(SHFILEINFO),
SHGFI_USEFILEATTRIBUTES | SHGFI_SYSICONINDEX | SHGFI_SMALLICON);
m_ImlSys.Attach(hImlSys);
m_ListFile.SetImageList(&m_ImlSys, LVSIL_SMALL);
这样把系统的小图标(SHGFI_SMALLICON)都载入到了m_ImlSys。这些代码在Dialog的OnInitDialog中实现。"hello"也可以写成任何值,因为使用了SHGFI_USEFILEATTRIBUTES参数,会忽略第一个参数。还有一个很重要的问题是,在对话框退出时,要调用m_ImlSys.Detach()来销毁资源。不然,很可能退出对话框后,连系统"开始"的的图标都看不到了。
CListCtrl的InsertItem可以指定显示图标的索引(即图标在CImageList中的位置)。那么,怎么得到这个索引值呢?
还是使用SHGetFileInfo函数,如下:
SHFILEINFO ssfi;
SHGetFileInfo(pszFileName, 0, &ssfi, sizeof(SHFILEINFO), SHGFI_SYSICONINDEX | SHGFI_SMALLICON);
ssfi.iIcon就是我们要的值。在这里,pszFileName请指定文件的整个路径(包括后缀名)。
评论:
方法1:
m_pImageListSmall->Create(16, 16, ILC_COLOR16|ILC_MASK, 1, 1);
m_pImageListSmall->Add(lpAddTaskInfo->hIconSmall);
m_ListTask.SetImageList(m_pImageListSmall, LVSIL_SMALL);
方法2:
m_pImageListSmall->Create(16, 16, ILC_COLOR16|ILC_MASK, 0, 0);
m_ListTask.SetImageList(m_pImageListSmall, LVSIL_SMALL);
............
nItemCount = m_pImageListSmall->GetImageCount();
nImageCount += 1;
m_pImageListSmall->SetImageCount(nImageCount);
nImageCount = theApp.m_pImageListSmall->Add(lpAddTaskInfo->hIconSmall);
m_ListTask.InsertItem(0, TEXT("想要显示的值"), nImageCount);
m_ListTask.SetItemText(0, 1, TEXT("想要显示的值"));
............
if( m_pImageListSmall )
delete m_pImageListSmall; 文章链接:http://blog.youkuaiyun.com/pknife/archive/2008/08/05/2772055.aspx 发表时间:2008年12月11日 11:18:25">举报
上面方法会占用很多内存, 并且不会释放, 我之前也是这么做的, 发现内存泄漏很严重.
正确方法:
int nItemCount = 0;
CImageList *m_pImageListSmall;
SHFILEINFO ssfi;
m_pImageListSmall = new CImageList();
if( m_pImageListSmall == NULL )
return;
SHGetFileInfo( (LPCTSTR)_T("//"), 0, &ssfi, sizeof(SHFILEINFO),
SHGFI_TYPENAME | SHGFI_SYSICONINDEX | SHGFI_SMALLICON);
方法1:
m_pImageListSmall->Create(16, 16, ILC_COLOR16|ILC_MASK, 1, 1);
m_pImageListSmall->Add(lpAddTaskInfo->hIconSmall);
m_ListTask.SetImageList(m_pImageListSmall, LVSIL_SMALL);
方法2:
m_pImageListSmall->Create(16, 16, ILC_COLOR16|ILC_MASK, 0, 0);
m_ListTask.SetImageList(m_pImageListSmall, LVSIL_SMALL);
............
nItemCount = m_pImageListSmall->GetImageCount();
nImageCount += 1;
m_pImageListSmall->SetImageCount(nImageCount);
nImageCount = theApp.m_pImageListSmall->Add(lpAddTaskInfo->hIconSmall);
m_ListTask.InsertItem(0, TEXT("想要显示的值"), nImageCount);
m_ListTask.SetItemText(0, 1, TEXT("想要显示的值"));
............
if( m_pImageListSmall )
delete m_pImageListSmall;