MFC上下浮动与渐入渐出消息提示框实现
类似QQ与360软件,消息提示有两种。上下浮动、渐入渐出。
1、上下浮动提示框实现
机制,定时器响应上下浮动消息。
主要API:MoveWindow。
源码如下UpDownTipDlg.h、UpDownTipDlg.cpp。
UpDownTipDlg.h
- /*
- *@brief 上下浮动提示框
- *@date 2012-8-9
- */
- #pragma once
- // CUpDownTipDlg dialog
- class CUpDownTipDlg : public CDialog
- {
- DECLARE_DYNAMIC(CUpDownTipDlg)
- public:
- CUpDownTipDlg(CWnd* pParent = NULL); // standard constructor
- virtual ~CUpDownTipDlg();
- // Dialog Data
- enum { IDD = IDD_MCMSG_DLG };
- void ShowMsgWindow(CWnd* pParent, const CString& strTipInfo);
- protected:
- virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV support
- virtual BOOL OnInitDialog();
- //响应关闭消息,删除对象
- virtual void OnCancel();
- virtual void PostNcDestroy();
- afx_msg void OnTimer(UINT_PTR nIDEvent);
- afx_msg void OnBnClickedOk();
- afx_msg void OnBnClickedCancel();
- DECLARE_MESSAGE_MAP()
- private:
- void InitDlgPosition();
- private:
- CString m_strTipInfo;
- };
UpDownTipDlg.cpp
- // MCMsgTipDlg.cpp : implementation file
- //
- #include "stdafx.h"
- #include "mcmsgtip_demo.h"
- #include "UpDownTipDlg.h"
- const UINT_PTR POP_WINDOW = 1;
- const UINT_PTR DISPLAY_DELAY = 2;
- const UINT_PTR CLOSE_WINDOW = 3;
- const UINT POP_ELAPSE = 1;
- const UINT DELAY_ELAPSE = 5000;
- const UINT CLOSE_ELAPSE = 1;
- //上下浮动跨度
- const UINT FLOAT_SPAN = 2;
- // CUpDownTipDlg dialog
- IMPLEMENT_DYNAMIC(CUpDownTipDlg, CDialog)
- CUpDownTipDlg::CUpDownTipDlg(CWnd* pParent /*=NULL*/)
- : CDialog(CUpDownTipDlg::IDD, pParent)
- , m_strTipInfo(_T(""))
- {
- }
- CUpDownTipDlg::~CUpDownTipDlg()
- {
- }
- void CUpDownTipDlg::DoDataExchange(CDataExchange* pDX)
- {
- CDialog::DoDataExchange(pDX);
- }
- BEGIN_MESSAGE_MAP(CUpDownTipDlg, CDialog)
- ON_WM_TIMER()
- ON_BN_CLICKED(IDOK, &CUpDownTipDlg::OnBnClickedOk)
- ON_BN_CLICKED(IDCANCEL, &CUpDownTipDlg::OnBnClickedCancel)
- END_MESSAGE_MAP()
- // CUpDownTipDlg message handlers
- void CUpDownTipDlg::ShowMsgWindow(CWnd* pParent, const CString& strTipInfo)
- {
- m_strTipInfo = strTipInfo;
- Create(IDD, pParent);
- ShowWindow(SW_SHOW);
- }
- BOOL CUpDownTipDlg::OnInitDialog()
- {
- CDialog::OnInitDialog();
- // TODO: Add extra initialization here
- SetDlgItemText(IDC_TIP_INFO, m_strTipInfo);
- InitDlgPosition();
- //消息弹出效果
- SetTimer(POP_WINDOW, POP_ELAPSE, NULL);
- return TRUE;
- }
- void CUpDownTipDlg::InitDlgPosition()
- {
- CRect rectInit;
- GetWindowRect(&rectInit);
- RECT rect;
- SystemParametersInfo(SPI_GETWORKAREA, 0, &rect, 0);
- int cy = rect.bottom-rect.top;
- int cx = rect.right-rect.left;
- int nx = rect.right - rectInit.Width();
- int ny = cy;
- rectInit.MoveToXY(nx, ny);
- MoveWindow(rectInit);
- }
- void CUpDownTipDlg::OnTimer(UINT_PTR nIDEvent)
- {
- RECT rect;
- SystemParametersInfo(SPI_GETWORKAREA,0,&rect,0);
- int cy = rect.bottom-rect.top;
- int cx = rect.right-rect.left;
- CRect rectTip;
- GetWindowRect(&rectTip);
- switch (nIDEvent)
- {
- case POP_WINDOW:
- {
- if (rectTip.bottom > cy)
- {
- rectTip.MoveToY(rectTip.top - FLOAT_SPAN);
- MoveWindow(rectTip);
- }
- else
- {
- KillTimer(POP_WINDOW);
- SetTimer(DISPLAY_DELAY, DELAY_ELAPSE, NULL);
- }
- break;
- }
- case DISPLAY_DELAY:
- {
- KillTimer(DISPLAY_DELAY);
- SetTimer(CLOSE_WINDOW, CLOSE_ELAPSE, NULL);
- break;
- }
- case CLOSE_WINDOW:
- {
- if (rectTip.top <= cy)
- {
- rectTip.MoveToY(rectTip.top + FLOAT_SPAN);
- MoveWindow(rectTip);
- }
- else
- {
- KillTimer(CLOSE_WINDOW);
- PostMessage(WM_CLOSE);
- }
- break;
- }
- }
- CDialog::OnTimer(nIDEvent);
- }
- void CUpDownTipDlg::OnCancel()
- {
- DestroyWindow();
- }
- void CUpDownTipDlg::PostNcDestroy()
- {
- CDialog::PostNcDestroy();
- //窗口销毁时,删除该对象
- delete this;
- }
- void CUpDownTipDlg::OnBnClickedOk()
- {
- OnOK();
- ::MessageBox(AfxGetMainWnd()->GetSafeHwnd(), _T("提示框的反馈-是"), _T("提示"), MB_OK);
- }
- void CUpDownTipDlg::OnBnClickedCancel()
- {
- OnCancel();
- }
2、渐入渐出提示框实现
机制,定时器响应淡入淡出消息。
主要API:AnimateWindow。
源码如下InOutTipDlg.h、InOutTipDlg.cpp。
InOutTipDlg.h
- /*
- *@brief 淡入淡出提示框
- *@date 2012-8-9
- */
- #pragma once
- // CInOutTipDlg dialog
- class CInOutTipDlg : public CDialog
- {
- DECLARE_DYNAMIC(CInOutTipDlg)
- public:
- CInOutTipDlg(CWnd* pParent = NULL); // standard constructor
- virtual ~CInOutTipDlg();
- // Dialog Data
- enum { IDD = IDD_MCMSG_DLG };
- void ShowMsgWindow(CWnd* pParent, const CString& strTipInfo);
- protected:
- virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV support
- virtual BOOL OnInitDialog();
- //响应关闭消息,删除对象
- virtual void OnCancel();
- virtual void PostNcDestroy();
- afx_msg void OnTimer(UINT_PTR nIDEvent);
- afx_msg void OnBnClickedOk();
- afx_msg void OnBnClickedCancel();
- DECLARE_MESSAGE_MAP()
- private:
- void InitDlgPosition();
- private:
- CString m_strTipInfo;
- };
InOutTipDlg.cpp
- // MCMsgTipDlg.cpp : implementation file
- //
- #include "stdafx.h"
- #include "mcmsgtip_demo.h"
- #include "InOutTipDlg.h"
- const UINT_PTR BLAND_IN = 4;
- const UINT_PTR BLAND_OUT = 5;
- const UINT IN_ELAPSE = 1;
- const UINT OUT_ELAPSE = 5000;
- // CInOutTipDlg dialog
- IMPLEMENT_DYNAMIC(CInOutTipDlg, CDialog)
- CInOutTipDlg::CInOutTipDlg(CWnd* pParent /*=NULL*/)
- : CDialog(CInOutTipDlg::IDD, pParent)
- , m_strTipInfo(_T(""))
- {
- }
- CInOutTipDlg::~CInOutTipDlg()
- {
- }
- void CInOutTipDlg::DoDataExchange(CDataExchange* pDX)
- {
- CDialog::DoDataExchange(pDX);
- }
- BEGIN_MESSAGE_MAP(CInOutTipDlg, CDialog)
- ON_WM_TIMER()
- ON_BN_CLICKED(IDOK, &CInOutTipDlg::OnBnClickedOk)
- ON_BN_CLICKED(IDCANCEL, &CInOutTipDlg::OnBnClickedCancel)
- END_MESSAGE_MAP()
- // CInOutTipDlg message handlers
- void CInOutTipDlg::ShowMsgWindow(CWnd* pParent, const CString& strTipInfo)
- {
- m_strTipInfo = strTipInfo;
- Create(IDD, pParent);
- ShowWindow(SW_HIDE);
- }
- BOOL CInOutTipDlg::OnInitDialog()
- {
- CDialog::OnInitDialog();
- // TODO: Add extra initialization here
- SetDlgItemText(IDC_TIP_INFO, m_strTipInfo);
- InitDlgPosition();
- //消息渐入渐出效果
- SetTimer(BLAND_IN, IN_ELAPSE, NULL);
- return TRUE;
- }
- void CInOutTipDlg::InitDlgPosition()
- {
- CRect rectInit;
- GetWindowRect(&rectInit);
- RECT rect;
- SystemParametersInfo(SPI_GETWORKAREA, 0, &rect, 0);
- int cy = rect.bottom-rect.top;
- int cx = rect.right-rect.left;
- int nx = rect.right - rectInit.Width();
- int ny = cy - rectInit.Height();
- rectInit.MoveToXY(nx, ny);
- MoveWindow(rectInit);
- }
- void CInOutTipDlg::OnTimer(UINT_PTR nIDEvent)
- {
- RECT rect;
- SystemParametersInfo(SPI_GETWORKAREA,0,&rect,0);
- int cy = rect.bottom-rect.top;
- int cx = rect.right-rect.left;
- CRect rectTip;
- GetWindowRect(&rectTip);
- switch (nIDEvent)
- {
- case BLAND_IN:
- {
- KillTimer(BLAND_IN);
- AnimateWindow(1000, AW_BLEND);
- SetTimer(BLAND_OUT, OUT_ELAPSE, NULL);
- break;
- }
- case BLAND_OUT:
- {
- KillTimer(BLAND_OUT);
- AnimateWindow(1000, AW_BLEND|AW_HIDE);
- PostMessage(WM_CLOSE);
- break;
- }
- }
- CDialog::OnTimer(nIDEvent);
- }
- void CInOutTipDlg::OnCancel()
- {
- DestroyWindow();
- }
- void CInOutTipDlg::PostNcDestroy()
- {
- CDialog::PostNcDestroy();
- //窗口销毁时,删除该对象
- delete this;
- }
- void CInOutTipDlg::OnBnClickedOk()
- {
- OnOK();
- ::MessageBox(AfxGetMainWnd()->GetSafeHwnd(), _T("提示框的反馈-是"), _T("提示"), MB_OK);
- }
- void CInOutTipDlg::OnBnClickedCancel()
- {
- OnCancel();
- }
3、两种消息框调用
- void ShowTipWindow(const CString& strTipInfo)
- {
- CButton* pCheckBtn = (CButton*)GetDlgItem(IDC_CHECK_IO);
- if (BST_CHECKED == pCheckBtn->GetCheck())
- {
- //渐入渐出效果弹框
- CInOutTipDlg* pMsgWindow=new CInOutTipDlg();
- pMsgWindow->ShowMsgWindow(this, strTipInfo);
- }
- else
- {
- //上下浮动方式弹框
- CUpDownTipDlg* pMsgWindow=new CUpDownTipDlg();
- pMsgWindow->ShowMsgWindow(this, strTipInfo);
- }
- }
两个消息提示框,都封装了ShowMsgWindow接口,传入父窗口和待提示信息就可以了。
^_^这个调用方式有内存泄露现象,具体实现的时候,可以在对话框销毁时(virtual void PostNcDestroy()),提供一个回调删除接口。
from:http://blog.csdn.net/segen_jaa/article/details/7848598
MFC上下浮动与渐入渐出消息提示框实现的更多相关文章
- Sharepoint 弹出消息提示框 .
在event receiver中如何弹出一个类似winform中messagebox.show 的框? 那我要对用户显示一些错误信息或者提示信息怎么搞? 1. 如果是在ItemAdding或者其他进行 ...
- 用PHP实现弹出消息提示框
方法一: echo "<script>alert('提示内容')</script>"; 方法二: echo '<script language=&qu ...
- bootstrap添加模态窗后,再弹出消息提示框后,原先的滚动条消失
设置需要滚动的模态框 overflow :scroll
- 自定义iOS 中推送消息 提示框
看到标题你可能会觉得奇怪 推送消息提示框不是系统自己弹出来的吗? 为什么还要自己自定义呢? 因为项目需求是这样的:最近需要做 远程推送通知 和一个客服系统 包括店铺客服和官方客服两个模块 如果有新的消 ...
- MFC渐入渐出框实现方式二
类似360消息弹出框,实现方式一见http://blog.csdn.net/segen_jaa/article/details/7848598. 本文采用另外的API实现渐入渐出效果. 主要API:S ...
- 解决Jquery mobile点击较长文本body的时候Header和footer会渐入渐出的问题
在做一个Phonegap+Jqm工程的时候,出现了如题的问题,相信很多人都遇到过Jquerymobile点击body时候header和footer会闪烁的显示和隐藏问题,fixed却并不能真 ...
- NSIS:实现程序窗口逐渐透明的渐入渐出效果
原文NSIS:实现程序窗口逐渐透明的渐入渐出效果 需要修改版的插件(支持timer功能): MUI:InstallOptions.dll MUI2:nsDialogs.dll 以及system插件,( ...
- [Unity3D]Unity3D游戏开发之Logo渐入渐出效果的实现
---------------------------------------------------------------------------------------------------- ...
- js原生实现div渐入渐出
jq对渐入渐出进行封装,简单的使用连个方法就可以实现.fadeIn(),fadeOut();如果我们界面没有使用jq那么原生怎么实现呢? 我们讲解一下,这个原理.当我们要实现渐入的时候,首先是让隐藏的 ...
随机推荐
- javascript 数据结构和算法读书笔记 > 第二章 数组
这章主要讲解了数组的工作原理和其适用场景. 定义: 一个存储元素的线性集合,元素可以通过索引来任意存取,索引通常是数字,用来计算元素之间存储位置的偏移量. javascript数组的特殊之处: jav ...
- ArrayList--卧槽这就是源码
最近在<数据结构与算法分析(java版)>中看到了实现ArrayList的简易代码,亲自做了一下.个中的疑点还是在代码中实现了一下.其中就包括内部类Iterator对外部成员访问的问题. ...
- Matlab.NET混编技巧之——找出Matlab内置函数
原文 http://www.cnblogs.com/asxinyu/p/3295309.html Matlab与.NET的混合编程,掌握了基本过程,加上一定的开发经验和算法基础,肯 定不难.反之,有时 ...
- android PopupWindow显示位置
PopupWindow的显示及位置设置 window.showAtLocation(parent, Gravity.RIGHT | Gravity.BOTTOM, 10,10); 第一个参数指定Pop ...
- ip,子网掩码,网关,DNS
要配置一个局域网通信的计算机(也就是同一个网络): IP地址 子网掩码 要配置一个跨网段通信的计算机: IP地址 子网掩码 网关(路由使用) 要配置一个可上网的计算机: IP地址 子网掩码 网关 DN ...
- CC++初学者编程教程(7) 搭建Windows EclipseCCPP软件开发环境
1根据电脑是32位还是64位来选择工具 2 查看电脑是64位 3 管理员身份运行这个文件 4 安装JDK64位 5. 下一步 6 开始安装 7 安装JAVA 8 安装进行时 9 安装成功 10解压缩 ...
- UVA 10003 Cutting Sticks 切木棍 dp
题意:把一根木棍按给定的n个点切下去,每次切的花费为切的那段木棍的长度,求最小花费. 这题出在dp入门这边,但是我看完题后有强烈的既是感,这不是以前做过的石子合并的题目变形吗? 题目其实就是把n+1根 ...
- CodeForces463C Gargari and Bishops(贪心)
CodeForces463C Gargari and Bishops(贪心) CodeForces463C 题目大意: 在国际象棋的棋盘上放两个主教,这个两个主教不能攻击到同一个格子,最后的得分是这 ...
- SharePoint 2013 设置自己定义布局页
在SharePoint中.我们常常须要自己定义登陆页面.错误页面.拒绝訪问等:不知道大家怎样操作,曾经自己常常在原来页面改或者跳转.事实上SharePoint为我们提供了PowerShell命令,来改 ...
- C++隐式转换
#include <iostream> using namespace std; class A { int a; public: A(int n):a(n) { cout << ...