前言
這是我之前做項目的時候一步步查閱慢慢做出來的,爲方便以後使用,先記下來。
可能看標題還是有些模糊,我們先來看看效果圖吧!
現在圖片看完了,我們進入主題吧,我將一步一步實現本地的文件管理系統(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();
現在來看看我們的效果:
可以看出我們這裏還沒有圖標,以及鼠標雙擊響應函數,在下一節中我們會接着這裏繼續說。