一、控件的使用
1、对象和对象的绑定
(1)作用
如果控件和数据类(如:CString)的对象绑定,对象可以和控件进行数据交换
如果控件和控件类(如:CButton)对象绑定,对象可以代表控件
2、控件与数据类型对象绑定的使用
(1)数据类型对象和控件可以实现数据交互
(2)重写父类的成员虚函数DoDataExchange
在函数内部通过一系列的DDC_xxx函数,实现控件和数据类型对象的数据交互
(3)如果需要实现数据交互,调用UpdateData函数
UpdateData(TRUE):控件-》变量
UpdateData(FALSE):变量-》控件
2、创建解决方案,实现数据类型和控件绑定
(1)拷贝模式对话框项目(MFCModelDlg)
(2)在对话框资源中添加一个Edit Control控件和两个Button

(3) 编写程序
- #include
- #include "resource.h"
- class CMyDlg : public CDialog{
- public:
- DECLARE_MESSAGE_MAP( )
- enum{IDD=IDD_DIALOG1};
- public:
- afx_msg void OnOK();
- afx_msg void OnButton1();
- afx_msg void OnButton2();
- CMyDlg() : CDialog(IDD){
- }
- virtual void DoDataExchange(CDataExchange* pDX);
- public:
- CString m_strEdit;
- };
- BEGIN_MESSAGE_MAP( CMyDlg, CDialog )
- ON_COMMAND( IDOK, OnOK )
- ON_COMMAND(IDC_BUTTON1, OnButton1)
- ON_COMMAND(IDC_BUTTON2, OnButton2)
- END_MESSAGE_MAP( )
- void CMyDlg::OnOK( ){
- CDialog::OnOK();
- }
- void CMyDlg::DoDataExchange(CDataExchange* pDX)
- {
- DDX_Text(pDX, IDC_EDIT1, m_strEdit);
- }
- void CMyDlg::OnButton1() //控件-》变量
- {
- UpdateData(TRUE);
- AfxMessageBox(m_strEdit);
- }
- void CMyDlg::OnButton2() //变量-》数据
- {
- m_strEdit = "hello word";
- UpdateData(FALSE);
- }
- class CMyWinApp : public CWinApp{
- public:
- virtual BOOL InitInstance( );
- };
- BOOL CMyWinApp::InitInstance( ){
- CMyDlg dlg;//栈空间
- m_pMainWnd = &dlg;
- int nRet = dlg.DoModal( );
- return FALSE;//不再执行MFC库中安排的Run函数
- }
- CMyWinApp theApp;


3、控件与控件类型绑定的使用
(1)控件类型对象和控件可实现对象代表整个控件
(2)重写父类的成员虚函数DoDataExchange
在函数内部通过一系列的DDC_xxx函数,实现控件句柄和控件类型对象绑定
(3)控件类型对象,代表这个控件
4、实现控件类型对象与控件绑定
(1)创建控件类型对象,绑定
- #include
- #include "resource.h"
- class CMyDlg : public CDialog{
- public:
- DECLARE_MESSAGE_MAP( )
- enum{IDD=IDD_DIALOG1};
- public:
- afx_msg void OnOK();
- afx_msg void OnButton1();
- afx_msg void OnButton2();
- CMyDlg() : CDialog(IDD){
- }
- virtual void DoDataExchange(CDataExchange* pDX);
- public:
- CString m_strEdit;
- CEdit m_ctrEdit;
- };
- BEGIN_MESSAGE_MAP( CMyDlg, CDialog )
- ON_COMMAND( IDOK, OnOK )
- ON_COMMAND(IDC_BUTTON1, OnButton1)
- ON_COMMAND(IDC_BUTTON2, OnButton2)
- END_MESSAGE_MAP( )
- void CMyDlg::OnOK( ){
- //CDialog::OnOK();
- m_ctrEdit.MoveWindow(0, 0, 200, 200);
- }
- void CMyDlg::DoDataExchange(CDataExchange* pDX)
- {
- DDX_Text(pDX, IDC_EDIT1, m_strEdit);
- DDX_Control(pDX, IDC_EDIT1, m_ctrEdit);
- }
- void CMyDlg::OnButton1() //控件-》变量
- {
- UpdateData(TRUE);
- AfxMessageBox(m_strEdit);
- }
- void CMyDlg::OnButton2() //变量-》数据
- {
- m_strEdit = "hello word";
- UpdateData(FALSE);
- }
- class CMyWinApp : public CWinApp{
- public:
- virtual BOOL InitInstance( );
- };
- BOOL CMyWinApp::InitInstance( ){
- CMyDlg dlg;//栈空间
- m_pMainWnd = &dlg;
- int nRet = dlg.DoModal( );
- return FALSE;//不再执行MFC库中安排的Run函数
- }
- CMyWinApp theApp;

