打造自定义的 AfxMessageBox

来源:互联网 发布:mac打不开exe文件 编辑:程序博客网 时间:2024/06/03 02:28
 一、需求
  与标准的 MessageBox 相比,MFC提供了 AfxMessageBox 的方法是我们对消息框的变得更加容易。然而简单的 AfxMessageBox 有时已经不能够满足我们的需求了:有时候我仅仅想提示用户一下,并不需要用户确认,也就是说过一段时间消息框就能自动关闭。
  您可能马上会想到,使用自己定义的对话框来替代程序中的 AfxMessageBox,没错,这样的结果非常能够让你满意,但怎么实现呢?
  您也许会说,我自己写一个 OwnMessageBox 函数,先前调用 AfxMessageBox 的地方都换成它就好了,非常好的主意!但你终归要去一个个的替换,是不是感觉很没有挑战性呢?现在本文将介绍一个比较好的办法解决此问题。

二、解决办法
  MFC中的CWinApp提供了一个名为 DoMessageBox 的虚函数供它的子类进行重载操作,我们先来看一下AfxMessageBox的源代码:
      int AFXAPI AfxMessageBox(LPCTSTR lpszText, UINT nType, UINT nIDHelp)      {            CWinApp* pApp = AfxGetApp();            if (pApp != NULL)                  return pApp->DoMessageBox(lpszText, nType, nIDHelp);            else                  return pApp->CWinApp::DoMessageBox(lpszText, nType, nIDHelp);      }      
重载 DoMessageBox 后我们得到了什么呢?
      int COwnAfxMessageBoxApp::DoMessageBox(LPCTSTR lpszPrompt, UINT nType, UINT nIDPrompt)       {            return CWinApp::DoMessageBox(lpszPrompt, nType, nIDPrompt);      }      
其中 CWinApp::DoMessageBox 就是对 Windows API 中的 ::MessageBox 的封装,再此不多叙。
  从代码中看出,调用 AfxMessageBox 先要到 DoMessageBox 这里审核,审核通过再执行标准的MessageBox,这下你该知道怎么做了吧?到这时,可能你会这样写到:
      int COwnAfxMessageBoxApp::DoMessageBox(LPCTSTR lpszPrompt, UINT nType, UINT nIDPrompt)       {            OwnMessageBox(lpszPrompt, nType, nIDPrompt);            // return CWinApp::DoMessageBox(lpszPrompt, nType, nIDPrompt);      }      
  这样的写法没有问题,但也许有的时候仍然需要弹出标准的 MessageBox 需要用户确认,怎么设计才更加合理呢?AfxMessageBox 的第二个参数 nType 是指定 MessageBox 的类型,在 Winuser.h 中定义了一些标准的类型,请注意 nType 是 UINT 类型的,而标准类型的定义才不到10个,你完全可以添加自己的 MessageBox 类型!在 OwnAfxMessageBoxApp.h 中定义:
      #define MB_USERDEFINE0x10000000
你的 DoMessageBox 处理函数:
int COwnAfxMessageBoxApp::DoMessageBox(LPCTSTR lpszPrompt, UINT nType, UINT nIDPrompt) {if (MB_USERDEFINE == nType){OwnMessageBox(lpszPrompt, nType, nIDPrompt);return TRUE;}return CWinApp::DoMessageBox(lpszPrompt, nType, nIDPrompt);}            
你的调用代码:
void COwnAfxMessageBoxDlg::OnOK() {::AfxMessageBox("我是标准的 AfxMessageBox!");::AfxMessageBox("我是被重载的 AfxMessageBox!", MB_USERDEFINE);//CDialog::OnOK();}      
到这里原理部分已经讲完了,具体的实现方法请查看代码。感谢 CSDN 的 bongny (金辉)提供了思路。

三、结束语
  其实这个根本都称不上技术,只要善于发现就会有新的收获。祝大家身体健康,万事如意!
最后打一句广告:请关注恒金软件 - http://www.kingesoft.com !
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 中国人移民欧洲饮食不习惯怎么办 出车祸了报警警察不管怎么办 高中的孩子不好好上学怎么办 和老公消费观念不合拍怎么办 去医院没带现金怎么办 微信读书下架了怎么办 24岁血压有点高怎么办 吃鸡鼠标弹出来怎么办 电脑分辨率调错了怎么办 猎豹sc9打不开门怎么办 苹果手机卡顿反应慢怎么办 金立手机卡顿反应慢怎么办 20天宝宝黄疸219怎么办? 智慧树选修挂科怎么办 军人被纠察抓了怎么办 我家的小孩很凶怎么办 10岁儿童老挤眼怎么办? 脚趾长鸡眼好痛怎么办 月加班超过36小时怎么办 月经老提前怎么办才好 20岁例假不规律怎么办 农村的医保门诊封顶了怎么办 保研夏令营被拒怎么办 小学生去英国游学怎么办签证 医生说我湿气重怎么办 喉咙痛有来医生感冒喉咙痛怎么办 暴马丁香叶子卷怎么办 房产权40年以后怎么办 面试回答不了考官的问题怎么办 轻伤事故对方要钱太多我怎么办 退休后有房子住公积金怎么办 江苏副高评过不聘怎么办 抗环瓜氨酸肽抗体高怎么办 脚被磨破了好痛怎么办 脚磨破皮肿了怎么办 脚磨破皮发炎了怎么办 3个月婴儿流口水怎么办 beats耳机被偷了怎么办 beats X耳机丢了怎么办 头戴耳机戴着热怎么办 长时间戴耳机耳朵疼怎么办