Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1608652
  • 博文数量: 585
  • 博客积分: 14610
  • 博客等级: 上将
  • 技术积分: 7402
  • 用 户 组: 普通用户
  • 注册时间: 2008-05-15 10:52
文章存档

2013年(5)

2012年(214)

2011年(56)

2010年(66)

2009年(44)

2008年(200)

分类: C/C++

2012-01-27 02:31:00

 用CDialog实现的消息框MessageBoxST类
分类: 2.1 VC++/MFC 177人阅读 评论(0) 收藏 举报

我们知道在VC中可以用AfxMessageBox或者更灵活的MessageBox来实现消息框,但是有时候我们的要求不止于此,特别是在Vista和Windows 7下消息框的样式不好看,下面还有一个白栏。自己写了一个派生自CDialog的MessageBoxST类,模拟了消息框的实现,虽然不是特别完美,但基本功能已经实现,界面如下:

以上是用SkinSharp换肤 后的效果比较,下面介绍这个类的使用方法:
步骤一:新建一个基于对话框的工程,名字任意;
步骤二:插入一个对话框资源,更改其ID号为IDD_MESSAGE_DIALOG ;
步骤三:把MessageBoxST类添加进工程,在需要调用的地方添加头文件。例如:在对话框添加一个按钮,令其功能为弹出消息。添加头文件如下:

#include "MessageBoxST.h"

然后在功能函数里面,添加以下代码,包括MessageBoxST类,和原本的消息类做比较:

  1. void CMyMessageBoxDlg::OnBnClickedButton1()  
  2. {  
  3.     // TODO: 在此添加控件通知处理程序代码  
  4.     CMessageBoxST aBox;  
  5.     aBox.SetMessageBoxDialog(_T("这是一个消息框,用CDialog实现的。"),_T("标题栏1"),MB_ICONINFORMATION,MB_YESNOCANCEL);  
  6.     if (aBox.DoModal()==IDOK)  
  7.     {  
  8.         if (aBox.GetMessageBoxValue()==IDOK)  
  9.             AfxMessageBox(_T("确定按钮"));  
  10.         else if (aBox.GetMessageBoxValue()==IDNO)  
  11.             AfxMessageBox(_T("否按钮"));  
  12.         else if (aBox.GetMessageBoxValue()==IDYES)  
  13.             AfxMessageBox(_T("是按钮"));  
  14.         else if (aBox.GetMessageBoxValue()==IDCANCEL)  
  15.             AfxMessageBox(_T("取消按钮"));  
  16.     }  
  17. }  
  18. void CMyMessageBoxDlg::OnBnClickedButton2()  
  19. {  
  20.     // TODO: 在此添加控件通知处理程序代码  
  21.     MessageBox(_T("这是一个消息框,用MessageBox实现的。"),_T("标题栏2"),MB_ICONINFORMATION|MB_YESNOCANCEL);  
  22. }  

 

自定义MessageBoxST类 
说明:①这个类只有两个函数,大家可以自行添加功能;
         ②这个类对中文支持比较好,有错误的话,请大家帮忙指出,指点一下。

MessageBoxST.h文件

  1. /********************************************************** 
  2. *       制作:无幻 
  3. *       用途:消息框的实现 
  4. *       日期:2009年12月26日 
  5. *       链接:http://blog.csdn.net/akof1314 
  6. ***********************************************************/  
  7. #pragma once  
  8. #define   ID_BUTTON_YES   6000     
  9. #define   ID_BUTTON_OK   6001  
  10. #define   ID_BUTTON_NO   6002  
  11. #define   ID_BUTTON_CANCEL   6003  
  12.   
  13. // CMessageBoxST 对话框  
  14.   
  15. class CMessageBoxST : public CDialog  
  16. {  
  17.     DECLARE_DYNAMIC(CMessageBoxST)  
  18.   
  19. public:  
  20.     CMessageBoxST(CWnd* pParent = NULL);   // 标准构造函数  
  21.     virtual ~CMessageBoxST();  
  22.     void SetMessageBoxDialog(CString Text,CString Title=_T(""),UINT IDI_SET=MB_ICONWARNING,UINT ID_SETBUTTON=MB_OK);   //设定消息框格式  
  23.     INT_PTR GetMessageBoxValue();     //返回消息框的值  
  24. // 对话框数据  
  25.     enum { IDD = IDD_MESSAGE_DIALOG };                   //绑定对话框资源,根据需要修改  
  26.   
  27. protected:  
  28.     virtual void DoDataExchange(CDataExchange* pDX);    // DDX/DDV 支持  
  29.     virtual BOOL OnInitDialog();  
  30.     CString aTitle;  
  31.     CString aText;  
  32.     CStatic myStatic;  
  33.     CStatic icoStatic;  
  34.     LPCTSTR IDI_BACK;  //图标格式  
  35.     CFont font;   
  36.     INT_PTR ID_BACK;    //返回值  
  37.     UINT ID_BUTTON;  
  38.     CButton myButton1;  
  39.     CButton myButton2;  
  40.     CButton myButton3;    
  41.     DECLARE_MESSAGE_MAP()  
  42. public:  
  43.     afx_msg void OnBnClickedOk();  
  44.     afx_msg void OnBnClickedButton1();  
  45.     afx_msg void OnBnClickedButton2();  
  46.     afx_msg void OnBnClickedButton3();  
  47.     afx_msg void OnBnClickedButton4();  
  48. };  

