九、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 <afxwin.h>
#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 <afxwin.h>
#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 <afxwin.h>
#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

  • 0
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值