控件与变量的关联
对于一个MFC控件如CEdit控件,我们可以使用GetDlgItem得到控件指针,对控件进行操作
除此之外,还可以将控件与变量进行关联,通过变量来操作控件。
方法一
在窗体资源中,对控件右键,点击添加变量

设置变量名字点完成

之后通过变量edit_1即可操作控件IDC_EDIT1
方法二
在窗口头文件中定义CEdit变量
在源文件的DoDataExchange()函数中,手动关联控件和变量。DoDataExchange,顾名思义,进行控件与变量数据交换的函数
void CMFCTestDlg::DoDataExchange(CDataExchange* pDX)
{
CDialog::DoDataExchange(pDX);
//关联控件与变量
DDX_Control(pDX, IDC_EDIT1, edit_1);
}
其中,DDX_Control函数管理着在对话框、表格视或控件视中被子类化的控件与对话框、表格视或控件视的CWnd数据成员之间的数据交换。
void AFXAPI DDX_Control( CDataExchange* pDX, int nIDC, CWnd& rControl );
pDX 指向CDataExchange对象的指针。框架提供了这个对象以建立数据交换的环境,包括其方向。
nIDC 与控件属性相关的被子类化的控件的资源ID。
rControl 对对话框、表格视或控件视的成员变量的引用,将与该变量发生数据交换。
之后就可以操控edit_1来进行控件的操作
实现自定义控件的方法
方法二可以实现自定义控件的效果,例如:
通过类向导新建一个基于CEdit的类,自己覆写其中的一些函数,如覆写绘图函数实现控件外观的改变。
在窗体类包含该类的头文件,并使用它自定义一个变量
将控件资源与这个变量建立数据关联
void CMFCTestDlg::DoDataExchange(CDataExchange* pDX)
{
CDialog::DoDataExchange(pDX);
//关联控件与变量
DDX_Control(pDX, IDC_EDIT1, m_myEdit);
}
就实现了自定义的CEdit控件
控件与文本、数值的绑定
可以将控件与文本,数值等变量相绑定。使用的函数为:
void AFXAPI DDX_Text( CDataExchange* pDX, int nIDC, CString& value );
void AFXAPI DDX_Slider( CDataExchange* pDX, int nIDC, int& value );
...
对于DDX_XXX函数,更多的参考MSDN:MFC Macros and Globals
对于与控件绑定的控件变量,他的数据是与控件相同步的。而对于这种手段绑定的文本变量等,需要使用UpdateData()函数来实现数据的更新
UpdateData()参数只有一个,默认为TRUE。
UpdateData(TRUE):刷新控件的值到对应的变量。(外部输入值交给内部变量)
UpdateData(FALSE): 拷贝变量值到控件显示。(变量的最终运算结果值交给外部输出显示)
如
void CMFCTestDlg::DoDataExchange(CDataExchange* pDX)
{
CDialog::DoDataExchange(pDX);
//关联控件与变量
DDX_Text(pDX, IDC_EDIT1, str);
}
...
void CMFCTestDlg::OnBnClickedButton1()
{
UpdateData(true);//刷新控件的值到对应的变量
//控制台打印str的值
AllocConsole();
freopen( "CONOUT$", "w+t", stdout );// 申请写
freopen( "CONIN$", "r+t", stdin ); // 申请读
::wprintf(str.GetBuffer());
str.ReleaseBuffer();
FreeConsole();
}
void CMFCTestDlg::OnBnClickedButton2()
{
str=“hi”;
UpdateData(false);//刷新对应的变量的值到控件
}
当点击button1时,CEdit控件里面的内容,就会赋值给str,并通过控制台打印出str
而当点击button2时,str的值就会改变CEdit控件里面的内容,并显示出来