类似QQ与360软件,消息提示有两种。上下浮动、渐入渐出。

1、上下浮动提示框实现

机制,定时器响应上下浮动消息。

主要API:MoveWindow。

源码如下UpDownTipDlg.h、UpDownTipDlg.cpp。

UpDownTipDlg.h

  1. /*
  2. *@brief 上下浮动提示框
  3. *@date 2012-8-9
  4. */
  5. #pragma once
  6. // CUpDownTipDlg dialog
  7. class CUpDownTipDlg : public CDialog
  8. {
  9. DECLARE_DYNAMIC(CUpDownTipDlg)
  10. public:
  11. CUpDownTipDlg(CWnd* pParent = NULL);   // standard constructor
  12. virtual ~CUpDownTipDlg();
  13. // Dialog Data
  14. enum { IDD = IDD_MCMSG_DLG };
  15. void ShowMsgWindow(CWnd* pParent, const CString& strTipInfo);
  16. protected:
  17. virtual void DoDataExchange(CDataExchange* pDX);    // DDX/DDV support
  18. virtual BOOL OnInitDialog();
  19. //响应关闭消息,删除对象
  20. virtual void OnCancel();
  21. virtual void PostNcDestroy();
  22. afx_msg void OnTimer(UINT_PTR nIDEvent);
  23. afx_msg void OnBnClickedOk();
  24. afx_msg void OnBnClickedCancel();
  25. DECLARE_MESSAGE_MAP()
  26. private:
  27. void InitDlgPosition();
  28. private:
  29. CString m_strTipInfo;
  30. };

UpDownTipDlg.cpp

  1. // MCMsgTipDlg.cpp : implementation file
  2. //
  3. #include "stdafx.h"
  4. #include "mcmsgtip_demo.h"
  5. #include "UpDownTipDlg.h"
  6. const UINT_PTR POP_WINDOW = 1;
  7. const UINT_PTR DISPLAY_DELAY = 2;
  8. const UINT_PTR CLOSE_WINDOW = 3;
  9. const UINT POP_ELAPSE = 1;
  10. const UINT DELAY_ELAPSE = 5000;
  11. const UINT CLOSE_ELAPSE = 1;
  12. //上下浮动跨度
  13. const UINT FLOAT_SPAN = 2;
  14. // CUpDownTipDlg dialog
  15. IMPLEMENT_DYNAMIC(CUpDownTipDlg, CDialog)
  16. CUpDownTipDlg::CUpDownTipDlg(CWnd* pParent /*=NULL*/)
  17. : CDialog(CUpDownTipDlg::IDD, pParent)
  18. , m_strTipInfo(_T(""))
  19. {
  20. }
  21. CUpDownTipDlg::~CUpDownTipDlg()
  22. {
  23. }
  24. void CUpDownTipDlg::DoDataExchange(CDataExchange* pDX)
  25. {
  26. CDialog::DoDataExchange(pDX);
  27. }
  28. BEGIN_MESSAGE_MAP(CUpDownTipDlg, CDialog)
  29. ON_WM_TIMER()
  30. ON_BN_CLICKED(IDOK, &CUpDownTipDlg::OnBnClickedOk)
  31. ON_BN_CLICKED(IDCANCEL, &CUpDownTipDlg::OnBnClickedCancel)
  32. END_MESSAGE_MAP()
  33. // CUpDownTipDlg message handlers
  34. void CUpDownTipDlg::ShowMsgWindow(CWnd* pParent, const CString& strTipInfo)
  35. {
  36. m_strTipInfo = strTipInfo;
  37. Create(IDD, pParent);
  38. ShowWindow(SW_SHOW);
  39. }
  40. BOOL CUpDownTipDlg::OnInitDialog()
  41. {
  42. CDialog::OnInitDialog();
  43. // TODO:  Add extra initialization here
  44. SetDlgItemText(IDC_TIP_INFO, m_strTipInfo);
  45. InitDlgPosition();
  46. //消息弹出效果
  47. SetTimer(POP_WINDOW, POP_ELAPSE, NULL);
  48. return TRUE;
  49. }
  50. void CUpDownTipDlg::InitDlgPosition()
  51. {
  52. CRect rectInit;
  53. GetWindowRect(&rectInit);
  54. RECT rect;
  55. SystemParametersInfo(SPI_GETWORKAREA, 0, &rect, 0);
  56. int cy = rect.bottom-rect.top;
  57. int cx = rect.right-rect.left;
  58. int nx = rect.right - rectInit.Width();
  59. int ny = cy;
  60. rectInit.MoveToXY(nx, ny);
  61. MoveWindow(rectInit);
  62. }
  63. void CUpDownTipDlg::OnTimer(UINT_PTR nIDEvent)
  64. {
  65. RECT rect;
  66. SystemParametersInfo(SPI_GETWORKAREA,0,&rect,0);
  67. int cy = rect.bottom-rect.top;
  68. int cx = rect.right-rect.left;
  69. CRect rectTip;
  70. GetWindowRect(&rectTip);
  71. switch (nIDEvent)
  72. {
  73. case POP_WINDOW:
  74. {
  75. if (rectTip.bottom > cy)
  76. {
  77. rectTip.MoveToY(rectTip.top - FLOAT_SPAN);
  78. MoveWindow(rectTip);
  79. }
  80. else
  81. {
  82. KillTimer(POP_WINDOW);
  83. SetTimer(DISPLAY_DELAY, DELAY_ELAPSE, NULL);
  84. }
  85. break;
  86. }
  87. case DISPLAY_DELAY:
  88. {
  89. KillTimer(DISPLAY_DELAY);
  90. SetTimer(CLOSE_WINDOW, CLOSE_ELAPSE, NULL);
  91. break;
  92. }
  93. case CLOSE_WINDOW:
  94. {
  95. if (rectTip.top <= cy)
  96. {
  97. rectTip.MoveToY(rectTip.top + FLOAT_SPAN);
  98. MoveWindow(rectTip);
  99. }
  100. else
  101. {
  102. KillTimer(CLOSE_WINDOW);
  103. PostMessage(WM_CLOSE);
  104. }
  105. break;
  106. }
  107. }
  108. CDialog::OnTimer(nIDEvent);
  109. }
  110. void CUpDownTipDlg::OnCancel()
  111. {
  112. DestroyWindow();
  113. }
  114. void CUpDownTipDlg::PostNcDestroy()
  115. {
  116. CDialog::PostNcDestroy();
  117. //窗口销毁时,删除该对象
  118. delete this;
  119. }
  120. void CUpDownTipDlg::OnBnClickedOk()
  121. {
  122. OnOK();
  123. ::MessageBox(AfxGetMainWnd()->GetSafeHwnd(), _T("提示框的反馈-是"), _T("提示"), MB_OK);
  124. }
  125. void CUpDownTipDlg::OnBnClickedCancel()
  126. {
  127. OnCancel();
  128. }

