在对话框上能添加各种控件,如何对这些控件进行操作呢,有2种基本的方法.
①->控件类型变量绑定的两种方法 - 数据交换机制:
(1)利用GetDlgItem函数取得对话框控件指针,具体操作
1->在主对话框类CMFCDlg类中 声明一个需要绑定的CButton类的变量 m_button, 在BOOL CMFCTestDlg::OnInitDialog()中,用pButton = (CButton *)GetDlgItem(IDC_BUTTON1);获取ID=IDC_BUTTON1的控件,
2->用获取的pButton指针进行操作,具体操作可以查看CButton类的成员函数
--------------------------------------------------------------------------------------------------------------------------------------
(2)利用VC向导的方式添加
1->在资源编辑器中画一个Edit Control,然后鼠标移上去右键添加变量CEdit m_Edit
2->观察主对话框 CMFCDlg类的cpp和h变化,会发现在h文件中添加了public:CEdit m_Edit;在cpp中有一个叫
void CMFCtDlg::DoDataExchange(CDataExchange* pDX)
{
CDialog::DoDataExchange(pDX);
DDX_Control(pDX, IDC_MAIN_EDIT, m_Edit);
}
这里的DDX_Control是进行数据交换的一个宏,作用控件与变量进行绑定,然后对变量进行操作就相当于对空间进行操作
3->对CEdit m_Edit进行操作 可以查看CEdit类的成员函数
--------------------------------------------------------------------------------------------------------------------------------------
②->字符串类型、数值类型 变量的绑定以及数据验证机制;
1->在资源编辑器的Edit control点击添加变量 选择非控件类型,添加CString m_strEdit,最大字符串长度限制选择5
2->操作完成后进入主对话框CMFCDlg类的cpp和h文件查看,如果在h文件没有发现CString m_strEdit则需要手动添加,在void CMFCtDlg::DoDataExchange(CDataExchange* pDX)
{
CDialog::DoDataExchange(pDX);
DDX_Control(pDX, IDC_MAIN_EDIT, m_Edit);
DDX_Text(pDX,IDC_MAIN_EDIT,m_strEdit); //如未出现则手动添加
}
DDX_Text是绑定非控件类型的控件变量宏
3->对m_strEdit进行MeesageBox(m_strEdit),发现提示框为空,这是因为还没有进行数据交换更新,需要调用
UpdateData(TRUE);//这句是指把Edit control数据提出来,而如果想把新的m_strEdit再次放入Edit control则用
UpdateData(FALSE);//这句是把m_strEdit 更新进去
4->退回第一步再次添加非控件变量 int m_intEdit,因为一个控件最多绑定2个变量
5->操作完成后进入主对话框CMFCDlg类的cpp和h文件查看,如果在h文件没有发现int m_strEdit则需要手动添加,在void CMFCtDlg::DoDataExchange(CDataExchange* pDX)
{
CDialog::DoDataExchange(pDX);
DDX_Control(pDX, IDC_MAIN_EDIT, m_Edit);
DDX_Text(pDX,IDC_MAIN_EDIT,m_intEdit); //如未出现则手动添加
}
6->对m_intEdit进行MessageBox操作,
m_intEdit = 123;
UpdateData(TRUE);
CString str;
str.Format(_T("m_IntEdit = %d"), m_IntEdit); //转格式为CString
MessageBox(str);
m_IntEdit = 456;
UpdateData(FALSE);
7->如果要对DDX_Text输入的数据进行限定
需要在void CMFCtDlg::DoDataExchange(CDataExchange* pDX)
假如DDV_XXXX 进行数据校验 注意需要数据更新后才能正常校验 UpdateData(TRUE);
--------------------------------------------------------------------------------------------------------------------------------------
③各种开源控件类的使用;
1->可以先下载开源控件类,然后在工程加入cpp和h文件,并按照说明进行操作
④MFC与SDK API中同名函数问题。
1->如果要在MFC类中使用全局变量需要加::操作符
--------------------------------------------------------------------------------------------------------------------------------------
⑤控件自定义消息响应
1->为控件添加基于子类的类,并且与控件所在类进行绑定,绑定步骤与上面一样
2->在新建类完成消息响应
3->有向导则无需手动添加消息映射,消息声明