操作控件类型对象,会直接将改变传递到与之绑定的控件
5、控件消息的处理
(1)空间消息的处理
WM_COMMAND消息
LOWORD(wParam) 低字 菜单项ID,控件ID
HIWAORD(wParam) 高字 菜单项,为0
控件,通知码(控件发生的事情,单、双击等)
lParam 均无用
- //处理消息,处理通知码为 CN_COMMAND=0,BN_CLICKED=0,所以会处理单击
- ON_COMMAND(IDC_BUTTON1, OnButton1)
-
- //处理单击消息
- ON_BN_CLICKED(IDC_BUTTON1, OnButton1)
-
- //处理双击消息
- ON_BN_DOUBLECLICKED(IDC_BUTTON1, OnButton1)
- ON_BN_CLICKED( IDOK, OnOK )
- ON_BN_CLICKED(IDC_BUTTON1, OnButton1)
- ON_BN_CLICKED(IDC_BUTTON2, OnButton2)
(2)设置按钮属性(允许双击)

(3)编写程序
- #include
- #include "resource.h"
- class CMyDlg : public CDialog{
- public:
- DECLARE_MESSAGE_MAP( )
- enum{IDD=IDD_DIALOG1};
- public:
- afx_msg void OnOK();
- afx_msg void OnButton1();
- afx_msg void OnButton2();
- afx_msg void OnDbButton2();
- CMyDlg() : CDialog(IDD){
- }
- virtual void DoDataExchange(CDataExchange* pDX);
- public:
- CString m_strEdit;
- CEdit m_ctrEdit;
- };
- BEGIN_MESSAGE_MAP( CMyDlg, CDialog )
- ON_BN_CLICKED( IDOK, OnOK )
- ON_BN_CLICKED(IDC_BUTTON1, OnButton1)
- ON_BN_CLICKED(IDC_BUTTON2, OnButton2)
- ON_BN_DOUBLECLICKED(IDC_BUTTON2, OnDbButton2)
- END_MESSAGE_MAP( )
- void CMyDlg::OnOK( ){
- //CDialog::OnOK();
- m_ctrEdit.MoveWindow(0, 0, 200, 200);
- }
- void CMyDlg::DoDataExchange(CDataExchange* pDX)
- {
- DDX_Text(pDX, IDC_EDIT1, m_strEdit);
- DDX_Control(pDX, IDC_EDIT1, m_ctrEdit);
- }
- void CMyDlg::OnButton1() //控件-》变量
- {
- UpdateData(TRUE);
- AfxMessageBox(m_strEdit);
- }
- void CMyDlg::OnButton2() //变量-》数据
- {
- m_strEdit = "hello word";
- UpdateData(FALSE);
- }
- void CMyDlg::OnDbButton2()
- {
- m_strEdit = "你好";
- UpdateData(FALSE);
- }
- class CMyWinApp : public CWinApp{
- public:
- virtual BOOL InitInstance( );
- };
- BOOL CMyWinApp::InitInstance( ){
- CMyDlg dlg;//栈空间
- m_pMainWnd = &dlg;
- int nRet = dlg.DoModal( );
- return FALSE;//不再执行MFC库中安排的Run函数
- }
- CMyWinApp theApp;

