打造自定义的 AfxMessageBox

长对白是馒头

长对白是馒头

2016-01-29 12:26

打造自定义的 AfxMessageBox,打造自定义的 AfxMessageBox

打造自定义的 AfxMessageBox

作者:1.5kg

(本文来源于图老师网站,更多请访问http://m.tulaoshi.com/cyuyanjiaocheng/)

下载源代码

一、需求
  与标准的 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 !

(本文来源于图老师网站,更多请访问http://m.tulaoshi.com/cyuyanjiaocheng/)
展开更多 50%)
分享

猜你喜欢

打造自定义的 AfxMessageBox

C语言教程 C语言函数
打造自定义的 AfxMessageBox

自定义的TShockwaveflash

编程语言 网络编程
自定义的TShockwaveflash

s8lol主宰符文怎么配

英雄联盟 网络游戏
s8lol主宰符文怎么配

《死侍》自定义键位心得完美自定义键位

电脑网络
《死侍》自定义键位心得完美自定义键位

JSP的自定义标签

Web开发
JSP的自定义标签

lol偷钱流符文搭配推荐

英雄联盟 网络游戏
lol偷钱流符文搭配推荐

PowerPoint借助自定义形状实现填充自定义图片

电脑网络
PowerPoint借助自定义形状实现填充自定义图片

Photoshop巧用自定义形状快速打造图案

PS PS基础
Photoshop巧用自定义形状快速打造图案

lolAD刺客新符文搭配推荐

英雄联盟
lolAD刺客新符文搭配推荐

怎样给串行化类分配版本号(可配置版本模式)

怎样给串行化类分配版本号(可配置版本模式)

Flash新手入门教程:鼠绘一副時尚的时装眼镜

Flash新手入门教程:鼠绘一副時尚的时装眼镜
下拉加载更多内容 ↓