前言
这是我之前做项目的时候一步步查阅慢慢做出来的,为方便以后使用,先记下来。
可能看标题还是有些模糊,我们先来看看效果图吧!
现在图片看完了,我们进入主题吧,我将一步一步实现本地的文件管理系统(PS:你过这里我只对List Control 控件进行讲述,而对上面的位图控件则不做概述了,想要了解如何做位图控件的小伙伴可以到我之前写的博客中查阅)。
代码实现
温馨提示 本项目中使用的是多字节编码,可以到项目属性的配置属性中选择常规,然后看到字符集,选择使用多字节字符集,如果不使用这个编码格式的话下面的代码很多字符将会报错,当然你也可以用Unicode字符集并对字符格式做相应的处理。
1、我们创建一个MFC对话框命名为LocalFileSys,在对话框中删除MFC自动创建的控件。
2、往对话框中插入List Control控件,并右键属性找到View栏,设置为Report,效果如下图:
3、右键控件选择添加添加变量,设置变量名为:m_local_list
4、来到LocalFileSysDlg.h文件下做声明,先添加一个数组用于存储磁盘符,跟两个函数如下:
public:
BYTE m_szLocalDiskDriverList[0x1000];
VOID InitLocalDiskDriverList(); // 初始化本地磁盘驱动列表
int GetLocalIconIndex(LPCTSTR szVolume, DWORD dwFileAttributes);
5、实现上面声明的函数,来到LocalFileSysDlg.cpp下:
int CLocalFileSysDlg::GetLocalIconIndex(LPCTSTR szVolume, DWORD dwFileAttributes)
{
SHFILEINFO sfi;
if (dwFileAttributes == INVALID_FILE_ATTRIBUTES)
dwFileAttributes = FILE_ATTRIBUTE_NORMAL;
else
dwFileAttributes |= FILE_ATTRIBUTE_NORMAL;
SHGetFileInfo(
szVolume,
dwFileAttributes,
&sfi,
sizeof(SHFILEINFO),
SHGFI_SYSICONINDEX | SHGFI_USEFILEATTRIBUTES
);
return sfi.iIcon;
}
VOID CLocalFileSysDlg::InitLocalDiskDriverList()
{
// 在打开根目录是应该先清空掉里面的items
m_local_list.DeleteAllItems();
while (m_local_list.DeleteColumn(0) != 0);
m_local_list.InsertColumn(0, "名称", LVCFMT_LEFT, 80);
m_local_list.InsertColumn(1, "类型", LVCFMT_RIGHT, 100);
m_local_list.InsertColumn(2, "总大小", LVCFMT_RIGHT, 110);
m_local_list.InsertColumn(3, "可用空间", LVCFMT_RIGHT, 110);
m_local_list.SetExtendedStyle(LVS_EX_FULLROWSELECT);
char *Travel = NULL;
/* 获取磁盘符 如C:\'\0'D:\'\0'E:\ 每个盘符之间用了'\0'做间隔*/
GetLogicalDriveStrings(sizeof(m_szLocalDiskDriverList), (LPSTR)m_szLocalDiskDriverList);
Travel = (char *)m_szLocalDiskDriverList; // 因为有\0的缘故Travel表示c:\
CHAR szFileSystem[MAX_PATH];
unsigned __int64 ulHardDiskAmount = 0; // 硬盘总大小
unsigned __int64 ulHardDiskFreeSpace = 0; // 硬盘空闲空间
unsigned long ulHardDiskAmountMB; // 硬盘总大小 MB
unsigned long ulHardDiskFreeSpaceMB = 0; // 剩余空间 MB
for (int i = 0; *Travel != '\0'; i++, Travel += lstrlen(Travel) + 1)
{
// 获取磁盘相关信息
memset(szFileSystem, 0, sizeof(szFileSystem));
// 获取文件系统信息及大小
GetVolumeInformation(Travel, NULL, 0, NULL, NULL, NULL, szFileSystem, MAX_PATH);
ULONG ulFileSystemLength = lstrlen(szFileSystem) + 1;
if (GetDiskFreeSpaceEx(Travel, (PULARGE_INTEGER)&ulHardDiskFreeSpace, (PULARGE_INTEGER)&ulHardDiskAmount, NULL))
{
// 将k转换为MB的形式
ulHardDiskAmountMB = ulHardDiskAmount / 1024 / 1024;
ulHardDiskFreeSpaceMB = ulHardDiskFreeSpace / 1024/ 1024;
}
else
{
ulHardDiskAmountMB = 0;
ulHardDiskFreeSpaceMB = 0;
}
// 向本地list控件中插入磁盘信息
// GetFileAttributes 获取指定文件或目录的属性
// InsertItem 插入新的一行,里头第二参数最多设置项里的第一字段,而想设置其他字段的内容,要用SetItemText,简单地说,就是前者是为了创建,后者是为了编辑
int iItem = m_local_list.InsertItem(i, Travel, GetLocalIconIndex(Travel, GetFileAttributes(Travel)));
m_local_list.SetItemData(iItem, 1);
SHFILEINFO sfi;
// 获取系统信息
SHGetFileInfo(Travel, FILE_ATTRIBUTE_NORMAL, &sfi, sizeof(SHFILEINFO), SHGFI_TYPENAME | SHGFI_USEFILEATTRIBUTES);
m_local_list.SetItemText(iItem, 1, sfi.szTypeName);
CString strCount;
strCount.Format("%10.1f GB", (float)ulHardDiskAmountMB / 1024);
m_local_list.SetItemText(iItem, 2, strCount);
strCount.Format("%10.1f GB", (float)ulHardDiskFreeSpaceMB / 1024);
m_local_list.SetItemText(iItem, 3, strCount);
}
}
6、我们在LOcalFileSysDlg.cpp中找到OnInitDialog()函数,在里面添加我们刚刚编写的函数(PS:在// TODO: 在此添加额外的初始化代码后面添加),InitLocalDiskDriverList();
现在来看看我们的效果:
可以看出我们这里还没有图标,以及鼠标双击响应函数,在下一节中我们会接着这里继续说。