MFC中利用树形控件和列表控件来显示显示系统的资源列表
来源:互联网 发布:android 相册源码 编辑:程序博客网 时间:2024/04/30 05:57
在实际程序开发中,经常需要显示系统的资源列表。
下面我们的实现的是在树形控件显示层次目录信息,在列表控件中显示选中目录下面包含的文件
首先 来看一下实现的Demo图。
首先,我们需要在初始化函数OnInitDialog中,获取到系统目录驱动器的信息委树形控件的一级界面,并获取到磁盘驱动器的一级目录作为树形控件的2级界面。
首先我们需要在OninitDialog中进行初始化。
以下为头文件中定义的函数及变量
public:
CImageList m_imagelist;
// CListCtrl m_ctLisy;
CListCtrl m_ctlList;
CTreeCtrl m_ctlTree;
HTREEITEM hRoot;
public:
void GetLogicalDrives(HTREEITEM hParents);
void GetDirverDir(HTREEITEM hParents);
afx_msg void OnTvnItemexpandedTree1(NMHDR *pNMHDR, LRESULT *pResult);
void AddSubItem(HTREEITEM hParents);
CString GetFullPath(HTREEITEM hCurrent);
afx_msg void OnTvnSelchangedTree1(NMHDR *pNMHDR, LRESULT *pResult);
BOOL CMFCApplication10Dlg::OnInitDialog()
{
CDialogEx::OnInitDialog();
// TODO: 这是在OnInitDialog中自定义的代码
m_imagelist.Create(32, 32, ILC_COLOR32, 10, 30);
m_ctlList.SetImageList(&m_imagelist, LVSIL_NORMAL);
m_ctlList.SetBkColor(RGB(200, 200, 255));
DWORD dwStyle = GetWindowLong(m_ctlTree.m_hWnd, GWL_STYLE);
dwStyle |= TVS_HASBUTTONS | TVS_HASLINES | TVS_LINESATROOT;
SetWindowLong(m_ctlTree.m_hWnd, GWL_STYLE, dwStyle);
hRoot = m_ctlTree.InsertItem(_T("我的电脑"));
GetLogicalDrives(hRoot);
GetDirverDir(hRoot);
m_ctlTree.Expand(hRoot , TVE_EXPAND);
m_ctlTree.SetBkColor(RGB(200, 200, 255));
m_ctlTree.SetTextColor(RGB(127, 0, 0));
return TRUE; // 除非将焦点设置到控件,否则返回 TRUE
}
其中的 void GetLogicalDrives(HTREEITEM hParents); 函数用于获取系统驱动器,并添加到树形控件中,具体代码如下:
void CMFCApplication10Dlg::GetLogicalDrives(HTREEITEM hParents){
size_t szAllDirversStrings = GetLogicalDriveStrings(0, NULL);
wchar_t *pDriveStrings = new wchar_t[szAllDirversStrings + sizeof(_T(""))];
GetLogicalDriveStrings(szAllDirversStrings, pDriveStrings); //第一个驱动器
size_t szDriveString = lstrlenW(pDriveStrings);
while (szDriveString > 0){ //利用递归搜索驱动器
m_ctlTree.InsertItem(pDriveStrings, hParents); //向树形控件添加节点
pDriveStrings += szDriveString + 1; //下一个驱动器
szDriveString = lstrlenW(pDriveStrings);
}
}
其中的void GetDirverDir(HTREEITEM hParents);函数实现搜索磁盘的一级子目录,并添加到树形控件中,具体代码如下:
void CMFCApplication10Dlg::GetDirverDir(HTREEITEM hParnets){ //将驱动下的子目录作为子项
HTREEITEM hChild = m_ctlTree.GetChildItem(hParnets);
while (hChild){ //递归搜索驱动器
CString strText = m_ctlTree.GetItemText(hChild);
if (strText.Right(1) != "\\"){
strText += _T("\\");
}
strText += "*.*";
CFileFind file;
bool bContinue = file.FindFile(strText);
while (bContinue) //递归搜索驱动器下的文件
{
bContinue = file.FindNextFileW();
if (file.IsDirectory() && !file.IsDots()) //如果是目录,添加驱动器下的一级子项
m_ctlTree.InsertItem(file.GetFileName(), hChild);
}
GetDirverDir(hChild); //递归
hChild = m_ctlTree.GetNextItem(hChild, TVGN_NEXT);
}
}
为树形控件添加TVN_ITEMEXPANDED消息响应函数,实现当展开子项时,搜索改子目录下的其他目录,并添加到树形控件的下一级节点中,实现代码如下:
void CMFCApplication10Dlg::OnTvnItemexpandedTree1(NMHDR *pNMHDR, LRESULT *pResult)
{
LPNMTREEVIEW pNMTreeView = reinterpret_cast<LPNMTREEVIEW>(pNMHDR);
// TODO: 在此添加控件通知处理程序代码
TVITEM item = pNMTreeView->itemNew;
if (item.hItem == hRoot) //如果是根节点就返回
return;
HTREEITEM hChild = m_ctlTree.GetChildItem(item.hItem);
while (hChild){
AddSubItem(hChild); //搜索子目录,添加子项
hChild = m_ctlTree.GetNextItem(hChild, TVGN_NEXT); //获取下一个子项
}
*pResult = 0;
}
其中的void AddSubItem(HTREEITEM hParents);用于搜索当前展开目录下的文件和目录,并添加到树形控件中
void CMFCApplication10Dlg::AddSubItem(HTREEITEM hParents){
CString strPath = GetFullPath(hParents);
if (strPath.Right(1) != "\\")
strPath += "\\";
strPath += "*.*";
CFileFind file;
BOOL bContinue = file.FindFile(strPath);
while (bContinue){ //递归搜索改目录下的所有文件和目录,并将目录添加到树形控件中
bContinue = file.FindNextFileW();
if (file.IsDirectory() && file.IsDots()){
m_ctlTree.InsertItem(file.GetFileName(), hParents);
}
}
}
其中的CString GetFullPath(HTREEITEM hCurrent); 是用于查找展开子项中的全路径信息,实现代码如下:
CString CMFCApplication10Dlg::GetFullPath(HTREEITEM hCurrents){
CString strTemp;
CString strReturn = _T("");
while (hCurrents != hRoot){
strTemp = m_ctlTree.GetItemText(hCurrents);
if (strTemp.Right(1) != "\\"){
strTemp += "\\";
}
strReturn = strTemp + strReturn;
hCurrents = m_ctlTree.GetParentItem(hCurrents);
}
return strReturn;
}
为树形控件添加TVN_SELCHANGED消息响应函数,实现将选中目录下包含的文件名和图标显示在列表控件中。
代码如下:
void CMFCApplication10Dlg::OnTvnSelchangedTree1(NMHDR *pNMHDR, LRESULT *pResult)
{
LPNMTREEVIEW pNMTreeView = reinterpret_cast<LPNMTREEVIEW>(pNMHDR);
// TODO: 在此添加控件通知处理程序代码
m_ctlList.DeleteAllItems();
TVITEM item = pNMTreeView->itemNew;
if (item.hItem == hRoot){
return;
}
CString str = GetFullPath(item.hItem);
if (str.Right(1) != "\\"){
str += "\\";
}
str += "*.*";
CFileFind file;
BOOL bContinue = file.FindFile(str);
while (bContinue){
bContinue = file.FindNextFileW();
if (!file.IsDirectory() && !file.IsDots()){
SHFILEINFO info;
CString temp = str;
int index = temp.Find(_T("*.*"));
temp.Delete(index, 3);
SHGetFileInfo(temp + file.GetFileName(), 0, &info, sizeof(&info),SHGFI_DISPLAYNAME | SHGFI_ICON);
int i = m_imagelist.Add(info.hIcon);
m_ctlList.InsertItem(i, info.szDisplayName, i);
}
}
*pResult = 0;
}
这个程序虽然简单,但是理解起来并不容易,需要我们在日常编程中慢慢去练习并掌握它。
编程其实并不难,让我们一起努力吧。
一步一个脚印,脚踏实地的学习下去吧。
- MFC中利用树形控件和列表控件来显示显示系统的资源列表
- 列表控件 树形控件显示设备信息
- MFC中CImageList(图形列表控件)和CTreeCtrl(树形列表控件)的简单用法
- MFC中CImageList(图形列表控件)和CTreeCtrl(树形列表控件)的简单用法
- mfc 列表控件和richedit控件一直显示新加入的行
- CListCtrl控件列表项和列表头图标的显示
- mfc里面 有没有显示图片的列表控件啊
- mfc里面 有没有显示图片的列表控件啊
- mfc里面 有没有显示图片的列表控件啊
- [VC/MFC]虚拟列表控件——显示上百万数据的列表控件
- [VC/MFC]虚拟列表控件——显示上百万数据的列表控件
- MFC 树形控件与列表控件
- VC/MFC 拖放树形控件与列表控件的项
- MFC中控件的显示和隐藏
- mfc 遍历ftp服务器文件并显示树形列表中
- MFC中ListCtrl列表控件的使用
- MFC中列表控件的使用
- OpenCV 利用MFC的Picture控件显示和处理图像
- 这样才是我
- 关于上拉刷新控件MJRefresh 上拉时当加载出来后仍会自动往上滑动的解决
- Android从入门到精通第4章:高级用户界面设计
- 【Codeforces】 489C Given Length and Sum of Digits
- 转载:Java常用的几种排序算法 。
- MFC中利用树形控件和列表控件来显示显示系统的资源列表
- mlock家族:锁定物理内存
- [FZU 1022] 三色二叉树/二叉树染色
- loadrunner11 安装时 无法将值写入注册表项 解决方法
- 当ListView存在于ScrollView或者ListView里面
- LTE物理层详解--- 基本介绍
- C语言的不完整类型和前置声明
- 研究生学位论文写作与答辩存在的几个问题
- sublime text 3 序列号