?? faderwnd.cpp
字號(hào):
// FaderWnd.cpp : implementation file
//CFaderWnd類為透明窗口的接口類,其實(shí)現(xiàn)的原理是:
//先從要實(shí)現(xiàn)透明的窗口得到窗口類指針,作為參數(shù)傳給CFaderWnd類
//CFaderWnd類得到窗口指針類后,創(chuàng)建一個(gè)和得到的窗口指針類很相似的窗口
//創(chuàng)建的窗口類中必須指定WS_EX_LAYERED(0x00080000)和WS_EX_TOPMOST樣式
//通過(guò)WS_EX_TOPMOST樣式的設(shè)置,將當(dāng)前創(chuàng)建的窗口作為分層窗口的上層窗口
//在創(chuàng)建結(jié)構(gòu)體中CFaderWnd()內(nèi)置一個(gè)時(shí)間器
//通過(guò)調(diào)用UpdateLayeredWindow()函數(shù)更新分層窗口的透過(guò)度
//通過(guò)時(shí)間器的作用,每隔一定的時(shí)間就將透明度降低,漸漸的趨向透明,實(shí)現(xiàn)窗口的漸隱功能
//當(dāng)設(shè)置的時(shí)間完了后,上層窗口已經(jīng)透明,這個(gè)時(shí)候就將下層窗口(也就是要實(shí)現(xiàn)漸隱的窗口)關(guān)閉或隱藏起來(lái)
//調(diào)用方法:
//主框架為基礎(chǔ)的窗口實(shí)現(xiàn)方法:
//new CFaderWnd(this);
//ShowWindow(WS_HIDE);
//一般的文檔類的窗口(如CAboutDlg類)實(shí)現(xiàn)方法:
//new CFaderWnd(this);
//EndDialog(ID);
#include "stdafx.h"
//#include "FaderWndTest.h"
#include "FaderWnd.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
#define FaderWndTimer 0
/////////////////////////////////////////////////////////////////////////////
// CFaderWnd
CFaderWnd::CFaderWnd(CWnd*pWndToFader/*=NULL*/,UINT nFaderTime/*=2000*/,BYTE ALPHA/*=255*/)
:m_pWndToFader(pWndToFader)//m_pWndtoFader類指針的作用是將要實(shí)現(xiàn)漸隱的窗口于當(dāng)前的類聯(lián)系起來(lái)
{
//檢查對(duì)象的合法性,只有在調(diào)試版本中有用,發(fā)行版本中沒(méi)有用
ASSERT(pWndToFader);
ASSERT_VALID(pWndToFader);
//得到合法的ALPHA值或調(diào)用缺省的值
if(ALPHA<5) return;
//加載UpdateLayeredWindow()函數(shù)從user32.dll
HMODULE m_hInstUser32=GetModuleHandle("user32.dll");
m_lpfunUpdateLayeredWnd=(lpUpdateLayeredWindow)GetProcAddress(m_hInstUser32,"UpdateLayeredWindow");
if(m_hInstUser32==NULL)
{
if(m_lpfunUpdateLayeredWnd==NULL)
{
AfxMessageBox("不能加載user32.dll或UpdateLayeredWindow()函數(shù)不存在!!");
delete this ;
}
}
else
{
//創(chuàng)建分層窗口
CPoint point(0,0);//初始話點(diǎn)對(duì)象
SIZE size;
CRect pWndToFaderRect;
//得到對(duì)象窗口的矩形區(qū)域
m_pWndToFader->GetWindowRect(&pWndToFaderRect);
//得到窗口的對(duì)象屬性
size.cx=pWndToFaderRect.Width();
size.cy=pWndToFaderRect.Height();
point=pWndToFaderRect.TopLeft();
//創(chuàng)建分層窗口的上層窗口
//樣式WS_EX_LAYERED必要要,是為了為UpdateLayeredWindow()函數(shù)的調(diào)用
//WS_EX_TRANSPARENT allows mouse clicks through to the window "underneath",
CreateEx(WS_EX_LAYERED|WS_EX_TOOLWINDOW|WS_EX_TOPMOST|WS_EX_TRANSPARENT,
"STATIC","",WS_VISIBLE|WS_POPUP,pWndToFaderRect,AfxGetMainWnd(),0);
//創(chuàng)建BLENDFUNCTION結(jié)構(gòu)體為UpdateLayeredWindow()所用
m_Blend.BlendOp=AC_SRC_OVER; //唯一保留標(biāo)志
m_Blend.BlendFlags=0;
m_Blend.SourceConstantAlpha=ALPHA; //定義初始時(shí)候的透明度
m_Blend.AlphaFormat=0;
//設(shè)計(jì)初始時(shí)候的分層窗口的透明度
m_lpfunUpdateLayeredWnd(GetSafeHwnd(),NULL,NULL,&size,::GetDC(m_pWndToFader->GetSafeHwnd()),&point,0,&m_Blend, 0x00000002);
//設(shè)置漸隱窗口的時(shí)間器
UINT nFaderTimeUnit=nFaderTime/(ALPHA/5);//定義單位時(shí)間間隔
SetTimer(FaderWndTimer,nFaderTimeUnit,NULL);
}
}
CFaderWnd::~CFaderWnd()
{
}
BEGIN_MESSAGE_MAP(CFaderWnd, CWnd)
//{{AFX_MSG_MAP(CFaderWnd)
ON_WM_TIMER()
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
// CFaderWnd message handlers
void CFaderWnd::OnTimer(UINT nIDEvent)
{
// TODO: Add your message handler code here and/or call default
if(nIDEvent== FaderWndTimer)
{
//若是窗口的漸隱時(shí)間器的話
if(m_Blend.SourceConstantAlpha>=5)
{
//透明度必須大于或等于5,否則的話透明度減少到負(fù)數(shù)時(shí)又從默認(rèn)的值開始,達(dá)不到透明的效果
m_Blend.SourceConstantAlpha-=5; //逐漸減少透明度,漸漸趨向透明
//更新分層窗口的透明程度
m_lpfunUpdateLayeredWnd(GetSafeHwnd(),NULL,NULL,NULL,NULL,NULL,NULL,&m_Blend, 0x00000002);
}
else
{
KillTimer(FaderWndTimer);//銷毀窗口時(shí)間器
DestroyWindow();//銷毀窗口
}
}
// CWnd::OnTimer(nIDEvent);
}
?? 快捷鍵說(shuō)明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號(hào)
Ctrl + =
減小字號(hào)
Ctrl + -