关于CDialog的几个函数

1、viutual BOOL OnInitDialog()
    发现有些同学以为在这里返回FALSE就会退出对话框。实际上,以前自动创建对话框类,会有一个默认实现的OnInitDialog()函数,最后一行会有注释,意思是这里应返回值TRUE,例外情况是作为OCX(控件)属性页返回FALSE。要在这里退出对话框,可以用OnCancel()或EndDialog(),并立即返回TRUE(避免在对话框关闭之后还继续执行后面的代码)。后来,自动创建对话框类,不再自动实现一个OnInitDialog()函数,需要手动添加,这时候又有同学忘了一件事,就是首先调用基类函数 CDialog::OnInitDialog(),结果发现控件与变量的数据交换都无效。
2、virtual void DoDataExchange(CDataExchange* pDX)
    这个函数实现对话框上的控件与变量的数据交换,通过函数 DDX_Control(),DDX_Text()等将控件与变量进行绑定,。调用UpdateData(BOOL)的时候,这个函数就会被执行。UpdateData(TRUE)的时候,根据控件更新变量数据,此时还会进行数据验证(格式、长度限制等)。UpdateData(FALSE)的时候,根据变量数据修改控件显示。所以,初始化的时候,在 OnInitDialog() 里调用一次 UpdateData(FALSE);以显示初始数据。    UpdateData(BOOL)的参数会传递给参数 pDX,即 pDX->m_bSaveAndValidate。因此也可以实现一些特殊处理,比如某个特殊控件无法直接与变量进行数据交换,需要通过控件的接口函数实现数据读写,最简单的类似这样:if(pDX->m_bSaveAndValidate){var=control.GetValue()} else {control.SetValue(var);}。还可以有很多复杂的操作。
3、UpdateData(BOOL)
    除了前面说的用途,这里补充一点,很多同学都忘了这个函数有返回值的,经常在 调用Update(TRUE)之后直接进行下一步操作,实际上,这个函数可能返回数据验证错误(比如绑定数值型变量的文本框输入空或者非数值内容),应做相应的处理。另外,在对话框初始化函数OnInitDialog()里,调用一次UpdateData(FALSE)以将控件绑定的内容初始化。
4、virtual void OnOK()
    这个函数在点击ID为IDOK的按钮或者按Enter键的时候(没有设置其他控件接收Enter键)触发,不需要添加消息映射。有不少同学重载了这个函数,最后结束的时候直接调用基类的 CDialog::OnOK()。实际上,这样会多执行了一个 UpdateData(TRUE)的操作,如果数据验证不通过的时候会弹出提示框。正确的做法是调用 EndDialog(IDOK)来退出对话框。早期版本在设计界面双击IDOK按钮,会自动生成virtual void OnOK()函数,默认调用CDialog::OnOK();后来的版本,则是生成一个消息函数,添加按钮事件消息映射,默认调用OnOK(),而不再自动生成OnOK()的代码。
5、virtual void OnCancel()
    这个函数在点击ID为IDCANCEL的按钮或按Esc键或点击右上角关闭按钮(如果可用的话)退出对话框时触发。早期版本在设计界面双击IDCANCEL按钮,会自动生成virtual void OnCancel()函数,默认调用CDialog::OnCancel();后来的版本,则是生成一个消息函数,添加按钮事件消息映射,默认调用OnCancel(),而不再自动生成OnCancel()的代码。

 

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值