本文采用另外的API实现渐入渐出效果。
主要API:SetLayeredWindowAttributes。
实现功能:
采用管理器控制消息框每次只显示一个。
消息框独立显示在右下角,不随主窗口放大缩小变化。
鼠标进入消息框区域,渐入渐出效果停止。
1、消息框实现
创建对话框类CMsgTipDlg,设置对话框属性。
Tool Window:true。设置对话框为消息框,任务栏上将没有图标。
Topmost:true。设置对话框置顶。
MsgTipDlg.h。
[cpp]
#pragma once
// CMsgTipDlg dialog
class CMsgTipMng;
class CMsgTipDlg : public CDialog
{
DECLARE_DYNAMIC(CMsgTipDlg)
public:
CMsgTipDlg(CMsgTipMng* pTipMng, const CString& strTipInfo, CWnd* pParent = NULL); // standard constructor
virtual ~CMsgTipDlg();
// Dialog Data
enum { IDD = IDD_MCMSG_DLG };
void ShowMsgWindow();
int GetTipID() const
{
return m_nTipID;
}
protected:
virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV support
virtual BOOL OnInitDialog();
virtual void OnCancel();
virtual void PostNcDestroy();
virtual BOOL PreTranslateMessage(MSG* pMsg);
afx_msg void OnTimer(UINT_PTR nIDEvent);
afx_msg void OnBnClickedOk();
afx_msg void OnBnClickedCancel();
afx_msg void OnMouseMove(UINT nFlags, CPoint point);
DECLARE_MESSAGE_MAP()
private:
void InitDlgPosition();
private:
CMsgTipMng* m_pTipMng;
CString m_strTipInfo;
int m_nTipID;
BYTE m_bAlpha;//淡入淡出透明效果
};
MsgTipDlg.cpp。
[cpp]
// MCMsgTipDlg.cpp : implementation file
//
#include "stdafx.h"
#include "mcmsgtip_demo.h"
#include "MsgTipDlg.h"
#include "MsgTipMng.h"
const UINT_PTR BLAND_IN = 1;
const UINT_PTR DLG_DELAY = 2;
const UINT_PTR BLAND_OUT = 3;
const UINT IN_ELAPSE = 50;
const UINT DELAY_ELAPSE = 5000;
const UINT OUT_ELAPSE = 50;
//淡入淡出跨度
const BYTE BLAND_SPAN = 15;
//淡入淡出最小值
const BYTE BLAND_MIN = 0;
//淡入淡出最大值
const BYTE BLAND_MAX = 255;
//淡入淡出颜色值设置
const COLORREF BLAND_COLOR = 0;
// CMsgTipDlg dialog
IMPLEMENT_DYNAMIC(CMsgTipDlg, CDialog)
CMsgTipDlg::CMsgTipDlg(CMsgTipMng* pTipMng, const CString& strTipInfo, CWnd* pParent)
: CDialog(CMsgTipDlg::IDD, pParent)
, m_pTipMng(pTipMng)
, m_strTipInfo(strTipInfo)
, m_nTipID(0)
, m_bAlpha(0)
{
static int s_nTipID = 0;
++s_nTipID;
m_nTipID = s_nTipID;
}
CMsgTipDlg::~CMsgTipDlg()
{
}
void CMsgTipDlg::DoDataExchange(CDataExchange* pDX)
{
CDialog::DoDataExchange(pDX);
}
BEGIN_MESSAGE_MAP(CMsgTipDlg, CDialog)
ON_WM_TIMER()
ON_WM_MOUSEMOVE()
ON_BN_CLICKED(IDOK, &CMsgTipDlg::OnBnClickedOk)
ON_BN_CLICKED(IDCANCEL, &CMsgTipDlg::OnBnClickedCancel)
END_MESSAGE_MAP()
// CMsgTipDlg message handlers
void CMsgTipDlg::ShowMsgWindow()
{
HWND hActiveHwnd = ::GetActiveWindow();
Create(IDD, GetDesktopWindow());
ShowWindow(SW_HIDE);
ShowWindow(SW_SHOWNOACTIVATE);
if (hActiveHwnd != NULL)
{
::SetActiveWindow(hActiveHwnd);
}
}
BOOL CMsgTipDlg::OnInitDialog()
{
CDialog::OnInitDialog();
// TODO: Add extra initialization here
SetDlgItemText(IDC_TIP_INFO, m_strTipInfo);
InitDlgPosition();
//设置窗口可淡入淡出
ModifyStyleEx(NULL, WS_EX_LAYERED);
//消息渐入渐出效果
SetTimer(BLAND_IN, IN_ELAPSE, NULL);
return TRUE;
}
void CMsgTipDlg::InitDlgPosition()
{
CRect rectInit;
GetWindowRect(&rectInit);
RECT rect;
SystemParametersInfo(SPI_GETWORKAREA, 0, &rect, 0);
int cy = rect.bottom-rect.top;
int cx