MFC上下浮动与渐入渐出消息提示框实现
消息 实现 mfc 浮动 上下 提示框
2023-09-27 14:28:16 时间
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;
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();
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;
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();
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接口,传入父窗口和待提示信息就可以了。
最近一直在学习 WPF,看着别人做的WPF程序那么漂亮,眼红啊~ 很多漂亮的程序都是无边框的。
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();
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;
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();
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
最近一直在学习 WPF,看着别人做的WPF程序那么漂亮,眼红啊~ 很多漂亮的程序都是无边框的。
相关文章
- Linux IPC实践(5) --System V消息队列(2)
- RabbitMQ消息队列之实现可靠投递的请求-确认机制
- Qt5开发从入门到精通——第四篇五节(消息对话框类)
- phonegap 使用极光推送实现消息推送
- 第三章 中间件,3.1 万亿级数据洪峰下的分布式消息引擎(作者:冯嘉、誓嘉、尘央、牟羽)
- 【VS开发】MFC CListCtrl列表控件的消息响应
- 微信 API 中调用客服消息接口提示错误返回限制
- 用kafka实现消息推送
- 一口气说出 6 种实现延时消息的方案,还有谁不会?!
- 高可用:如何实现消息队列的 HA?
- 消息队列的使用场景
- PowerDotNet平台化软件架构设计与实现系列(09):消息平台
- 分布式开放消息系统(RocketMQ)的原理与实践
- 去除partner页面消息 自动添加关注者的功能
- 基于 SptringBoot 实现实时消息推送,这里有7种解决方案!
- 一文详说Spring Boot集成RabbitMQ,细说消息队列常用5种模式,消息持久化,两种延迟发送的机制以及解决Spring Boot集成RabbitMQ的常见问题
- Linux系统下UDP发送和接收广播消息小样例
- win32开发(自定义消息)
- PHP实现微信公众号发送模板消息详细步骤(零基础)
- 分布式实时消息队列Kafka(五)
- WCF如何克服HTTP传输协议的局限提供对不同消息传输模式的实现
- WCF技术剖析之十八:消息契约(Message Contract)和基于消息契约的序列化
- 【EventBus】事件通信框架 ( 实现几个关键的封装类 | 消息中心 | 订阅注解 | 订阅方法封装 | 订阅对象-方法封装 | 线程模式 )
- 检查Rabbitmq中队列及消息个数,还有清空的方法
- 用websocket实现后台推送消息
- MFC自定义消息
- 浏览器原理 14 # 消息队列和事件循环
- python - 30行代码实现微信机器人自动回复消息
- 轻松搞定RabbitMQ(二)——工作队列之消息分发机制
- OCX控件在IE中无法侦测到键盘消息( MFC ActiveX Control in IE Doesn't Detect Keystrokes)