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;
}




这个程序虽然简单,但是理解起来并不容易,需要我们在日常编程中慢慢去练习并掌握它。


编程其实并不难,让我们一起努力吧。

一步一个脚印,脚踏实地的学习下去吧。

0 0
原创粉丝点击