二、基本控件
1、创建对话框项目
(1)使用向导创建对话框项目(MFCDlgWizard)
2、控件使用
(1)控件与数据类型对象绑定(做数据交换)
(2)控件与控件类型对象绑定(对象代表控件,通过操作控件类型对象控制控件)
(3)处理控件消息
三、下压式按钮
1、使用相关
(1)相关类
CButton类, 父类为CWnd,封装了关于下压式按钮控件的各种操作
(2)消息
当下压式按钮被单击
WM_COMMAND消息(通知码BN_CLICKED)
2、下压式按钮与控件类对象绑定
(1)添加按钮(从工具箱中拖拽,Button控件)

(2)右键属性,Caption为按钮显示名称
(3)使用类向导添加按钮绑定变量,双击IDC_BUTTON1


(4)在初始化函数(CMFCDlgWizardDlg::OnInitDialog())中通过按钮绑定控件类对象,操作控件
- BOOL CMFCDlgWizardDlg::OnInitDialog()
- {
- CDialogEx::OnInitDialog();
-
- // 设置此对话框的图标。当应用程序主窗口不是对话框时,框架将自动
- // 执行此操作
- SetIcon(m_hIcon, TRUE); // 设置大图标
- SetIcon(m_hIcon, FALSE); // 设置小图标
-
- ShowWindow(SW_MINIMIZE);
-
- // TODO: 在此添加额外的初始化代码
- m_btn.MoveWindow(0,0,100,100);
- m_btn.SetWindowText("btn");
-
- return TRUE; // 除非将焦点设置到控件,否则返回 TRUE
- }

3、添加按钮消息处理函数
(1)使用类向导添加消息处理函数


(2)在消息处理函数中添加按钮被点击之后的工作
四、编辑框
1、编辑框使用
(1)相关类
CEdit类:父类为CWnd,封装了关于编辑框控件的各种操作
(2)常见操作
获得编辑框文本内容
设置编辑框文本内容
(3)消息
当前编辑框文本内容发生变化
WM_COMMAND消息(通知码EN_CHANGE)
2、编辑框与控件类对象绑定
(1)添加编辑框(从工具箱拖拽 Edit Control),ID为IDC_EDIT1
(2)使用类向导添加绑定的控件类对象

(3)在按钮消息处理函数添加编辑框内容获取程序,当按钮被点击时获取编辑框内容
- void CMFCDlgWizardDlg::OnClickedButton1()
- {
- // TODO: 在此添加控件通知处理程序代码
- //AfxMessageBox("按钮被点击");
- CString strEdit;
- m_edit.GetWindowText(strEdit);
- AfxMessageBox(strEdit);
- }

(4)在初始化函数中设置编辑框内容
- BOOL CMFCDlgWizardDlg::OnInitDialog()
- {
- CDialogEx::OnInitDialog();
-
- // 设置此对话框的图标。当应用程序主窗口不是对话框时,框架将自动
- // 执行此操作
- SetIcon(m_hIcon, TRUE); // 设置大图标
- SetIcon(m_hIcon, FALSE); // 设置小图标
-
- ShowWindow(SW_MINIMIZE);
-
- // TODO: 在此添加额外的初始化代码
- m_btn.MoveWindow(0,0,100,100);
- m_btn.SetWindowText("btn");
-
- m_edit.SetWindowText("你好");
-
- return TRUE; // 除非将焦点设置到控件,否则返回 TRUE
- }

(5)使用类向导给编辑框绑定数据类对象



(6)通过数据类对象交互数据
- BOOL CMFCDlgWizardDlg::OnInitDialog()
- {
- CDialogEx::OnInitDialog();
-
- // 设置此对话框的图标。当应用程序主窗口不是对话框时,框架将自动
- // 执行此操作
- SetIcon(m_hIcon, TRUE); // 设置大图标
- SetIcon(m_hIcon, FALSE); // 设置小图标
-
- ShowWindow(SW_MINIMIZE);
-
- // TODO: 在此添加额外的初始化代码
- m_btn.MoveWindow(0,0,100,100);
- m_btn.SetWindowText("btn");
-
- //m_edit.SetWindowText("你好");
- m_strEdit = "你好";
- UpdateData(FALSE);
-
- return TRUE; // 除非将焦点设置到控件,否则返回 TRUE
- }
3、编辑框消息处理函数(编辑框内容修改)
(1)使用类向导添加编辑框消息处理函数

