通过编写串口助手工具学习MFC过程
因为以前也做过几次MFC的编程,每次都是项目完成时,MFC基本操作清楚了,但是过好长时间不再接触MFC的项目,再次做MFC的项目时,又要从头开始熟悉。这次通过做一个串口助手再次熟悉一下MFC,并做了一下记录,以便方便以后查阅。做的过程中多是遇到问题直接百度和谷歌搜索来的,所以很多都是不求甚解,知其然不知其所以然。另外做此工具只是为了熟悉了解,许多功能还没有完善!(开发工具VS2008)
(十)UpdateData()用法和编辑框的赋值和取值
一、对编辑框和赋值和取值方法
1、建一个 控制型的变量,如m_edit1,从几节有介绍通过在资源视图的控件中右键选择添加变量,生成后为 CEdit m_edit1; 用CWnd的SetWindowText() 和GetWindowText()来赋值和取值。
m_Edit1.SetWindowText("Hello");
或者GetDlgItem(IDC_EDIT1)->SetWindowText(str);
IDC_EDIT1为编辑框的ID。
2、和上面方法类似,建立一个控制型的变量,如m_edit1,用SetDlgItemText()和GetDlgItemText()来赋值和取值
CString Str="Hello":
m_edit1.SetDlgItemText(IDC_EDIT1,str);
上面两种方法,关联控制型变量时,会在DoDataExchange中,使用
DDX_Control(pDX,IDC_EDIT,m_edit1);进行关联。如第1和第2种方法。
3、直接建一个 数值形的变量 如m_strEdit; 用 UpdateData()来控制得到变量,还是更新变量。
关联CString变量的话,会在对话框类的构造函数中,进行初始化,在DoDataExchange中,通过DDX_Text(pDX,IDC_EDIT,m_EditText),进行对象的绑定。
//取值 ,从控件中读取值赋给CString变量m_Edit1。
UpdateData(TRUE); CString buf = m_Edit1;//赋值 将 CString变量m_Edit1的值,显示在控件上。
m_Edit1="ok!"; UpdateData(FALSE);二、详细说明UpdateData()的用法
UpdateData(true);//用于将屏幕上控件中的数据交换到变量中
——刷新控件的值到对应的变量。(外部输入值交给内部变量)
即:控件的值—>变量。
UpdateData(false);//用于将数据在屏幕中对应控件中显示出来。
—— 拷贝变量值到控件显示。(变量的最终运算结果值交给外部输出显示)
即:变量值—>控件显示。
例如,定义变量CString m_usercode;
窗口中用 DDX_Text(pDX, IDC_EDIT1, m_usercode);
将IDC_EDIT1编辑框控件与m_usercode变量做了关联。
如果UpdateData(TRUE) == 将控件的值赋值给,即从窗口编辑框中读入数据;UpdateData(FALSE) == 将成员变量的值赋值给控件,将数据从窗口显示。
当修改了变量的值,而希望对话框控件更新显示,就应该在修改变量后调用UpdateData(FALSE);如果你希望知道用户在对话框中到底输入了什么,就应该在访问变量前调用UpdateData(TRUE)。
关于关联变量,一个编辑框可以和CEdit变量关联,也可以和CString变量关联。
三、DDX_Control和DDX_Text数据交换
DoDataExchange()函数
void CTestDlg::DoDataExchange(CDataExchange* pDX)
{
CDialog::DoDataExchange(pDX); //父类CDialog的DDX
//{
{AFX_DATA_MAP(CTestDlg)DDX_Control(pDX, IDC_EDT_NAME, m_EDT_strName); //控件和自身控件变量关联
DDX_Text(pDX, IDC_EDT_NAME, m_strName); //控件和CString变量关联
//}}AFX_DATA_MAP
}
1. DDX_TEXT()可以认为是把字符串变量和控件的内容关联起来;
2. DDX_Control()可以认为是把变量和控件本身关联起来;
3. DoDataExchange(pDX)就是处理所有变量与其关联控件交换数据的函数。
DDX_TEXT()数据交换过程:
UpdateData(TRUE);//将控件的内容传回 m_strName;
m_strName = _T("关联变量");//修改值
UpdateData(FALSE);//将m_strName的值显示到控件
DDX_Control()数据交换过程:
CString str;
m_EDT_strName.GetWindowText(str);//得到控件的内容保存到str
str = _T("控件绑定变量");
m_EDT_strName.SetWindowText(str);//设置控件的内容为str
四、
DoDataExchange由框架调用,作用是交互并且验证对话框数据,主要由(DDX) 和 (DDV)宏实现。 永远不要直接调用这个函数,而是通过UpdateData(TRUE/FALSE)实现控件与变量之间值的传递。
当然你也可以不使用DoDataExchange而完成控件与变量之间值的传递,如:
通过GetWindowText和SetWindowText等等函数完成String变量与Edit控件之间的数据交互,
通过使用ClassWizard向对话类添加成员变量,你可以利用ClassWizard所提供的高效特征,为对话数据交换和对话数据验证自动生成源代码,也就是人们所熟知的DDX/DDV。
数据交换和验证仅仅应用于为之选定了Value类别的成员变量。也就是CString,BOOL,数字,COleDateTime或COLeCurrency。对话框数据交换负责数据在控件中的进出。当对话首次出现的时候,每个控件窗口自动用相应的成员变量的值进行初始化。当用户通过单击OK按钮,或通过按Enter键关闭对话的时候,该控件无论是包含哪一个值或文本,都将被复制回该变量。对话数据验证可以确保值落在规定的限制之内。交换和验证机制都是由MFC框架提供的。每个函数都有一个前缀DDX_或DDV_,来把它作为数据交换或数据验证函数来标识。1. 对话数据交换(DDX)常见的对话数据交换函数(1)交换函数:DDX_CBIndex, 获得/设置的数据类型:int, 应用于控件:Combobox(2)交换函数:DDX_CBString, 获得/设置的数据类型:Cstring, 应用于控件:Combobox(3)交换函数:DDX_CBStringExact, 获得/设置的数据类型:Cstring, 应用于控件:Combobox(4)交换函数:DDX_Check, 获得/设置的数据类型:intCheck, 应用于控件:box(5)交换函数:DDX_DateTimeCtrl, 获得/设置的数据类型:Ctime, 应用于控件:Datetimepicker(6)交换函数:DDX_LBIndex, 获得/设置的数据类型:int, 应用于控件:List box(7)交换函数:DDX_LBString, 获得/设置的数据类型:CString, 应用于控件:Listbox(8)交换函数:DDX_LBStringExact, 获得/设置的数据类型:CString, 应用于控件:List box(9)交换函数:DDX_MonthCalCtrl, 获得/设置的数据类型:Ctime, 应用于控件:Month calendar(10)交换函数:DDX_Radio, 获得/设置的数据类型:int, 应用于控件:Radio button(11)交换函数:DDX_Scroll, 获得/设置的数据类型:int, 应用于控件:Scroll bar(12)交换函数:DDX_Text, 获得/设置的数据类型:CString or numerical(BYTE,short,int,UINT,long,etc.),应用于控件:Edit control在所有的数据交换函数之中,该函数是独一无二的,它只应用于一组控件,而不是一个控件。DDX_Radio返回一个int值用来指示用户打开了组中的哪个按钮:0代表组中的第一个按钮,1代表第二个按钮,以此类推。值-1的意思是小组中的所有按钮都是清除的。你可以调用DDX_Radio来确定单个单选按钮的状态(假如它是组中的唯一一个按钮)。在这种情况下,返回值0的意思是按钮是打开的,值-1意为按钮是关闭的。建立一个单选按钮通常在对话编辑器中进行,我们一会儿就能看到。
MFC提供了大量的对话数据交换函数,它们可以在对话类中的控件成员变量之间移动数据。除了所列的常见函数之外,还有用于记录集数据和由ActiveX控件返回的数据的特殊交换函数。DDX_Control函数可以为几种不同类型的控件传输数据 ,例如Animate和IPAddress。
2.对话数据验证(DDV)对话数据验证函数,它们仅仅应用于接受用于从键盘输入数据的控件成员变量。换言之,就是编辑控件和组合框。
对话数据验证函数(1)DDV_MinMaxByte 指定限制范围内的一个BYTE值。(2)DDV_MinMaxInt 指定限制范围内的一个int值。(3)DDV_MinMaxUInt 指定限制范围内的一个UNIT值。(4)DDV_MinMaxLong 指定限制范围内的一个long值。(5)DDV_MinMaxDWord 指定限制范围内的一个DWORD值。(6)DDV_MinMaxFloat 指定限制范围内的一个float值。(7)DDV_MinMaxDouble 指定限制范围内的一个double值。(8)DDV_MaxCharsCString字符串的长度不能超过指定的最大长度。当你为编辑控件或组合框添加成员变量,然后在Member Variable选项卡中的Control IDs框中选择控件的时候,两个提示之一将会出现在该选项卡的底部。究竟出现哪一个提示取决于变量所具有的是数字数据,还是文字数据;在任一种情况下,都要输入用于验证的变量限制值。除了一个对话数据验证函数之外,所有函数都监视数值数据,以确保由用户输入的值落在指定的上下限之间。例外是DDV_MaxChars函数,它用来验证键入到编辑控件或组合框中的字符数不超过给定的最大值。与交换函数不同,验证函数仅仅在对话关闭的时候起作用,而不在它刚出现的时候起作用。如果输入到一个控件的值落到了指定的限制之外,那么,该控件的验证函数将显示一个消息框,以通知用户出了问题。当消息框被关闭的时候,出问题的控件将具有一个焦点,提示用户重新输入数据。除非所有的数据验证函数都满足了,否则,用户不能够通过单击OK来关闭对话。
以上内容主要引自: