MFC - 06 常用控件、文件搜索类

控件

对象和控件绑定

将控件窗口和类对象绑定有两大作用:

  1. 如果和数据类(如 CString)对象绑定,对象和控件可以进行数据交换。
  2. 如果和控件类(如 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,否则会将双击视为两次单击。

关于控件类的处理:

  1. 控件与数据类型绑定(做数据交换)
  2. 控件与控件类对象绑定(对象代表控件)
  3. 控件的消息如何处理

 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 类

风格:

  1. 图标 LVS_ICON
  2. 小图标 LVS_SMALLICON
  3. 列表 LVS_LIST
  4. 报表 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();
}

 

posted @ 2022-08-07 22:18  某某人8265  阅读(273)  评论(0编辑  收藏  举报