DoMessageBox 使用DoMessageBox 自定义 AfxMessageBox

一、需求 

  与标准的   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_USERDEFINE   0x10000000 

你的   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(); 

 

 

此外,修改AfxMessageBox的标题也可以利用DoMessageBox函数,重写COwnAfxMessageBoxApp::DoMessageBox函数,代码如下:

int COwnAfxMessageBoxApp::DoMessageBox(LPCTSTR lpszPrompt, UINT nType, UINT nIDPrompt) 
{
          LPCTSTR pOldAppName = m_pszAppName;
          m_pszAppName = "新标题";// 其实afxmessgebox的标题就是这个变量决定的
           int iRet = CWinApp::DoMessageBox(lpszPrompt, nType, nIDPrompt);
           m_pszAppName = pOldAppName ;
            return iRet ;
}

 

你可能感兴趣的:(DoMessageBox 使用DoMessageBox 自定义 AfxMessageBox)