(2)在消息处理函数编修内容;当编辑框内容发生修改时,会将按钮名称设置为编辑框内容
- void CMFCDlgWizardDlg::OnChangeEdit1()
- {
- CString strEdit;
- m_edit.GetWindowText(strEdit);
- m_btn.SetWindowText(strEdit);
- }
五、复选框按钮
1、复选框使用
(1)相关类
CButton类,父类CWnd,封装了允许复选框按钮控件的各种操作
(2)常见操作
获取复选框状态
CButton::GetCheck
设置复选框状态
CButton::SetCheck
(3)消息
当被选中
WM_COMMAND消息(通知码BN_CLICKED)
2、绑定控件类对象
(1)使用类向导创建绑定对象

(2)在初始化函数设置复选框状态
- BOOL CMFCCtrl2Dlg::OnInitDialog()
- {
- CDialogEx::OnInitDialog();
-
- // 设置此对话框的图标。当应用程序主窗口不是对话框时,框架将自动
- // 执行此操作
- SetIcon(m_hIcon, TRUE); // 设置大图标
- SetIcon(m_hIcon, FALSE); // 设置小图标
-
- ShowWindow(SW_MINIMIZE);
-
- // TODO: 在此添加额外的初始化代码
- m_check1.SetCheck(TRUE);
-
- return TRUE; // 除非将焦点设置到控件,否则返回 TRUE
- }

3、添加复选框消息处理函数

- void CMFCCtrl2Dlg::OnClickedCheck1()
- {
- // TODO: 在此添加控件通知处理程序代码
- bool status = m_check1.GetCheck();
-
- if (status)
- {
- AfxMessageBox("TRUE");
- }
- else
- {
- AfxMessageBox("FALSE");
- }
-
- }
4、复选框属性, 将Push Like切换为True,复选框变为点击转换的按钮

六、 单选框按钮
1、单选框使用
(1)相关类
CButton类,父类为CWnd,封装了有关单选框按控件的操作
(2)常见操作
获取复选框状态
CButton::GetCheck
设置复选框状态
CButton::SetCheck
(3)消息
当被选中
WM_COMMAND消息(通知码BN_CLICKED)
2、添加单选框绑定控件类对象
(1)添加两个单选框(从工具箱拖拽 Radio Button)
(2)修改复选框属性(Group:True)单选框成组使用,否则类向导没有控件ID

(3)绑定控件类对象

3、添加单选框消息处理函数
(1)添加消息处理函数

(2)在消息处理函数设置单选框互斥性
- void CMFCCtrl2Dlg::OnClickedRadio1()
- {
- // TODO: 在此添加控件通知处理程序代码
- m_r1.SetCheck(TRUE);
- m_r2.SetCheck(FALSE);
- }
-
- void CMFCCtrl2Dlg::OnClickedRadio2()
- {
- // TODO: 在此添加控件通知处理程序代码
- m_r1.SetCheck(FALSE);
- m_r2.SetCheck(TRUE);
- }
七、分组框按钮
控件的分组显示
1、添加分组框
(1)添加分组框(从工具箱拖拽 Group Box)

八、文本静态框
文本提示
1、文本静态框使用
(1)常见使用
常用于显示字符串,提高界面友好性
CWnd::SetWindowText
(2)绑定对象
CStatic
2、绑定控件类对象
(1)添加文本静态框(从工具箱拖拽 Static Text)
(2)设置控件属性

(3)使用类向导绑定

