MFC渐入渐出框实现方式(一)

2014-11-24 11:02:55 · 作者: · 浏览: 0

本文采用另外的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