九、MFC控件(一)

一、控件的使用

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

程序源代码:https://download.csdn.net/download/liutit/86738817