(4)借用单选框设置静态文本框内容
- void CMFCCtrl2Dlg::OnClickedRadio1()
- {
- // TODO: 在此添加控件通知处理程序代码
- m_r1.SetCheck(TRUE);
- m_r2.SetCheck(FALSE);
- m_st.SetWindowText("静态文本框1==");
- }
-
-
- void CMFCCtrl2Dlg::OnClickedRadio2()
- {
- // TODO: 在此添加控件通知处理程序代码
- m_r1.SetCheck(FALSE);
- m_r2.SetCheck(TRUE);
- m_st.SetWindowText("静态文本框2==");
- }
九、图像静态框
1、使用
(1)常见操作
常用于 显示图像
CStatic::SetIcon / CStatic::SetBitmap
2、图像静态框绑定控件类对象
(1)添加图像静态框(从工具箱拖拽 Picture Control)
(2)设置控件属性

(3)添加位图(Bitmap)资源

(4)选择图片

(5)修改控件ID

(6)使用类向导添加控件对象

(7)借用单选框设置图像显示
- void CMFCCtrl2Dlg::OnClickedRadio1()
- {
- // TODO: 在此添加控件通知处理程序代码
- m_r1.SetCheck(TRUE);
- m_r2.SetCheck(FALSE);
- m_st.SetWindowText("静态文本框1==");
- m_ps.SetBitmap(::LoadBitmap(AfxGetInstanceHandle(), MAKEINTRESOURCE(IDB_BITMAP1)));
- }
-
-
- void CMFCCtrl2Dlg::OnClickedRadio2()
- {
- // TODO: 在此添加控件通知处理程序代码
- m_r1.SetCheck(FALSE);
- m_r2.SetCheck(TRUE);
- m_st.SetWindowText("静态文本框2==");
- m_ps.SetBitmap(::LoadBitmap(AfxGetInstanceHandle(), MAKEINTRESOURCE(IDB_BITMAP2)));
- }
十、组合框
1、组合框介绍
(1)相关类
CComboBox类,父类为CWnd,封装了关于组合框控件的各种操作
(2)常见操作
添加选项
CComboBox::AddString
删除选项
CComboBox::DeleteString
获取当前选项索引
CComboBox::GetCurSel
通过索引设置当前选项
CComboBox::SetCurSel
获取选项文本内容
CComboBox::GetLBText
设置选项附加数据
CComboBox::SetItemData
获取选项附加数据
CComboBox::GetItemData
(3)分类
简单式组合框(Simple) / 下拉式组合框(Dropdown) / 下拉式列表式组合框(Drop List)
(4)组合框消息
当选项发生变化时
WM_COMMAND消息(通知码CBN_SELCHANGE)
当文本内容发生变化时
WM_COMMAND消息(通知码CBN_DEITCHANGE)
2、创建项目
(1)创建对话框项目(MFCCtrl3)
(2)创建三个组合框(选中工具箱的Combo Box,在对话框框出范围)
(3)将三个组合框的属性分别设置为Simple/Dropdown/Drop List

(4)修改组合框ID
(5)使用类向导给三个组合框创建绑定控件类对象

(6)在初始化函数添加选项
- BOOL CMFCCtrl3Dlg::OnInitDialog()
- {
- CDialogEx::OnInitDialog();
-
- // 设置此对话框的图标。当应用程序主窗口不是对话框时,框架将自动
- // 执行此操作
- SetIcon(m_hIcon, TRUE); // 设置大图标
- SetIcon(m_hIcon, FALSE); // 设置小图标
-
- ShowWindow(SW_MINIMIZE);
-
- // TODO: 在此添加额外的初始化代码
- for (int i=0;i<100;i++)
- {
- CString strSimple;
- strSimple.Format("strSimple:%d", i);
- m_simple.AddString(strSimple);
-
- CString strDropDwon;
- strDropDwon.Format("strDropDwon:%d", i);
- m_dropDown.AddString(strDropDwon);
-
- CString strDropList;
- strDropList.Format("strDropList:%d", i);
- m_dropList.AddString(strDropList);
- }
-
- return TRUE; // 除非将焦点设置到控件,否则返回 TRUE
- }
(7)设置取消自动排序,将Sort设置为false

(7)通过按钮清空选项

