向CTreeCtrl控件中按实际的磁盘目录结构添加节点;

qq24486838 2009-11-21 05:50:17

/*/
目的: 向CTreeCtrl控件中按实际的磁盘目录结构添加节点;
设计方案: 不使用成员变量或全局变量,由回调函数机制完成;
单击按钮,执行通用函数EnumDirectoriesFiles,
EnumDirectoriesFiles能够递归扫描磁盘目录结构,
只要搜索到任何目录时,即执行一次参数二指定的回调函数,
实现与外部操作相关联,因为EnumDirectoriesFiles是通用函数,
所有操作控件的外部具体操作均在回调函数中完成;
因回调函数procEnumedDirectoriesFiles由EnumDirectoriesFiles自动调用,
故,为了能在回调函数中使用外部参数,如树控件、根节点对象等,
EnumDirectoriesFiles提供了最后三个指针类型的参数,单击按钮时
向此三个参数传递树控件对象、根节点对象的指针,EnumDirectoriesFiles
过程中向回调函数的最后三个参数传递这三个值,实现回调函数中可以使用
外部参数的目的。
问题: 现在通用函数EnumDirectoriesFiles可以正常完成其扫描所有层次的目录工作,
回调函数在每扫描到目录时被自动执行,向树列表中添加目录节点,但现在
的问题是不能实现按层次添加节点。
要求: 不要更改现行的设计方案。

//*/

//枚举指定目录下所有子目录
void EnumDirectoriesFiles
(
//待搜索的目标路径
const CString& directoryParent,
//回调函数
void(*procEnumedDirectoriesFiles)(const CString& returnPath, const bool& returnIsDirectory, void* param1, void* param2, void* param3),
//以下三个参数为任意类型,目的在于调用方向本函数的参数二指定的回调函数提供后三个参数
void* param1ProcEnum,
void* param2ProcEnum,
void* param3ProcEnum
)
{
CFileFind lo_finder;
BOOL lb_rstFind = lo_finder.FindFile(directoryParent + "\\*.*");
CString ls_string("");
bool lb_isDir = false;
while(lb_rstFind)
{
lb_rstFind = lo_finder.FindNextFile();
if (lo_finder.IsDots())continue;

if (lo_finder.IsDirectory())
//若为目录
{
lb_isDir = true;
ls_string = lo_finder.GetFilePath();
if(procEnumedDirectoriesFiles!=NULL)
//执行回调函数
procEnumedDirectoriesFiles(ls_string, lb_isDir, param1ProcEnum, param2ProcEnum, param3ProcEnum);
//递归调用本函数实现搜索所有子目录
EnumDirectoriesFiles(lo_finder.GetFilePath(), procEnumedDirectoriesFiles, param1ProcEnum, param2ProcEnum, param3ProcEnum);
}
}
ls_string.Empty();
ls_string.FreeExtra();
lo_finder.Close();
}

//回调函数,实现向树列表中按层次添加目录节点
void procEnumedDirectoriesFiles(const CString& returnPath, const bool& returnIsDirectory, void* param1, void* param2, void* param3)
{
//第一个参数为CTreeCtrl控件的指针
CTreeCtrl* lo_pTreeCtrl = (CTreeCtrl*)param1;
//第二个参数为父节点的指针
HTREEITEM* lo_pNodeParent = (HTREEITEM* )(param2) ;
//向父节点添加新的子节点
HTREEITEM lo_childNode = lo_pTreeCtrl->InsertItem(returnPath, *lo_pNodeParent);
//将父节点的指针指向新建的子节点
param2 = &lo_childNode;

//问题可能就出在上一句。
}

void CXmlTestDlg::OnButton1()
{
//搜索的目录
CString ls_dir;
ls_dir = "d:\\a";
//创建根节点
HTREEITEM lo_parentItem ;
lo_parentItem = ctrl_tree.InsertItem(ls_dir, TVI_ROOT);
//枚举指定目录下所有子目录
//参数二指定了回调函数,目的在于向树列表控件中添加目录结构
EnumDirectoriesFiles(ls_dir, procEnumedDirectoriesFiles, &ctrl_tree, &lo_parentItem, NULL);
}
...全文
161 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
qq24486838 2009-11-21
  • 打赏
  • 举报
回复
分不够可以再加!
qq24486838 2009-11-21
  • 打赏
  • 举报
回复
分不够可以再加哦
qq24486838 2009-11-21
  • 打赏
  • 举报
回复
天哪,代码并不长,是说明太长了而已
icefairy 2009-11-21
  • 打赏
  • 举报
回复
太长了 给你up下 ~~~~

16,551

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Creator Browser
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

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