2、渐入渐出提示框实现

机制,定时器响应淡入淡出消息。

主要API:AnimateWindow。

源码如下InOutTipDlg.h、InOutTipDlg.cpp。

InOutTipDlg.h

  1. /*
  2. *@brief 淡入淡出提示框
  3. *@date 2012-8-9
  4. */
  5. #pragma once
  6. // CInOutTipDlg dialog
  7. class CInOutTipDlg : public CDialog
  8. {
  9. DECLARE_DYNAMIC(CInOutTipDlg)
  10. public:
  11. CInOutTipDlg(CWnd* pParent = NULL);   // standard constructor
  12. virtual ~CInOutTipDlg();
  13. // Dialog Data
  14. enum { IDD = IDD_MCMSG_DLG };
  15. void ShowMsgWindow(CWnd* pParent, const CString& strTipInfo);
  16. protected:
  17. virtual void DoDataExchange(CDataExchange* pDX);    // DDX/DDV support
  18. virtual BOOL OnInitDialog();
  19. //响应关闭消息,删除对象
  20. virtual void OnCancel();
  21. virtual void PostNcDestroy();
  22. afx_msg void OnTimer(UINT_PTR nIDEvent);
  23. afx_msg void OnBnClickedOk();
  24. afx_msg void OnBnClickedCancel();
  25. DECLARE_MESSAGE_MAP()
  26. private:
  27. void InitDlgPosition();
  28. private:
  29. CString m_strTipInfo;
  30. };