- void CMFCCtrl3Dlg::OnBnClickedClear()
- {
- // TODO: 在此添加控件通知处理程序代码
- m_simple.ResetContent();
- m_dropDown.ResetContent();
- m_dropList.ResetContent();
- }
(8)通过按钮实现 选项获取、设置和删除
- void CMFCCtrl3Dlg::OnBnClickedDelete()
- {
- // TODO: 在此添加控件通知处理程序代码
- int nPos = m_simple.GetCurSel();
- m_simple.SetCurSel(nPos+1);
- m_simple.DeleteString(nPos);
-
- nPos = m_dropDown.GetCurSel();
- m_dropDown.SetCurSel(nPos+1);
- m_dropDown.DeleteString(nPos);
-
- nPos = m_dropList.GetCurSel();
- m_dropList.SetCurSel(nPos+1);
- m_dropList.DeleteString(nPos);
- }
(9)通过按钮获取选项的文本内容
- void CMFCCtrl3Dlg::OnBnClickedGettext()
- {
- // TODO: 在此添加控件通知处理程序代码
- CString str1;
- m_simple.GetLBText(m_simple.GetCurSel(), str1);
-
- CString str2;
- m_dropDown.GetLBText(m_dropDown.GetCurSel(), str2);
-
- CString str3;
- m_dropList.GetLBText(m_dropList.GetCurSel(), str2);
-
- AfxMessageBox(str1+str2+str3);
- }

(10)在初始化函数给选项添加附加数据
- BOOL CMFCCtrl3Dlg::OnInitDialog()
- {
- CDialogEx::OnInitDialog();
-
- // 设置此对话框的图标。当应用程序主窗口不是对话框时,框架将自动
- // 执行此操作
- SetIcon(m_hIcon, TRUE); // 设置大图标
- SetIcon(m_hIcon, FALSE); // 设置小图标
-
- ShowWindow(SW_MINIMIZE);
-
- // TODO: 在此添加额外的初始化代码
- for (int i=0;i<100;i++)
- {
- CString strSimple;
- strSimple.Format("strSimple:%d", i);
- m_simple.AddString(strSimple);
- m_simple.SetItemData(i, i+1000); //添加附加数据
-
- CString strDropDwon;
- strDropDwon.Format("strDropDwon:%d", i);
- m_dropDown.AddString(strDropDwon);
- m_dropDown.SetItemData(i, i+1000); //添加附加数据
-
-
- CString strDropList;
- strDropList.Format("strDropList:%d", i);
- m_dropList.AddString(strDropList);
- m_dropList.SetItemData(i, i+1000); //添加附加数据
- }
-
- return TRUE; // 除非将焦点设置到控件,否则返回 TRUE
- }
(11)通过按钮获取附加数据
- void CMFCCtrl3Dlg::OnBnClickedGetdata()
- {
- // TODO: 在此添加控件通知处理程序代码
- DWORD nData = m_simple.GetItemData(m_simple.GetCurSel());
- CString str;
- str.Format("%d", nData);
- AfxMessageBox(str);
- }
(12)通过类向导添加组合框消息处理函数
- void CMFCCtrl3Dlg::OnSelchangeSimple()
- {
- // TODO: 在此添加控件通知处理程序代码
- int nPos = m_simple.GetCurSel();
- m_dropDown.SetCurSel(nPos);
- m_dropList.SetCurSel(nPos);
- }
- void CMFCCtrl3Dlg::OnEditchangeSimple()
- {
- // TODO: 在此添加控件通知处理程序代码
- AfxMessageBox("内容被修改");
- }
十一、列表框
1、介绍
(1)相关类
CListBox类,父类为CWnd,封装了关于列表框控件的操作
(2)常见操作
添加选项
CListBox::AddString
删除选项
CListBox::DeleteString
获取当前选项
CListBox::GetCurSel
通过索引设置当前选项
CComboBox::SetCurSel
获取选项文本内容
CComboBox::GetItemText
设置选项附加数据
CComboBox::SetItemData
获取选项附加数据
CComboBox::GetItemData
(3)工具箱中的控件名称为 List Box