MFC - 06 常用控件、文件搜索类
控件
对象和控件绑定
将控件窗口和类对象绑定有两大作用:
- 如果和数据类(如 CString)对象绑定,对象和控件可以进行数据交换。
- 如果和控件类(如 CButton)对象绑定,对象就可以代表整个控件。
控件与数据类对象绑定
- 重写父类成员虚函数 DoDataExchange
在函数内部通过一系列的 DDX_xxx 函数,实现控件和数据类型对象的数据交互 - 如果需要实现数据交互,调用 UpdateData 函数
UpdateData(TRUE):控件 -> 变量
UpdateData(FALSE):变量 -> 控件
控件与控件类对象绑定
- 控件类对象和控件绑定可实现对象代表整个控件
- 重写父类成员虚函数 DoDataExchange
在函数内部通过一系列的 DDX_xxx 函数,实现控件句柄和控件类型对象的绑定 - 控件类型对象,就代表这个控件
使用:
在对话框中添加编辑框
#include <afxwin.h>
#include "resource1.h"
class CMyDlg : public CDialog
{
DECLARE_MESSAGE_MAP()
public:
CString m_strEdit; // 数据类型对象
CEdit m_ctrlEdit; // 控件类对象
CMyDlg() : CDialog(IDD_DIALOG1) {}
afx_msg void OnOk();
afx_msg void OnCancel();
afx_msg void OnBtn1();
afx_msg void OnBtn2();
virtual void DoDataExchange(CDataExchange*);
};
BEGIN_MESSAGE_MAP(CMyDlg, CDialog)
// 使用 ON_COMMAND 也可以处理单击事件
/*
ON_COMMAND(IDOK, OnOk)
ON_COMMAND(IDCANCEL, OnCancel)
ON_COMMAND(IDC_BUTTON1, OnBtn1)
ON_COMMAND(IDC_BUTTON2, OnBtn2)
*/
// 处理控件消息
ON_BN_CLICKED(IDOK, OnOk)
ON_BN_CLICKED(IDCANCEL, OnCancel)
ON_BN_CLICKED(IDC_BUTTON1, OnBtn1)
ON_BN_CLICKED(IDC_BUTTON2, OnBtn2)
END_MESSAGE_MAP()
void CMyDlg::OnOk()
{
this->m_ctrlEdit.MoveWindow(0, 0, 200, 200); // 当接收到 IDOK 的消息时重绘控件
}
void CMyDlg::OnCancel()
{
this->DestroyWindow();
}
void CMyDlg::OnBtn1() // 控件->数据对象
{
UpdateData(TRUE);
AfxMessageBox(this->m_strEdit);
}
void CMyDlg::OnBtn2() // 数据对象->控件
{
this->m_strEdit = "请输入数据";
UpdateData(FALSE);
}
void CMyDlg::DoDataExchange(CDataExchange* pDX)
{
DDX_Text(pDX, IDC_EDIT1, this->m_strEdit); // 交换数据使用一系列 DDX_xxx 函数
DDX_Control(pDX, IDC_EDIT1, this->m_ctrlEdit); // 将控件和控件对象绑定
}
class CMyWinApp : public CWinApp
{
public:
virtual BOOL InitInstance();
};
BOOL CMyWinApp::InitInstance()
{
CMyDlg* pdlg = new CMyDlg;
this->m_pMainWnd = pdlg;
//pdlg->Create(IDD_DIALOG1);
//pdlg->ShowWindow(SW_SHOW);
//pdlg->UpdateWindow();
pdlg->DoModal();
return TRUE;
}
CMyWinApp theApp;
控件消息的处理
事件较多,如 单击、双击、拖动等
控件消息的处理:
- WM_COMMAND 消息
- LOWORD(wParam) 菜单项ID,控件ID
- HIWORD(wParam) 菜单项发出消息时为0,控件发出消息时为通知码
- lParam 均无用
- ON_COMMAND(IDOK, OnOk) 用于处理菜单项事件,发出的事件通知码为0
#define ON_COMMAND(id, memberFxn) \ { WM_COMMAND, CN_COMMAND, (WORD)id, (WORD)id, AfxSigCmd_v, static_cast<AFX_PMSG> (memberFxn) }, COMMAND消息 通知码为0 消息处理函数
- ON_BN_CLICKED(IDC_BUTON1, OnBtn1) 用于处理控件单击事件,根据事件不同发出不同通知码,和使用 ON_COMMAND() 相同
#define ON_BN_CLICKED(id, memberFxn) \ ON_CONTROL(BN_CLICKED, id, memberFxn) 单击事件通知码 #define ON_CONTROL(wNotifyCode, id, memberFxn) \ { WM_COMMAND, (WORD)wNotifyCode, (WORD)id, (WORD)id, AfxSigCmd_v, (static_cast< AFX_PMSG > (memberFxn)) }, COMMAND消息 通知码 消息处理函数
- ON_BN_DOUBLECLICKED(IDC_BUTON1, OnBtn1),不能使用 ON_COMMAND 处理
#define ON_BN_DOUBLECLICKED(id, memberFxn) \ ON_CONTROL(BN_DOUBLECLICKED, id, memberFxn) 双击事件通知码 #define ON_CONTROL(wNotifyCode, id, memberFxn) \ { WM_COMMAND, (WORD)wNotifyCode, (WORD)id, (WORD)id, AfxSigCmd_v, (static_cast< AFX_PMSG > (memberFxn)) },
双击事件要将 notify 更改为 True,否则会将双击视为两次单击。
关于控件类的处理:
- 控件与数据类型绑定(做数据交换)
- 控件与控件类对象绑定(对象代表控件)
- 控件的消息如何处理
01 下压式按钮
CButton 类:父类为CWnd,封装了关于下压式按钮控件的各种操作
当下压式按钮被单击时产生 WM_COMMAND 消息(通知码 BN_CLICKED)
添加按钮:
使用类向导添加按键对象:
添加消息处理函数:
class CMFCDlgDlg : public CDialog
{
DECLARE_MESSAGE_MAP()
public:
CButton m_btn;
afx_msg void OnClickedButton1();
void DoDataExchange(CDataExchange*);
};
BEGIN_MESSAGE_MAP(CMFCDlgDlg, CDialog)
ON_BN_CLICKED(IDC_BUTTON1, &CMFCDlgDlg::OnClickedButton1)
END_MESSAGE_MAP()
void CMFCDlgDlg::DoDataExchange(CDataExchange* pDX)
{
CDialog::DoDataExchange(pDX);
DDX_Control(pDX, IDC_BUTTON1, m_btn);
}
void CMFCDlgDlg::OnClickedButton1()
{
// TODO: 在此添加控件通知处理程序代码
AfxMessageBox("点击了按钮");
}
02 编辑框
CEdit 类:
获取编辑框文本内容,设置编辑框文本内容。文本内容变化时产生 WM_COMMAND
消息(通知码 EN_CHANGE),使用 ON_EN_CHANGE
宏注册函数。
查看代码
#include <afxwin.h>
#include "resource.h"
class CMyDlg : public CDialog
{
DECLARE_MESSAGE_MAP()
public:
CMyDlg() : CDialog(IDD_DIALOG1) {};
CEdit m_edit; // 与编辑框绑定的类
CString m_str; // 与编辑框绑定的数据
CButton m_btn1;
virtual BOOL OnInitDialog();
virtual void DoDataExchange(CDataExchange* pDX);
afx_msg void OnClick1();
afx_msg void OnChangeEdit1();
};
BEGIN_MESSAGE_MAP(CMyDlg, CDialog)
ON_BN_CLICKED(IDC_BUTTON1, OnClick1)
ON_EN_CHANGE(IDC_EDIT1, OnChangeEdit1) // 处理字符串变化消息
END_MESSAGE_MAP()
BOOL CMyDlg::OnInitDialog()
{
m_str = "初始化字符串";
UpdateData(FALSE); // 将数据内容同步到控件
return TRUE;
}
void CMyDlg::DoDataExchange(CDataExchange* pDX)
{
DDX_Control(pDX, IDC_EDIT1, m_edit);
DDX_Text(pDX, IDC_EDIT1, m_str);
DDX_Control(pDX, IDC_BUTTON1, m_btn1);
}
void CMyDlg::OnClick1()
{
CString str;
m_edit.GetWindowText(str);
AfxMessageBox(str);
m_edit.SetWindowText("");
}
void CMyDlg::OnChangeEdit1() // 处理编辑框变化消息,将编辑框内容同步到按钮
{
char strEdit[256];
m_edit.GetWindowTextA(strEdit, 256);
m_btn1.SetWindowText(strEdit);
}
class CMyWinApp : public CWinApp
{
public:
virtual BOOL InitInstance();
};
BOOL CMyWinApp::InitInstance()
{
CMyDlg myDlg;
this->m_pMainWnd = &myDlg;
myDlg.DoModal();
return FALSE;
}
CMyWinApp theApp;
03 复选框按钮
CButton 类封装了复选框按钮控件相关操作,
- CButton::GetCheck 获取复选框状态
- CButton::SetCheck 设置复选框状态
- 被点击时和下按式按钮一样会发生 WM_COMMAND 消息 BN_CLICKED
查看代码
#include <afxwin.h>
#include "resource.h"
class CMyDlg : public CDialog
{
DECLARE_MESSAGE_MAP()
public:
CMyDlg() : CDialog(IDD_DIALOG1) {};
CButton m_check;
virtual BOOL OnInitDialog();
virtual void DoDataExchange(CDataExchange* pDX);
afx_msg void OnClickedButton();
};
BEGIN_MESSAGE_MAP(CMyDlg, CDialog)
ON_BN_CLICKED(IDC_BUTTON2, OnClickedButton)
END_MESSAGE_MAP()
BOOL CMyDlg::OnInitDialog()
{
m_check.SetCheck(TRUE); // 将初始状态设为选中
return TRUE;
}
void CMyDlg::DoDataExchange(CDataExchange* pDX)
{
DDX_Control(pDX, IDC_CHECK1, m_check);
}
void CMyDlg::OnClickedButton()
{
m_check.SetCheck(~m_check.GetCheck()); // 改变复选框的状态
}
class CMyWinApp : public CWinApp
{
public:
virtual BOOL InitInstance();
};
BOOL CMyWinApp::InitInstance()
{
CMyDlg myDlg;
this->m_pMainWnd = &myDlg;
myDlg.DoModal();
return FALSE;
}
CMyWinApp theApp;
04 单选框按钮
CButton 类封装了单选框操作,单选框一般成组操作。
- CButton::GetCheck 获取复选框状态
- CButton::SetCheck 设置复选框状态
- 被点击时和下按式按钮一样会发生 WM_COMMAND 消息 BN_CLICKED
单选框成组使用,将”组“改为TRUE后才能出现在类向导
查看代码
#include <afxwin.h>
#include "resource.h"
class CMyDlg : public CDialog
{
DECLARE_MESSAGE_MAP()
public:
CMyDlg() : CDialog(IDD_DIALOG1) {};
CButton m_male;
CButton m_female;
virtual BOOL OnInitDialog();
virtual void DoDataExchange(CDataExchange* pDX);
afx_msg void OnClickedMale();
afx_msg void OnClickedFemale();
};
BEGIN_MESSAGE_MAP(CMyDlg, CDialog)
ON_BN_CLICKED(IDC_MALE, OnClickedMale)
ON_BN_CLICKED(IDC_FEMALE, OnClickedFemale)
END_MESSAGE_MAP()
void CMyDlg::DoDataExchange(CDataExchange* pDX)
{
DDX_Control(pDX, IDC_MALE, m_male);
DDX_Control(pDX, IDC_FEMALE, m_female);
}
void CMyDlg::OnClickedMale()
{
// 实现互斥
m_male.SetCheck(TRUE);
m_female.SetCheck(FALSE);
}
void CMyDlg::OnClickedFemale()
{
// 实现互斥
m_male.SetCheck(FALSE);
m_female.SetCheck(TRUE);
}
class CMyWinApp : public CWinApp
{
public:
virtual BOOL InitInstance();
};
BOOL CMyWinApp::InitInstance()
{
CMyDlg myDlg;
this->m_pMainWnd = &myDlg;
myDlg.DoModal();
return FALSE;
}
CMyWinApp theApp;
05 分组框按钮
用于控件的分组显示,提高界面友好性。修改id后也可以与CButton绑定。
06 文本静态框
在界面显示文字,增加用户友好性。
与 CStatic
类绑定,用于运行时使用 CWnd::SetWindowText
更改字符。默认ID为 ID_STATIC
,更改id后可以绑定类对象。
07 图像静态框
使用 CStatic
类绑定,使用 CStatic::SetIcon
CStatic::SetBitmap
函数设置。
默认类型为 Frame 无法显示图片,通常使用 Icon Bitmap 类型。
输入bitmap资源id,在预览状态下只会显示白框。
默认ID为 IDC_STATIC ,更改id后才能在类向导中看到。
查看代码
class CMyDlg : public CDialog
{
DECLARE_MESSAGE_MAP()
public:
CMyDlg() : CDialog(IDD_DIALOG1) {};
CButton m_btn1;
CStatic m_pic;
virtual BOOL OnInitDialog();
virtual void DoDataExchange(CDataExchange* pDX);
afx_msg void OnClickedBtn1();
};
BEGIN_MESSAGE_MAP(CMyDlg, CDialog)
ON_BN_CLICKED(IDC_BUTTON1, OnClickedBtn1)
END_MESSAGE_MAP()
BOOL CMyDlg::OnInitDialog()
{
return TRUE;
}
void CMyDlg::DoDataExchange(CDataExchange* pDX)
{
DDX_Control(pDX, IDC_BUTTON1, m_btn1);
DDX_Control(pDX, IDC_PIC, m_pic);
}
void CMyDlg::OnClickedBtn1()
{
//AfxMessageBox("xxx");
m_pic.SetBitmap(::LoadBitmap(AfxGetInstanceHandle(), MAKEINTRESOURCE(IDB_BITMAP2)));
}
08 组合框
分类: 简单式组合框(支持键盘编辑) / 下拉式组合框(支持键盘编辑) / 下拉列表式组合框(不支持键盘编辑)
注意:点击后要在对话框内拖拽一下,拖拽的面积就是下拉后的面积。默认按字符排序,设置为False后按添加顺序排序。
相关类:CComboBox,父类为CWnd类,封装了关于组合框控件的各种操作
CComboBox::AddString
添加选项CComboBox::DeleteString
删除指定选项CComboBox::ResetContent
删除所有选项CComboBox::GetCurSel
获取选择项索引,索引从0开始CComboBox::SetCurSel
设置选择项,在启动时设置默认选项CComboBox::GetLBText
获取选择项文本内容CComboBox::SetItemData
设置选项附加数据CComboBox::GetItemData
获取选项附加数据
消息:
- 当选择项发生变化时
WM_COMMAND
消息,通知码为CBN_SELCHANGE
- 当文本内容发生变化时,就是编辑框中按按键时
WM_COMMAND
消息,通知码为CBN_EDITCHANGE
查看代码
#include <afxwin.h>
#include "resource.h"
class CMyDlg : public CDialog
{
DECLARE_MESSAGE_MAP()
public:
CMyDlg() : CDialog(IDD_DIALOG1) {};
CButton m_btn1;
CComboBox m_combo;
virtual BOOL OnInitDialog();
virtual void DoDataExchange(CDataExchange* pDX);
afx_msg void OnClickedBtn1();
};
BEGIN_MESSAGE_MAP(CMyDlg, CDialog)
ON_BN_CLICKED(IDC_BUTTON1, OnClickedBtn1)
END_MESSAGE_MAP()
BOOL CMyDlg::OnInitDialog()
{
m_combo.AddString("111");
m_combo.AddString("222");
m_combo.AddString("333");
return TRUE;
}
void CMyDlg::DoDataExchange(CDataExchange* pDX)
{
DDX_Control(pDX, IDC_BUTTON1, m_btn1);
DDX_Control(pDX, IDC_COMBO2, m_combo);
}
void CMyDlg::OnClickedBtn1()
{
int i = m_combo.GetCurSel();
char str[15];
sprintf_s(str, "%d", i);
AfxMessageBox(str);
m_combo.DeleteString(i);
}
class CMyWinApp : public CWinApp
{
public:
virtual BOOL InitInstance();
};
BOOL CMyWinApp::InitInstance()
{
CMyDlg myDlg;
this->m_pMainWnd = &myDlg;
myDlg.DoModal();
return FALSE;
}
CMyWinApp theApp;
09 列表框
和组合框类似,使用 CListBox 类
CListBox::AddString
添加选项CListBox::DeleteString
删除选项CListBox::GetCurSel
获取选择项CListBox::SetCurSel
设置选择项CListBox::GetItemText
获取选项文本内容CListBox::SetItemData
设置选项附加数据CListBox::GetItemData
获取选项附加数据
10 滑块控件
CSliderCtrl 类
CSliderCtrl::SetRange(iStart, iEnd)
设置范围,在初始化函数中设置CSliderCtrl::SetPos
设置位置CSliderCtrl::GetPos
获取位置
消息:
当滑块位置改变后,发出 WM_COMMAND
消息,通知码 NM_CUSTOMDRAW
添加绑定:
在类内声明变量 CSliderCtrl m_slider;
在 DoDataExchange
方法内绑定:
void CMFCDlgDlg::DoDataExchange(CDataExchange* pDX)
{
DDX_Control(pDX, IDC_BUTTON1, m_btn);
DDX_Control(pDX, IDC_SLIDER1, m_slider);
}
11 进度条控件
CProgressCtrl 类
CProgressCtrl::SetRange
CProgressCtrl::SetPos
CProgressCtrl::GetPos
12 列表控件
例如文件管理器的文件列表
CListCtrl 类
风格:
- 图标
LVS_ICON
- 小图标
LVS_SMALLICON
- 列表
LVS_LIST
- 报表
LVS_REPORT
函数:
CWnd::ModifyStyle
修改风格函数CList::InsertItem
添加选项CList::DeleteItem
/DeleteAllItem
删除选项CList::InsertColumn
添加列,即报表模式的非名称列CList::SetItemText
设置文本内容,用于报表模式的非名称列CList::SetImageList
设置图像CList::SetItemData
设置附加数据,不会进行显示CList::GetItemData
获取附加数据
消息:
当列表控件被双击时发出 WM_COMMAND
消息,通知码 NM_DBLCLK
查看代码
#include <afxwin.h>
#include <afxext.h>
#include <afxcmn.h>
#include "resource.h"
class CMyDlg : public CDialog
{
DECLARE_MESSAGE_MAP()
public:
CMyDlg() : CDialog(IDD_DIALOG1) {};
CButton m_btn1;
CListCtrl m_list;
virtual BOOL OnInitDialog();
virtual void DoDataExchange(CDataExchange* pDX);
CListCtrl m_list;
afx_msg void OnDblclkList1(NMHDR* pNMHDR, LRESULT* pResult);
afx_msg void OnClickedBtn1();
};
BEGIN_MESSAGE_MAP(CMyDlg, CDialog)
ON_BN_CLICKED(IDC_BUTTON1, OnClickedBtn1)
ON_NOTIFY(NM_DBLCLK, IDC_LIST1, &CMFCDlgDlg::OnDblclkList1)
END_MESSAGE_MAP()
BOOL CMyDlg::OnInitDialog()
{
// 添加列用于报表模式,如果没有列则不能在报表模式下显示
m_list.InsertColumn(0, "名称", LVCFMT_LEFT);
m_list.InsertColumn(1, "修改日期", LVCFMT_LEFT);
m_list.InsertColumn(2, "类型", LVCFMT_LEFT);
m_list.InsertColumn(3, "大小", LVCFMT_LEFT);
m_list.SetExtendedStyle(LVS_EX_GRIDLINES); // 在播表模式中添加经纬线,视觉友好
CImageList* pImgLst = new CImageList;
// 创建的BMP资源是48*24的,将图片按照24的宽度裁剪成两个图片,每次增加一个节点,然后去底色
pImgLst->Create(IDB_BITMAP1, 24, 1, RGB(255, 255, 255));
// 将图像列表应用在列表控件的图标风格中
m_list.SetImageList(pImgLst, LVSIL_NORMAL);
// 将图像列表应用在列表控件的另外三种风格中
m_list.SetImageList(pImgLst, LVSIL_SMALL);
// 添加内容
m_list.InsertItem(0, "item0", 0); // 三个参数为:索引;字符信息;使用图片列表的第几个节点
m_list.SetItemText(0, 1, "2022/1/1"); // 添加非名称信息
m_list.SetItemText(0, 2, "file");
m_list.SetItemText(0, 3, "3M");
// 添加第二行内容
m_list.InsertItem(1, "item1", 1); // 三个参数为:索引;字符信息;使用图片列表的第几个节点
return TRUE;
}
void CMyDlg::DoDataExchange(CDataExchange* pDX)
{
DDX_Control(pDX, IDC_BUTTON1, m_btn1);
}
void CMyDlg::OnClickedBtn1()
{
// 改变风格
m_list.ModifyStyle(LVS_ICON | LVS_SMALLICON | LVS_LIST, LVS_REPORT);
}
void CMFCDlgDlg::OnDblclkList1(NMHDR* pNMHDR, LRESULT* pResult)
{
LPNMITEMACTIVATE pNMItemActivate = reinterpret_cast<LPNMITEMACTIVATE>(pNMHDR);
// TODO: 在此添加控件通知处理程序代码
*pResult = 0;
int item = pNMItemActivate->iItem; // 这里保存了点击的选项
DWORD nData = m_list.GetItemData(item); // 注意不要传递局部遍历,这段代码中没有传入数据
// nData 是指向数据的指针
}
class CMyWinApp : public CWinApp
{
public:
virtual BOOL InitInstance();
};
BOOL CMyWinApp::InitInstance()
{
CMyDlg myDlg;
this->m_pMainWnd = &myDlg;
myDlg.DoModal();
return FALSE;
}
CMyWinApp theApp;
13 树控件
CTreeCtrl 类
常见操作:
CTreeCtrl::InsertItem
添加选项CTreeCtrl::DeleteItem
/DeleteAllItems
删除选项CTreeCtrl::GetSelectedItem
获取选项CTreeCtrl::GetItemText
获取选项文本内容CTreeCtrl::SetItemHeight
设置选项高度CTreeCtrl::SetImageList
设置图像,与操作列表控件的方法类似
查看代码
#include <afxwin.h>
#include <afxext.h>
#include <afxcmn.h>
#include "resource.h"
class CMyDlg : public CDialog
{
DECLARE_MESSAGE_MAP()
public:
CMyDlg() : CDialog(IDD_DIALOG1) {};
CButton m_btn1;
CTreeCtrl m_tree;
virtual BOOL OnInitDialog();
virtual void DoDataExchange(CDataExchange* pDX);
afx_msg void OnClickedBtn1();
};
BEGIN_MESSAGE_MAP(CMyDlg, CDialog)
ON_BN_CLICKED(IDC_BUTTON1, OnClickedBtn1)
END_MESSAGE_MAP()
BOOL CMyDlg::OnInitDialog()
{
// 创建图片列表
CImageList* pImgLst = new CImageList;
// 加载图片资源,三个参数:图片资源ID;用于切分的宽度;每次新增节点个数;去除的背景色
pImgLst->Create(IDB_BITMAP1, 24, 1, RGB(255, 255, 255));
// 绑定图片列表对象
m_tree.SetImageList(pImgLst, LVSIL_NORMAL);
// 添加元素,三个参数:显示字符;未选中时图标;选中时图标;父节点
HTREEITEM nRoot = m_tree.InsertItem("公司A", 0, 1, NULL);
m_tree.InsertItem("部门1", 0, 1, nRoot);
m_tree.InsertItem("部门2", 0, 1, nRoot);
m_tree.InsertItem("部门3", 0, 1, nRoot);
return TRUE;
}
void CMyDlg::DoDataExchange(CDataExchange* pDX)
{
DDX_Control(pDX, IDC_BUTTON1, m_btn1);
DDX_Control(pDX, IDC_TREE1, m_tree);
}
void CMyDlg::OnClickedBtn1()
{
// 获得选择节点
HTREEITEM hItem = m_tree.GetSelectedItem();
// 删除指定节点
m_tree.DeleteItem(hItem);
}
class CMyWinApp : public CWinApp
{
public:
virtual BOOL InitInstance();
};
BOOL CMyWinApp::InitInstance()
{
CMyDlg myDlg;
this->m_pMainWnd = &myDlg;
myDlg.DoModal();
return FALSE;
}
CMyWinApp theApp;
文件搜索类
MFC封装的类,实现文件的搜索、文件遍历。
CFileFind 类,封装了关于文件遍历的各种操作
CFileFind::FindFile
开启查找,成功返回TRUE,失败返回FALSE,不查找任务文件CFileFind::FindNextFile
找到当前文件,返回下一个文件是否存在CFileFind::GetFileName
CFileFind::GetFilePath
调用一系列 GetXXX 函数获取文件信息CFileFind::IsDirectory
CFileFind::IsDots
判断文件属性,IsDots 是判断文件是否是代表当前目录和上级目录的.
或..
CFileFind::Close
关闭查找
void Find(CString path) {
CString strPath = path;
strPath += "/*.*"; // 查找指定目录下所有文件
CFileFind find;
BOOL goFind = find.FindFile(strPath);
while (goFind)
{
// 找到文件并存到对象内部私有遍历,返回值为是否存在下一个文件
goFind = find.FindNextFile();
CString filename = find.GetFileName();
CString filepath = find.GetFilePath();
if (find.IsDirectory() && !find.IsDots())
{
pirntf("[%s]\n", filename);
Find(filepath);
}
else
{
printf("%s\n", filename);
}
}
find.Close();
}