InOutTipDlg.cpp

  1. // MCMsgTipDlg.cpp : implementation file
  2. //
  3. #include "stdafx.h"
  4. #include "mcmsgtip_demo.h"
  5. #include "InOutTipDlg.h"
  6. const UINT_PTR BLAND_IN = 4;
  7. const UINT_PTR BLAND_OUT = 5;
  8. const UINT IN_ELAPSE = 1;
  9. const UINT OUT_ELAPSE = 5000;
  10. // CInOutTipDlg dialog
  11. IMPLEMENT_DYNAMIC(CInOutTipDlg, CDialog)
  12. CInOutTipDlg::CInOutTipDlg(CWnd* pParent /*=NULL*/)
  13. : CDialog(CInOutTipDlg::IDD, pParent)
  14. , m_strTipInfo(_T(""))
  15. {
  16. }
  17. CInOutTipDlg::~CInOutTipDlg()
  18. {
  19. }
  20. void CInOutTipDlg::DoDataExchange(CDataExchange* pDX)
  21. {
  22. CDialog::DoDataExchange(pDX);
  23. }
  24. BEGIN_MESSAGE_MAP(CInOutTipDlg, CDialog)
  25. ON_WM_TIMER()
  26. ON_BN_CLICKED(IDOK, &CInOutTipDlg::OnBnClickedOk)
  27. ON_BN_CLICKED(IDCANCEL, &CInOutTipDlg::OnBnClickedCancel)
  28. END_MESSAGE_MAP()
  29. // CInOutTipDlg message handlers
  30. void CInOutTipDlg::ShowMsgWindow(CWnd* pParent, const CString& strTipInfo)
  31. {
  32. m_strTipInfo = strTipInfo;
  33. Create(IDD, pParent);
  34. ShowWindow(SW_HIDE);
  35. }
  36. BOOL CInOutTipDlg::OnInitDialog()
  37. {
  38. CDialog::OnInitDialog();
  39. // TODO:  Add extra initialization here
  40. SetDlgItemText(IDC_TIP_INFO, m_strTipInfo);
  41. InitDlgPosition();
  42. //消息渐入渐出效果
  43. SetTimer(BLAND_IN, IN_ELAPSE, NULL);
  44. return TRUE;
  45. }
  46. void CInOutTipDlg::InitDlgPosition()
  47. {
  48. CRect rectInit;
  49. GetWindowRect(&rectInit);
  50. RECT rect;
  51. SystemParametersInfo(SPI_GETWORKAREA, 0, &rect, 0);
  52. int cy = rect.bottom-rect.top;
  53. int cx = rect.right-rect.left;
  54. int nx = rect.right - rectInit.Width();
  55. int ny = cy - rectInit.Height();
  56. rectInit.MoveToXY(nx, ny);
  57. MoveWindow(rectInit);
  58. }
  59. void CInOutTipDlg::OnTimer(UINT_PTR nIDEvent)
  60. {
  61. RECT rect;
  62. SystemParametersInfo(SPI_GETWORKAREA,0,&rect,0);
  63. int cy = rect.bottom-rect.top;
  64. int cx = rect.right-rect.left;
  65. CRect rectTip;
  66. GetWindowRect(&rectTip);
  67. switch (nIDEvent)
  68. {
  69. case BLAND_IN:
  70. {
  71. KillTimer(BLAND_IN);
  72. AnimateWindow(1000, AW_BLEND);
  73. SetTimer(BLAND_OUT, OUT_ELAPSE, NULL);
  74. break;
  75. }
  76. case BLAND_OUT:
  77. {
  78. KillTimer(BLAND_OUT);
  79. AnimateWindow(1000, AW_BLEND|AW_HIDE);
  80. PostMessage(WM_CLOSE);
  81. break;
  82. }
  83. }
  84. CDialog::OnTimer(nIDEvent);
  85. }
  86. void CInOutTipDlg::OnCancel()
  87. {
  88. DestroyWindow();
  89. }
  90. void CInOutTipDlg::PostNcDestroy()
  91. {
  92. CDialog::PostNcDestroy();
  93. //窗口销毁时,删除该对象
  94. delete this;
  95. }
  96. void CInOutTipDlg::OnBnClickedOk()
  97. {
  98. OnOK();
  99. ::MessageBox(AfxGetMainWnd()->GetSafeHwnd(), _T("提示框的反馈-是"), _T("提示"), MB_OK);
  100. }
  101. void CInOutTipDlg::OnBnClickedCancel()
  102. {
  103. OnCancel();
  104. }

3、两种消息框调用

  1. void ShowTipWindow(const CString& strTipInfo)
  2. {
  3. CButton* pCheckBtn = (CButton*)GetDlgItem(IDC_CHECK_IO);
  4. if (BST_CHECKED == pCheckBtn->GetCheck())
  5. {
  6. //渐入渐出效果弹框
  7. CInOutTipDlg* pMsgWindow=new CInOutTipDlg();
  8. pMsgWindow->ShowMsgWindow(this, strTipInfo);
  9. }
  10. else
  11. {
  12. //上下浮动方式弹框
  13. CUpDownTipDlg* pMsgWindow=new CUpDownTipDlg();
  14. pMsgWindow->ShowMsgWindow(this, strTipInfo);
  15. }
  16. }

两个消息提示框,都封装了ShowMsgWindow接口,传入父窗口和待提示信息就可以了。

^_^这个调用方式有内存泄露现象,具体实现的时候,可以在对话框销毁时(virtual void PostNcDestroy()),提供一个回调删除接口。

from:http://blog.csdn.net/segen_jaa/article/details/7848598

