UpdateData(TRUE) 控件的值—>变量
UpdateData(FALSE) 变量值—>控件显示
当你使用UpdateDate()函数的时候,你要清楚一个重要的点,那就是它的范围是你调用它的类所代表的框架中生效。
举个例子:
我们有一个主对话框,然后在其中建立了三个标签页。三个标签页分别关联了三个类。
那么我们要在主对话框中使用标签页中关联了一个编辑框的变量时,如果你使用UpdateData(false)的时候,你会发现没有效果。
你必须用标签页的类如CPage0 page0; page0.UpdateData(false);才会达到你的目的。
注意:
1.用于数据交换的DoDataExchange函数是不能被直接调用的,必须通过调用UpdateData()函数来调用DoDataExchange函数。
所以在用到控件与关联的成员变量交换数据时,要首先调用UpdateData()函数。
2.当模态对话框被创建时,在OnInitialDialog()函数里framework自动的调用UpdateData(FALSE)。该函数的调用在对话框出现之前。
而且在默认的接口函数OnOk()里也调用了该函数UpdateData(TRUE)来获取数据,如果调用成功,将会关闭对话框。(如果单击Cancel按钮,就不会调用该函数)
在线程中使用UpdateData(FALSE)来更新窗口的内容,结果在Debug版本下面就出现了Assert报错
原因:
简单的说,不能跨线程访问MFC窗口对象。MFC句柄封装类只在创建句柄的线程中有效,在其它线程中访问会出现无法预料的结果。适当的访问方式是直接访问句柄。你需要另外想办法,例如在线程类中声明一个指针,AfxBeginThread的时候以暂停方式启动线程,设置指针为文档指针之后继续线程的运行。 参考http://support.microsoft.com/default.aspx?scid=kb;en-us;147578
解决方案:
UpdateData(FALSE)语句用SendMessage(WM_UPDATEDATA, FALSE)替代即可.
在abc.h文件中: #define WM_UPDATEDATA WM_USER + 5
LRESULT OnUpdateData(WPARAM wParam, LPARAM lParam);
在abc.cpp文件中: //函数映射 :
ON_MESSAGE(WM_UPDATEDATA, OnUpdateData)
//定义新函数:
LRESULT CProtectPage::OnUpdateData(WPARAM wParam, LPARAM lParam)
{
UpdateData(wParam);
return 0;
}
//传消息给窗口:
SendMessage(WM_UPDATEDATA, FALSE)