MessageBoxST.cpp文件

  1. /********************************************************** 
  2. *       制作:无幻 
  3. *       用途:消息框的实现 
  4. *       日期:2009年12月26日 
  5. *       链接:http://blog.csdn.net/akof1314 
  6. ***********************************************************/  
  7. // MessageBoxST.cpp : 实现文件  
  8. //  
  9.   
  10. #include "stdafx.h"  
  11. #include "MyMessageBox.h"    //这里要根据工程名修改  
  12. #include "MessageBoxST.h"  
  13.   
  14.   
  15. // CMessageBoxST 对话框  
  16.   
  17. IMPLEMENT_DYNAMIC(CMessageBoxST, CDialog)  
  18.   
  19. CMessageBoxST::CMessageBoxST(CWnd* pParent /*=NULL*/)  
  20.     : CDialog(CMessageBoxST::IDD, pParent)  
  21. {  
  22.   
  23. }  
  24.   
  25. CMessageBoxST::~CMessageBoxST()  
  26. {  
  27. }  
  28.   
  29. void CMessageBoxST::DoDataExchange(CDataExchange* pDX)  
  30. {  
  31.     CDialog::DoDataExchange(pDX);  
  32. }  
  33.   
  34.   
  35. BEGIN_MESSAGE_MAP(CMessageBoxST, CDialog)  
  36.     ON_BN_CLICKED(IDOK, OnBnClickedOk)  
  37.     ON_BN_CLICKED(ID_BUTTON_YES, OnBnClickedButton1)  
  38.     ON_BN_CLICKED(ID_BUTTON_OK, OnBnClickedButton2)  
  39.     ON_BN_CLICKED(ID_BUTTON_NO, OnBnClickedButton3)  
  40.     ON_BN_CLICKED(ID_BUTTON_CANCEL, OnBnClickedButton4)  
  41. END_MESSAGE_MAP()  
  42.   
  43.   
  44. // CMessageBoxST 消息处理程序  
  45.   
  46. void CMessageBoxST::OnBnClickedOk()  
  47. {  
  48.     // TODO: 在此添加控件通知处理程序代码  
  49.     //OnOK();  
  50. }  
  51. void CMessageBoxST::SetMessageBoxDialog(CString Text,CString Title,UINT IDI_SET,UINT ID_SETBUTTON)  
  52. {  
  53.     if (Title=="")  
  54.         AfxGetMainWnd()->GetWindowText(aTitle);  
  55.     else  
  56.         aTitle=Title;  
  57.     aText=Text;  
  58.     switch(IDI_SET)  
  59.     {  
  60.     case MB_ICONWARNING:      
  61.         IDI_BACK=IDI_WARNING;break;  
  62.     case MB_ICONQUESTION:  
  63.         IDI_BACK=IDI_QUESTION;break;  
  64.     case MB_ICONERROR:    
  65.         IDI_BACK=IDI_ERROR;break;  
  66.     case MB_ICONINFORMATION:      
  67.         IDI_BACK=IDI_INFORMATION;break;  
  68.     }  
  69.     ID_BUTTON=ID_SETBUTTON;  
  70.       
  71. }  
  72. BOOL CMessageBoxST::OnInitDialog()  
  73. {  
  74.     CDialog::OnInitDialog();  
  75.     int i,high,sum=aText.GetLength();  
  76. #ifdef _UNICODE  
  77.     for (i=0,sum=0;i
  78.     {  
  79.         if (aText[i]<=0x80 && aText[i]>=0)  
  80.             sum++;  
  81.         else  
  82.             sum+=2;  
  83.     }  
  84. #endif  
  85.     high=sum/52;  
  86.     if (high<2)  
  87.         high=0;  
  88.     if(sum*4>220)  
  89.     {  
  90.         sum=85*4;i=sum;  
  91.     }  
  92.     else  
  93.     {  
  94.         i=sum*6;  
  95.         sum*=8;  
  96.     }  
  97.     int length=aText.GetLength();     
  98.     int sumLength=95+i+45;  
  99.     switch(ID_BUTTON)  
  100.     {  
  101.     case MB_YESNOCANCEL:  
  102.         if (sumLength<294)  
  103.             sumLength=294+44;  
  104.             break;  
  105.     case MB_YESNO:  
  106.         if (sumLength<195)  
  107.             sumLength=195+44;  
  108.             break;  
  109.     case MB_OKCANCEL:  
  110.         if (sumLength<195)  
  111.             sumLength=195+44;  
  112.         break;  
  113.     case MB_OK:  
  114.         if (sumLength<96)  
  115.             sumLength=96+44;  
  116.         break;  
  117.     }  
  118.     SetWindowPos(NULL,0,0,sumLength,170+high*15,SWP_NOMOVE);  
  119.       
  120.     VERIFY(font.CreateFont( 12,0,0, 0,FW_NORMAL,  FALSE, FALSE, 0, ANSI_CHARSET, OUT_DEFAULT_PRECIS,  CLIP_DEFAULT_PRECIS, DEFAULT_QUALITY, DEFAULT_PITCH | FF_SWISS,  _T("宋体")));   
  121.     CRect aRect;  
  122.     this->SetWindowText(aTitle);  
  123.     this->GetClientRect(&aRect);  
  124.     switch(ID_BUTTON)  
  125.     {  
  126.     case MB_YESNOCANCEL:  
  127.         myButton1.Create(_T("是"), WS_CHILD|WS_VISIBLE|BS_PUSHBUTTON,    CRect(aRect.right-11-11-88-88-11-88,aRect.bottom-8-25,aRect.right-11-88-88-11-11,aRect.bottom-8), this, ID_BUTTON_YES);myButton1.SetFont(&font);  
  128.         myButton2.Create(_T("否"), WS_CHILD|WS_VISIBLE|BS_PUSHBUTTON,    CRect(aRect.right-11-88-11-88,aRect.bottom-8-25,aRect.right-11-88-11,aRect.bottom-8), this, ID_BUTTON_NO);myButton2.SetFont(&font);  
  129.         myButton3.Create(_T("取消"), WS_CHILD|WS_VISIBLE|BS_PUSHBUTTON,     CRect(aRect.right-11-88,aRect.bottom-8-25,aRect.right-11,aRect.bottom-8), this, ID_BUTTON_CANCEL);myButton3.SetFont(&font);  
  130.         break;  
  131.     case MB_YESNO:  
  132.         myButton1.Create(_T("是"), WS_CHILD|WS_VISIBLE|BS_PUSHBUTTON,    CRect(aRect.right-11-88-11-88,aRect.bottom-8-25,aRect.right-11-88-11,aRect.bottom-8), this, ID_BUTTON_YES);myButton1.SetFont(&font);  
  133.         myButton2.Create(_T("否"), WS_CHILD|WS_VISIBLE|BS_PUSHBUTTON,     CRect(aRect.right-11-88,aRect.bottom-8-25,aRect.right-11,aRect.bottom-8), this, ID_BUTTON_NO);myButton2.SetFont(&font);  
  134.         break;  
  135.     case MB_OKCANCEL:  
  136.         myButton1.Create(_T("确定"), WS_CHILD|WS_VISIBLE|BS_PUSHBUTTON,    CRect(aRect.right-11-88-11-88,aRect.bottom-8-25,aRect.right-11-88-11,aRect.bottom-8), this, ID_BUTTON_OK);myButton1.SetFont(&font);  
  137.         myButton2.Create(_T("取消"), WS_CHILD|WS_VISIBLE|BS_PUSHBUTTON,    CRect(aRect.right-11-88,aRect.bottom-8-25,aRect.right-11,aRect.bottom-8), this, ID_BUTTON_CANCEL);myButton2.SetFont(&font);  
  138.         break;  
  139.     case MB_OK:  
  140.         myButton1.Create(_T("确定"), WS_CHILD|WS_VISIBLE|BS_PUSHBUTTON,    CRect(aRect.right-11-88,aRect.bottom-8-25,aRect.right-11,aRect.bottom-8), this, ID_BUTTON_OK);myButton1.SetFont(&font);  
  141.         break;  
  142.     }  
  143.     myButton1.SetFocus();  
  144.       
  145.     icoStatic.Create(_T("ico"), WS_CHILD|WS_VISIBLE|SS_ICON|SS_CENTER, CRect(45,45,50,50),this);  
  146.     if (icoStatic.GetIcon() == NULL)  
  147.        icoStatic.SetIcon(::LoadIcon(NULL, IDI_BACK));         
  148.                  
  149.     myStatic.Create(aText, WS_CHILD|WS_VISIBLE|SS_LEFT, CRect(95,55,95+sum,95+high*15), this);   //每个字占两位,再乘以字数  
  150.     myStatic.SetFont(&font);          
  151.     return true;  
  152. }  
  153. void CMessageBoxST::OnBnClickedButton1()  
  154. {     
  155.     ID_BACK=IDYES;  
  156.     OnOK();  
  157. }  
  158. void CMessageBoxST::OnBnClickedButton2()  
  159. {     
  160.     ID_BACK=IDOK;  
  161.     OnOK();  
  162. }  
  163. void CMessageBoxST::OnBnClickedButton3()  
  164. {     
  165.     ID_BACK=IDNO;  
  166.     OnOK();  
  167. }  
  168. void CMessageBoxST::OnBnClickedButton4()  
  169. {     
  170.     ID_BACK=IDCANCEL;  
  171.     OnOK();  
  172. }  
  173. INT_PTR CMessageBoxST::GetMessageBoxValue()  
  174. {  
  175.     return ID_BACK;  
  176. }  

特别声明 :代码中有注释的,要依据工程而修改,主要是文件头和对话框资源ID。
例子下载 

阅读(669) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~