编程中多次用到获取界面中编辑框中的内容。关于编辑框还有一些其他的问题:如UpdateData(TRUE),函数参数为TRUE或FALSE的含义,以及编辑框关联值变量(CString)以及控件变量(Edit)获取编辑框的内容等问题。先就这几个问题做小结,供后续参考,后续再做补充。
新建测试界面如下:
图1 测试工程界面
一、关联字符串变量的编辑框获取编辑框的内容
关联字符串变量的编辑框添加变量(值变量,Value CString 如下图所示)
图2 编辑框控件关联值变量
对应地测试代码添加到 测试1 对应的消息响应函数中,代码如下:
void CGetEditctrlDataDlg::OnTest()
{
//调用函数
//BOOL b=TRUE;
BOOL b=FALSE;
UpdateData(b);
CString str;
//b=TRUE str的值为输入编辑框的字符串值
//b=FALSE str的值为 空
str=m_strValue;
MessageBox(str);
}
代码中调用函数UpdateData获取变量的值,参数为TRUE和FALSE所得结果见注释。
这里对UpdateData函数做一个小结:
UpdateData(TRUE): 表示写数据,将窗口控制变量写入内存(更新数据)
-------使用OnOk时将自动调用UpdateData(True) ,用以将窗口数据写入内存相应成员变量中;
UpdateData(FALSE): 表示读数据,即显示窗口读取内存的数据以供实时显示
------使用OnInitDialog中,MFC调用UpdateData((FALSE)将内存成员数据显示到对应的窗口中
所谓写数据,即是将外部数据写入到内存变量中(改变内存数据);
所谓读数据,显示窗口读取内存数据(不改变内存数据)
二者经常使用于如下情况:
在设置窗口数据默认值时,或将窗口数据作为控制参数传入到内存时,这时需要往内存写入数据,此时应首先调用UpdataData(TRUE);
写入之后,需要观察内存这个数据的变化,这时应该时刻读取内存数据,此时应调用UpdateData(FALSE)
例如 CDialog的两个成员函数OnInitDialog()和OnOK()
BOOL CDialog::OnInitDialog()
{
// execute dialog RT_DLGINIT resource
BOOL bDlgInit;
if (m_lpDialogInit != NULL)
bDlgInit = ExecuteDlgInit(m_lpDialogInit);
else
bDlgInit = ExecuteDlgInit(m_lpszTemplateName);
if (!bDlgInit)
{ TRACE(traceAppMsg, 0, "Warning: ExecuteDlgInit failed during dialog init./n");
EndDialog(-1);
return FALSE;
}
// transfer data into the dialog from member variables
if (!UpdateData(FALSE))
{
TRACE(traceAppMsg, 0, "Warning: UpdateData failed during dialog init./n");
EndDialog(-1); return FALSE;
}
// enable/disable help button automatically
CWnd* pHelpButton = GetDlgItem(ID_HELP);
if (pHelpButton != NULL)
pHelpButton->ShowWindow(AfxHelpEnabled() ? SW_SHOW : SW_HIDE);
return TRUE; // set focus to first one
}
void CDialog::OnOK()
{
if (!UpdateData(TRUE))
{
TRACE(traceAppMsg, 0, "UpdateData failed during dialog termination./n"); // the UpdateData routine will set focus to correct item
return;
}
EndDialog(IDOK);
}
关于UpdateDate函数,设置断点发现,该函数在CDialog启动的时候,和关闭的时候都调用。解释:CWnd::UpdateData
调用此函数来初始化对话框中的数据,或者从对话框中接收数据。当一个模态对话框被创建,框架会自动在CDialog::OnInITDialog中调用UpdateData(FALSE),这种调用发生在对话框可视情况下,默认的CDialog::OnOK会调用UpdateData(TRUE)来接收数据。。。如果接收成功。。。就会关掉对话框。。。Cancel对话框不会调用此函数而直接关闭对话框。 简单的说,如果Updatedata(TRUE) == 将控件的值赋值给成员变量,Updatedata(FALSE) == 将成员变量的值赋值给控件。
二、关联控件变量的编辑框获取编辑框中的内容
图3 编辑框控件关联控件变量
对应地测试代码添加到 测试2 对应的消息响应函数中,代码如下:
void CGetEditctrlDataDlg::OnTest2()
{
//第二个编辑框关联的是一个Edit的控件变量
CString str;
//方法1 获取没有关联 值变量 的编辑框中的内容 通过ID号
//GetDlgItem(IDC_EDIT_TWO2)->GetWindowText(str);
//方法2 获取没有关联 值变量 的编辑框中的内容 通过编辑框关联的 控件变量
m_editctrl.GetWindowText(str);
MessageBox(str);
}
代码中方法1和方法2都是有效的,都可以在此情况下获取编辑框中的内容。