?? faderwnd.cpp
字號:
// FaderWnd.cpp : implementation file
//CFaderWnd類為透明窗口的接口類,其實現的原理是:
//先從要實現透明的窗口得到窗口類指針,作為參數傳給CFaderWnd類
//CFaderWnd類得到窗口指針類后,創建一個和得到的窗口指針類很相似的窗口
//創建的窗口類中必須指定WS_EX_LAYERED(0x00080000)和WS_EX_TOPMOST樣式
//通過WS_EX_TOPMOST樣式的設置,將當前創建的窗口作為分層窗口的上層窗口
//在創建結構體中CFaderWnd()內置一個時間器
//通過調用UpdateLayeredWindow()函數更新分層窗口的透過度
//通過時間器的作用,每隔一定的時間就將透明度降低,漸漸的趨向透明,實現窗口的漸隱功能
//當設置的時間完了后,上層窗口已經透明,這個時候就將下層窗口(也就是要實現漸隱的窗口)關閉或隱藏起來
//調用方法:
//主框架為基礎的窗口實現方法:
//new CFaderWnd(this);
//ShowWindow(WS_HIDE);
//一般的文檔類的窗口(如CAboutDlg類)實現方法:
//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類指針的作用是將要實現漸隱的窗口于當前的類聯系起來
{
//檢查對象的合法性,只有在調試版本中有用,發行版本中沒有用
ASSERT(pWndToFader);
ASSERT_VALID(pWndToFader);
//得到合法的ALPHA值或調用缺省的值
if(ALPHA<5) return;
//加載UpdateLayeredWindow()函數從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()函數不存在!!");
delete this ;
}
}
else
{
//創建分層窗口
CPoint point(0,0);//初始話點對象
SIZE size;
CRect pWndToFaderRect;
//得到對象窗口的矩形區域
m_pWndToFader->GetWindowRect(&pWndToFaderRect);
//得到窗口的對象屬性
size.cx=pWndToFaderRect.Width();
size.cy=pWndToFaderRect.Height();
point=pWndToFaderRect.TopLeft();
//創建分層窗口的上層窗口
//樣式WS_EX_LAYERED必要要,是為了為UpdateLayeredWindow()函數的調用
//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);
//創建BLENDFUNCTION結構體為UpdateLayeredWindow()所用
m_Blend.BlendOp=AC_SRC_OVER; //唯一保留標志
m_Blend.BlendFlags=0;
m_Blend.SourceConstantAlpha=ALPHA; //定義初始時候的透明度
m_Blend.AlphaFormat=0;
//設計初始時候的分層窗口的透明度
m_lpfunUpdateLayeredWnd(GetSafeHwnd(),NULL,NULL,&size,::GetDC(m_pWndToFader->GetSafeHwnd()),&point,0,&m_Blend, 0x00000002);
//設置漸隱窗口的時間器
UINT nFaderTimeUnit=nFaderTime/(ALPHA/5);//定義單位時間間隔
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)
{
//若是窗口的漸隱時間器的話
if(m_Blend.SourceConstantAlpha>=5)
{
//透明度必須大于或等于5,否則的話透明度減少到負數時又從默認的值開始,達不到透明的效果
m_Blend.SourceConstantAlpha-=5; //逐漸減少透明度,漸漸趨向透明
//更新分層窗口的透明程度
m_lpfunUpdateLayeredWnd(GetSafeHwnd(),NULL,NULL,NULL,NULL,NULL,NULL,&m_Blend, 0x00000002);
}
else
{
KillTimer(FaderWndTimer);//銷毀窗口時間器
DestroyWindow();//銷毀窗口
}
}
// CWnd::OnTimer(nIDEvent);
}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -