MFC中利用树形控件和列表控件来显示显示系统的资源列表
2014-11-19 19:50
363 查看
在实际程序开发中,经常需要显示系统的资源列表。
下面我们的实现的是在树形控件显示层次目录信息,在列表控件中显示选中目录下面包含的文件
首先 来看一下实现的Demo图。
![](https://img-blog.csdn.net/20141119193443781?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvdTAxMTYxOTQyMg==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center)
首先,我们需要在初始化函数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;
}
这个程序虽然简单,但是理解起来并不容易,需要我们在日常编程中慢慢去练习并掌握它。
编程其实并不难,让我们一起努力吧。
一步一个脚印,脚踏实地的学习下去吧。
下面我们的实现的是在树形控件显示层次目录信息,在列表控件中显示选中目录下面包含的文件
首先 来看一下实现的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中CImageList(图形列表控件)和CTreeCtrl(树形列表控件)的简单用法
- OpenCV 利用MFC的Picture控件显示和处理图像
- MFC中CImageList(图形列表控件)、CTreeCtrl(树形列表控件)的简单用法
- MFC利用CImage类将图片显示到Picture控件上
- MFC中CImageList(图形列表控件)和CTreeCtrl(树形列表控件)的简单用法
- MFC中List Control控件的使用及实时显示系统时间的方法
- opencv学习笔记(二)vs2010+opencv2.3.1 mfc的实现---利用图片控件显示
- OpenCV学习笔记(9)利用MFC的Picture控件显示图像+播放视频和捕获摄像头画面
- [VC/MFC]虚拟列表控件——显示上百万数据的列表控件
- MFC中CImageList(图形列表控件)和CTreeCtrl(树形列表控件)的简单用法
- MFC获取系统的进程及列表控件使用
- VC/MFC 拖放树形控件与列表控件的项
- OpenCV学习 利用MFC的Picture控件显示图像+播放视频和捕获摄像头画面
- OpenCV学习笔记(9)利用MFC的Picture控件显示图像+播放视频和捕获摄像头画面
- 利用MFC的Picture控件显示和处理图像
- MFC程序,在改变系统DPI后,控件显示位置混乱的问题
- OpenCV学习笔记(9)利用MFC的Picture控件显示图像+播放视频和捕获摄像头画面
- OpenCV学习笔记(9)利用MFC的Picture控件显示图像+播放视频和捕获摄像头画面
- mfc Picture control显示图片,利用资源ID
- 列表控件 树形控件显示设备信息