文件管理器获取目录情况无法正常运行!

kakukeme 2011-01-11 10:35:30

// FilesAssistantDlg.h : 头文件
//

#pragma once
#include "afxcmn.h"
......
private:
//初始化逻辑分区
void InitPath(void);


// 文件目录
CTreeCtrl m_tcDirectories;


CString m_strSearchPath;//搜索路径
//获取子目录结构
void GetSubDirectories(LPNMTREEVIEW pNMTreeView);
CListCtrl m_lcFiles;//出错了!!!!
void OnTvnSelchangedTreeDirectories(NMHDR *pNMHDR,
LRESULT *pResult);

// FilesAssistantDlg.cpp : 实现文件
/
.........
////////////////////////////////////////////////////////////////////////////////////
//函数名称:InitPath
//函数介绍:
// 初始化逻辑分区,
//输入参数
//
//输出参数
//
//返回值
//
/////////////////////////////////////////////////////////////////////////////////////
void CFilesAssistantDlg::InitPath(void)
{
wchar_t *pLogicalDrivers = new wchar_t[MAX_PATH];//申请用于存储结果的缓冲区


pLogicalDrivers[0] = '\0';//初始化空字符串
int nLen = GetLogicalDriveStrings(MAX_PATH-1, pLogicalDrivers);
//获取逻辑分区列表

if (0==nLen)
{
//无结果则退出函数
return;
}


int nDriverNameLength = wcslen(L"C:\\")+1;//格式为"C:\",末尾还有一个表示结束的空字符
int i = 0;
//在IDC_TREE_DIRECTORIES显示结果,即田间树形控件的内容
TVINSERTSTRUCT tvInsertItem;
tvInsertItem.hParent = NULL;
tvInsertItem.hInsertAfter = NULL;
tvInsertItem.item.mask = TVIF_TEXT;
do
{
tvInsertItem.item.pszText = pLogicalDrivers+i;
m_tcDirectories.InsertItem(&tvInsertItem);//目录树中增加逻辑分区
i += nDriverNameLength;
}while(i<nLen);
delete[] pLogicalDrivers;//回收缓冲区
}



const wchar_t PATH_SPACER[] = L"\\";//路径分隔符
///////////////////////////////////////////////////////////////////////////////////////////
//函数名称:GetSubDirectories
//函数介绍:
// 获取子目录结构
//函数参数:
// pNMTreeView:一个用于传递消息的内容的结构体指针,
// 传递了TVN_SELCHANGED携带的消息内容
//输出函数:
// 无
//返回值:
// 无
///////////////////////////////////////////////////////////////////////////////////////////
void CFilesAssistantDlg::GetSubDirectories(LPNMTREEVIEW pNMTreeView)
{
//为没有打开的文件建立下级列表
HTREEITEM hTreeItem = pNMTreeView->itemNew.hItem;


//查找选定目录下的内容


//组合查询条件
wchar_t* strSearchPath = new wchar_t[MAX_PATH];
strSearchPath[0] = L'\0';


//组合完整路径,向上组合
wcscpy(strSearchPath, m_tcDirectories.GetItemText(hTreeItem));
wcscat(strSearchPath, PATH_SPACER);
HTREEITEM hTreeItemTemp = m_tcDirectories.GetParentItem(hTreeItem);
wchar_t* strTemp = new wchar_t[MAX_PATH];
while(NULL!=hTreeItemTemp)
{
wcscpy(strTemp, m_tcDirectories.GetItemText(hTreeItemTemp));
wcscat(strTemp, PATH_SPACER);
wcscat(strTemp, strSearchPath);
wcscpy(strSearchPath, strTemp);
hTreeItemTemp = m_tcDirectories.GetParentItem(hTreeItemTemp);
}


m_strSearchPath = strSearchPath;//复制到成员变量,用于文件列表
m_strSearchPath.Replace(L"\\\\",L"\\");
//增加过滤条件,由于是选择目录因此使用“*.*”
wchar_t strFileName[] = L"*.*";//选择所有的文件
wcscat(strSearchPath, strFileName);

//判定是否存在子项
BOOL bItemHasChildren = m_tcDirectories.ItemHasChildren(hTreeItem);
if(bItemHasChildren)
{
return;
}
//开始查找
WIN32_FIND_DATA FindData;//用于存储找到的文件
HANDLE hFind;//存储用于查找的句柄

hFind = FindFirstFile(strSearchPath, &FindData);

delete[] strSearchPath;
if(INVALID_HANDLE_VALUE == hFind)
{
return;
}


//存在目录
m_lcFiles.DeleteAllItems();//清空文件列表
do
{
//添加目录
if (FILE_ATTRIBUTE_DIRECTORY == (FindData.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY))
{
//不添加“.”和“..”
if ((0==wcscmp(L".",FindData.cFileName)) || (0==wcscmp(L"..",FindData.cFileName)))
{
continue;
}

//添加目录
m_tcDirectories.InsertItem(FindData.cFileName, hTreeItem);
}
}while( FindNextFile(hFind, &FindData));
FindClose(hFind);


m_tcDirectories.Expand(hTreeItem, TVE_EXPAND);
m_tcDirectories.SortChildren(hTreeItem);
}