MFC上下浮动与渐入渐出消息提示框实现的更多相关文章

  1. Sharepoint 弹出消息提示框 .

    在event receiver中如何弹出一个类似winform中messagebox.show 的框? 那我要对用户显示一些错误信息或者提示信息怎么搞? 1. 如果是在ItemAdding或者其他进行 ...

  2. 用PHP实现弹出消息提示框

    方法一: echo "<script>alert('提示内容')</script>"; 方法二: echo '<script language=&qu ...

  3. bootstrap添加模态窗后,再弹出消息提示框后,原先的滚动条消失

    设置需要滚动的模态框 overflow :scroll

  4. 自定义iOS 中推送消息 提示框

    看到标题你可能会觉得奇怪 推送消息提示框不是系统自己弹出来的吗? 为什么还要自己自定义呢? 因为项目需求是这样的:最近需要做 远程推送通知 和一个客服系统 包括店铺客服和官方客服两个模块 如果有新的消 ...

  5. MFC渐入渐出框实现方式二

    类似360消息弹出框,实现方式一见http://blog.csdn.net/segen_jaa/article/details/7848598. 本文采用另外的API实现渐入渐出效果. 主要API:S ...

  6. 解决Jquery mobile点击较长文本body的时候Header和footer会渐入渐出的问题

         在做一个Phonegap+Jqm工程的时候,出现了如题的问题,相信很多人都遇到过Jquerymobile点击body时候header和footer会闪烁的显示和隐藏问题,fixed却并不能真 ...

  7. NSIS:实现程序窗口逐渐透明的渐入渐出效果

    原文NSIS:实现程序窗口逐渐透明的渐入渐出效果 需要修改版的插件(支持timer功能): MUI:InstallOptions.dll MUI2:nsDialogs.dll 以及system插件,( ...

  8. [Unity3D]Unity3D游戏开发之Logo渐入渐出效果的实现

    ---------------------------------------------------------------------------------------------------- ...

  9. js原生实现div渐入渐出

    jq对渐入渐出进行封装,简单的使用连个方法就可以实现.fadeIn(),fadeOut();如果我们界面没有使用jq那么原生怎么实现呢? 我们讲解一下,这个原理.当我们要实现渐入的时候,首先是让隐藏的 ...

随机推荐

  1. 在win8.1下安装laravel5.1时碰到的坑不少,但总算搞掂,真有点不容易。

    安装好php后,安装laravel的方法有如下几种. 1.先安装好composer, 再用composer下载资源并安装,命令如下: composer create-project laravel/l ...

  2. 使用Idea编写javaweb以及maven

    使用Idea编写javaweb以及maven 今天总结的第一点是在windows下使用idea编写jsp并且使用tomcat部署:第二点是新建maven项目,之前一直是听说也没有自己实践过,今天就大概 ...

  3. Oracle EBS-SQL (BOM-12):BOM清单查询

    select     msi.segment1                    装配件编码    ,msi.description                  装配件描述    ,msi. ...

  4. AppClassLoader和WebAppClasssLoader的坑

    最近,打算学习一下spring mvc,为后续做一些积累. 搭建spring+mybatis,动态创建mapper,mapper的文件名称和类在一个目录,但是我之前犯个 错误,大小写写错了,结果我用普 ...

  5. 快速开启Safari的私密浏览(快捷键创建)

    正常使用Safari浏览器,都会保存你的浏览记录.搜索记录,包括你的浏览习惯,经常去哪些网站等等.这样的好处是可以帮助你更快速的进入自己需要的网站,节约很多时间. 但有些情况下,你还是会偏向于选择私密 ...

  6. 重启VirtualBox里面的系统提示VT-x features locked or unavailable in MSR错误

    有次不小心设置了一下virtualbox里面的一些配置,然后启动系统时出现了如下提示 在网上找了一些资料尝试了一些方法偶然有一次成功 原来是自己把那个cpu个数设置成了2,改成1就好了,不知道为什么做 ...

  7. 关于“找不到附属汇编 Microsoft.VC90.CRT,上一个错误是 参照的汇编没有安装在系统上。”的解决

    关于“找不到附属汇编 Microsoft.VC90.CRT,上一个错误是 参照的汇编没有安装在系统上.”的解决 一个项目需要在Win系统用计划任务执行PHP,写了个批处理bat利用php-cgi.ex ...

  8. Android消息推送的服务端

    2.Android消息推送 MQTT服务器采用mosquito  http://mosquitto.org/ PHP管理包采用phpmqttclient:https://github.com/toku ...

  9. php获取服务器地址

    if ( isset( $_SERVER['HTTP_X_FORWARDED_HOST'] ) ) { // Support ProxyPass        $t_hosts = explode( ...

  10. 2014ACM/ICPC亚洲区广州站 Song Jiang's rank list

    欢迎参加——每周六晚的BestCoder(有米!) Song Jiang's rank list Time Limit: 2000/1000 MS (Java/Others)    Memory Li ...