最近在研究c++文件管理的项目,遇到部分问题总结一下。仅做笔记。
1.mfc使用CListCtrl显示文件设置。属性Accept File为True,view设置icon显示大图标report为列表;
2.定义CImageList为全局变量。未设置成全局变量或公有会导致图标无法显示;
CImageList m_icon;//定义列表头的图标列表
3.出现不能显示,只能显示部分图标或者只显示第一个图标问题。可能是未将设置函数放到初始化里;
m_icon.Create(32, 32, ILC_COLOR32 | ILC_MASK, 1, 1);//第一个‘1’代表加载图标的个数,加载多个图标也可
m_list.SetImageList(&m_icon, LVSIL_NORMAL);
4.mfc选择文件夹问题。CFileDialog 中没有直接选定文件夹的方法。所以借鉴了些代码;
TCHAR szFolderPath[MAX_PATH] = { 0 };
CString strFolderPath = TEXT("");
BROWSEINFO sInfo;
::ZeroMemory(&sInfo, sizeof(BROWSEINFO));
sInfo.pidlRoot = 0;
sInfo.lpszTitle = _T("选择文件夹路径");
sInfo.ulFlags = BIF_RETURNONLYFSDIRS | BIF_EDITBOX | BIF_DONTGOBELOWDOMAIN;
sInfo.lpfn = NULL;
// 显示文件夹选择对话框
LPITEMIDLIST lpidlBrowse = ::SHBrowseForFolder(&sInfo);
if (lpidlBrowse != NULL)
{
// 取得文件夹名
if (::SHGetPathFromIDList(lpidlBrowse, szFolderPath))
{
strFolderPath = szFolderPath;
}
}
if (lpidlBrowse != NULL)
{
::CoTaskMemFree(lpidlBrowse);
}
5.检索文件与显示。因需求只实现了检索指定文件夹中全部文件的文件名和图标。
m_list.DeleteAllItems();
CFileFind finder;
CString strDirectory = strFolderPath;
if (strDirectory.Right(1) != "\\")
strDirectory += "\\";
strDirectory += "*.*";
CString strFile;
BOOL IsFind = finder.FindFile(strDirectory);
while (IsFind)
{
IsFind = finder.FindNextFile();
if (finder.IsDots())
continue;//“.”,不扫描
else if (finder.IsDirectory())
continue;//目录,不扫描
else {
SHFILEINFO info;
strFile = finder.GetFileName();
CString temp = strDirectory;
int index = temp.Find(_T("*.*"));
temp.Delete(index, 3);
SHGetFileInfo(temp + strFile, FILE_ATTRIBUTE_NORMAL, &info, sizeof(&info), SHGFI_ICON |
SHGFI_ICONLOCATION | SHGFI_SYSICONINDEX |SHGFI_USEFILEATTRIBUTES | SHGFI_DISPLAYNAME);
//IconID = info.iIcon;图标代码
m_icon.Add(info.hIcon);
m_list.InsertItem(m_list.GetItemCount(), info.szDisplayName, m_list.GetItemCount());
//第一个参数为第几个文件,最后一个参数为list中图标索引,为了简洁直接对应。
}
}