//这个函数调用不知道放在哪!还请多指教!!!!!!!!!!!void CFilesAssistantDlg::OnTvnSelchangedTreeDirectories(NMHDR *pNMHDR,
LRESULT *pResult)
{
LPNMTREEVIEW pNMTreeView = reinterpret_cast<LPNMTREEVIEW>(pNMHDR);
*pResult = 0;
//获取目录结构
GetSubDirectories(pNMTreeView);
}

...全文
134 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
wuxiying 2012-02-08
  • 打赏
  • 举报
回复
选择Treeview Control,右键选择“添加事件处理程序”,里面选择TVN_SELCHANGED,会自动生成这个函数。起到“响应选择树形控件中不同项目的动作”的作用。这样添加的话,声明、定义、调用就自动做好了。
DiguaSix 2012-01-01
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 diguasix 的回复:]

利用Visual Studio的向导为这个控件添加消息事件,或者直接在CFilesAssistantDlg类里这么一句:

public:
afx_msg void OnTvnSelchangedTreeDirectories(NMHDR *pNMHDR, LRESULT *pResult);

[/Quote]

纠正一下,还是应该利用向量添加事件,直接手动添加函数定义的话FilesAssistantDlg.cpp文件下列函数会有改动:

ON_NOTIFY(TVN_SELCHANGED, IDC_TREE_DIRECTORIES, &CFilesAssistantDlg::OnTvnSelchangedTreeDirectories)
DiguaSix 2012-01-01
  • 打赏
  • 举报
回复
正在学习同一本书,遇到同样的问题,搜到这里……
蒙到了这个问题的解决方法:
利用Visual Studio的向导为这个控件添加消息事件,或者直接在CFilesAssistantDlg类里这么一句:

public:
afx_msg void OnTvnSelchangedTreeDirectories(NMHDR *pNMHDR, LRESULT *pResult);

这本书不适合我这种菜鸟读者啊,不写明白咋会想得到……
向立天 2011-03-03
  • 打赏
  • 举报
回复
您好
我是本版版主
此帖已多日无人关注
请您及时结帖
如您认为问题没有解决可按无满意结帖处理
另外本版设置了疑难问题汇总帖
并已在版面置顶
相关规定其帖子中有说明
您可以根据规定提交您帖子的链接
如您目前不想结帖只需回帖说明
我们会删除此结帖通知

见此回复三日内无回应
我们将强制结帖
相关规定详见界面界面版关于版主结帖工作的具体办法
mayudong1 2011-01-11
  • 打赏
  • 举报
回复
看样子好像是个消息函数

15,979

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 界面
社区管理员
  • 界面
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