前序
上一步我們實現了雙擊響應事件,這節我們將在裏面添加響應函數。函數主要是用於雙擊一個文件夾後進入到該文件夾內部,並可以通過雙擊 ..兩個點這一欄回到上級目錄。
實現
1、我們來到LocalFileSysDlg.h文件下,我們在CLocalFileSysDlg類裏面聲明如下一些變量及函數
VOID FixedLocalFileList(CString strDirectory = "");
CString GetParentDirectory(CString strPath);
CString m_Local_File_Path;
其中:
FixedLocalFileList函數主要是用於文件夾跳轉
GetParentDirectory函數主要是獲取上級目錄地址
m_Local_File_Path變量則是用於保存當前的文件夾路徑。
2、我們來到LocalFileSysDlg.cpp文件下,在這裏添加上面聲明的函數的實現體。
CString CLocalFileSysDlg::GetParentDirectory(CString strPath)
{
CString strCurrentPath = strPath;
int iIndex = strCurrentPath.ReverseFind('\\'); // 查找最後一個'\\'
if (-1 == iIndex) {
return strCurrentPath;
}
CString strCurrentSubPath = strCurrentPath.Left(iIndex); // 取左邊
iIndex = strCurrentSubPath.ReverseFind('\\');
if (-1 == iIndex) {
strCurrentPath = "";
return strCurrentPath;
}
strCurrentPath = strCurrentSubPath.Left(iIndex);
if (strCurrentPath.Right(1) != "\\")
strCurrentPath += "\\";
return strCurrentPath;
}
VOID CLocalFileSysDlg::FixedLocalFileList(CString strDirectory)
{
if (strDirectory.GetLength() == 0)
{
int iItem = m_local_list.GetSelectionMark(); // 獲取選中的項
// 在list控件中選中
if (iItem != -1)
{
if (m_local_list.GetItemData(iItem) == 1)
{
strDirectory = m_local_list.GetItemText(iItem, 0); // 獲取路徑地址
}
}
}
// 每次打開一個文件夾時 第一行使用 ".."代表上級目錄
// 雙擊".." 時返回上級目錄
if (strDirectory == "..")
{
m_Local_File_Path = GetParentDirectory(m_Local_File_Path);
}
// 刷新當前目錄
else if (strDirectory != ".")
{
m_Local_File_Path += strDirectory;
if (m_Local_File_Path.Right(1) != "\\")
{
m_Local_File_Path += "\\";
}
}
// 是驅動器的根目錄,返回磁盤列表
if (m_Local_File_Path.GetLength() == 0)
{
InitLocalDiskDriverList(); // ..
return;
}
// 插入新的文件目錄
m_local_list.DeleteAllItems();
while (m_local_list.DeleteColumn(0) != 0); // 刪除
m_local_list.InsertColumn(0, "名稱", LVCFMT_LEFT, 200);
m_local_list.InsertColumn(1, "大小", LVCFMT_LEFT, 100);
m_local_list.InsertColumn(2, "類型", LVCFMT_LEFT, 100);
m_local_list.InsertColumn(3, "修改日期", LVCFMT_LEFT, 115);
int iItemIndex = 0;
// InsertItem向list控件中插入列表項
m_local_list.SetItemData(m_local_list.InsertItem(iItemIndex++, "..",
GetLocalIconIndex(NULL, FILE_ATTRIBUTE_DIRECTORY)), 1);
// i 爲 0 時列目錄,i 爲 1時列文件
for (int i = 0; i < 2; i++)
{
CFileFind FindFile;
BOOL bContinue;
bContinue = FindFile.FindFile(m_Local_File_Path + "*.*"); // 文件搜索
while (bContinue)
{
bContinue = FindFile.FindNextFile(); // 查找下一個
if (FindFile.IsDots()) // 是 '.'
continue;
BOOL bIsInsert = !FindFile.IsDirectory() == i; // 判斷是否爲目錄
if (!bIsInsert)
continue;
int iItem = m_local_list.InsertItem(iItemIndex, FindFile.GetFileName(),
GetLocalIconIndex(FindFile.GetFileName(), GetFileAttributes(FindFile.GetFilePath())));
m_local_list.SetItemData(iItem, FindFile.IsDirectory());
// 獲取文件/文件夾信息
SHFILEINFO sfi;
SHGetFileInfo(FindFile.GetFileName(), FILE_ATTRIBUTE_NORMAL, &sfi,sizeof(SHFILEINFO),
SHGFI_TYPENAME | SHGFI_USEFILEATTRIBUTES);
if (FindFile.IsDirectory()) {
m_local_list.SetItemText(iItem, 2, "文件夾");
}
else {
m_local_list.SetItemText(iItem, 2, sfi.szTypeName);
}
// 插入文件/文件夾的大小
CString strFileLength;
strFileLength.Format("%10d KB", (FindFile.GetLength() / 1024));
m_local_list.SetItemText(iItem, 1, strFileLength);
// 插入文件/文件夾的修改時間
CTime time;
FindFile.GetLastWriteTime(time);
m_local_list.SetItemText(iItem, 3, time.Format("%Y-%m-%d %H:%M"));
}
}
}
上面的代碼有點多,不過我在這裏已經做了大量註釋了,相信不會太難看得懂的。
3、我們來到上節講的雙擊函數中將MessageBox()函數註釋掉,並添加FixedLocalFileList();,具體如下:
VOID CLocalFileSysDlg::OnNMDblclkListLocal(NMHDR *pNMHDR, LRESULT *pResult)
{
LPNMITEMACTIVATE pNMItemActivate = reinterpret_cast<LPNMITEMACTIVATE>(pNMHDR);
// TODO: 在此添加控件通知處理程序代碼
if (m_local_list.GetSelectedCount() == 0 ||
m_local_list.GetItemData(m_local_list.GetSelectionMark()) != 1)
return;
// MessageBox("雙擊了");
FixedLocalFileList();
*pResult = 0;
}
添加完上面代碼我們此時既可以通過雙擊進入到下一級目錄了,效果圖如下:
到這裏我們已經可以進入到文件夾內部了,如果後續還需要增加對文件夾/文件的增、刪、重命名、打開等操作的話,可以給我留言,有時間的話我會繼續在博客中完善這些功能的。