打造自定义的 AfxMessageBox

2016-01-29 12:26 49 1 收藏

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

【 tulaoshi.com - C语言心得技巧 】

打造自定义的 AfxMessageBox

作者:1.5kg

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

下载源代码

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

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

来源:https://www.tulaoshi.com/n/20160129/1486089.html

延伸阅读
标签: Delphi
  如果你要播放基本的系统声音,则要用适当的参数调用MessageBeep。如果你要用扬声器发声,就调用MessageBeep(-1);。 要播放一个WAV声音,你可以使用对象TmediaPlayer,但如果你要快速播放,最简单的方法是调用API函数sndPlaySound(在mmsystem单元中声明)。 例如:          &nb...
iPhone自定义铃声教程   下面的方法非常的麻烦,如果大家想要简单点的话,可以直接通过电脑版PP助手的影音图铃模块下载铃声,设置即可。 iPhone自定义铃声修改教程: 1、在iTunes音乐列表(新版www.Tulaoshi.comiTunes请使用快捷键Ctrl+S,打开左侧的边栏)中选中自己想作为铃声的歌曲,点击右键,选择显示简介;进入选项,其中...
标签: 办公软件
在Word中快速设置文字或段落的格式有两种方法,一种是用格式刷,另一种是套用样式,采用样式的方法效率更高,修改更方便。样式分为内置样式和自定义样式,内置样式是Word本身所提供的样式,自定义样式是用户将常用的格式定义为样式。 1.内置样式的用法 在某一段或某几段中应用样式,单击此段落(或选中多段落),...
标签: Java JAVA基础
一、前言 (本文译自Orion官方站点) 本文将一步一步介绍在Orion Application Server下定义自己的标签,然后,实现该标签的功能,最后用一个jsp例子测试。 二、建立标签,实现该标签的功能。 1.命名package为:com.acme.mytags(为了和原文相同,我不做改动) package com.acme.mytags; 2.import相关class import javax.servlet.jsp.*...
标签: word
Word的自定义词典是什么?怎么编辑自定义词典 Word的自定义词典:标准词典中没有但作者又希望拼写检查能够作为正确单词接受的单词的列表。 编辑自定义词典 Word中内置的词典不能被编辑,只能在自定义词典中添加或编辑单词。以Word2010软件为例介绍编辑自定义词典单词列表的方法: 第1步,打开Word2010文档窗口,依次单...

经验教程

624

收藏

70
微博分享 QQ分享 QQ空间 手机页面 收藏网站 回到头部