如果composition未打開,我們用GDI函數(shù)繪制文本:
else
{
const UINT uFormat = DT_SINGLELINE|DT_CENTER|DT_VCENTER|DT_NOPREFIX;
//設(shè)置好DC
dc.SetTextColor ( RGB(255,255,255) );
dc.SelectFont ( m_font );
dc.SetBkMode ( TRANSPARENT );
//繪制文本
dc.DrawText ( szTime, -1, rcText, uFormat );
}
return true; //我們繪制了整個(gè)背景
}
為演示發(fā)光效果,下面是同一背景上的一段文本,但沒有發(fā)光效果:
處理composition相關(guān)的通知
當(dāng)DWM的composition狀態(tài)打開或關(guān)閉時(shí),系統(tǒng)會(huì)向所有頂層窗口廣播一個(gè)WM_DWMCOMPOSITIONCHANGED消息;如果composition為打開,需要再次調(diào)用DwmExtendFrameIntoClientArea()以告之DWM,我們窗口的哪一部分應(yīng)為毛玻璃效果:
LRESULT CMainFrame::OnCompositionChanged(...)
{
if ( IsCompositionEnabled() )
{
MARGINS mar = {0};
mar.cyBottomHeight = 100;
DwmExtendFrameIntoClientArea ( m_hWnd, &mar );
}
return 0;
}
在對(duì)話框程序中應(yīng)用毛玻璃效果
在對(duì)話框程序中添加毛玻璃效果的過程,與上面框架窗口的例子非常相似,但需要對(duì)代碼作一些輕微的改動(dòng)。在示例對(duì)話框程序中為頂層窗口添加了毛玻璃效果,下面,相對(duì)前一例子作了修改或添加的代碼,將以黑體字標(biāo)出。
設(shè)置對(duì)話框
如之前一樣,要告之CThemeImpl我們要使用哪個(gè)窗口類主題,并調(diào)用DwmExtendFrameIntoClientArea()為窗口邊框添加毛玻璃效果。
CMainDlg::CMainDlg()
{
SetThemeClassList ( L"globals" );
}
BOOL CMainDlg::OnInitDialog ( HWND hwndFocus, LPARAM lParam )
{
//刪除了向?qū)傻哪承┏跏蓟a
//為頂層窗口添加毛玻璃效果
if ( IsCompositionEnabled() )
{
MARGINS mar = {0};
mar.cyTopHeight = 150;
DwmExtendFrameIntoClientArea ( m_hWnd, &mar );
}
接下來,構(gòu)建文本字體。注意,我們需要顯式調(diào)用OpenThemeData(),而為什么在前面的框架窗口例子中不需要調(diào)用呢,因?yàn)镃ThemeImpl在它的WM_CREATE處理程序中已調(diào)用了。反觀對(duì)話框取而代之接收WM_INITDIALOG,而CThemeImpl未處理WM_INITDIALOG,所以就需要我們自己調(diào)用OpenThemeData()了。另外,在代碼中也把字體設(shè)置得更大,只是為了演示更大字體的發(fā)光效果。
else
{
const UINT uFormat = DT_SINGLELINE|DT_CENTER|DT_VCENTER|DT_NOPREFIX;
//設(shè)置好DC
dc.SetTextColor ( RGB(255,255,255) );
dc.SelectFont ( m_font );
dc.SetBkMode ( TRANSPARENT );
//繪制文本
dc.DrawText ( szTime, -1, rcText, uFormat );
}
return true; //我們繪制了整個(gè)背景
}
為演示發(fā)光效果,下面是同一背景上的一段文本,但沒有發(fā)光效果:
處理composition相關(guān)的通知
當(dāng)DWM的composition狀態(tài)打開或關(guān)閉時(shí),系統(tǒng)會(huì)向所有頂層窗口廣播一個(gè)WM_DWMCOMPOSITIONCHANGED消息;如果composition為打開,需要再次調(diào)用DwmExtendFrameIntoClientArea()以告之DWM,我們窗口的哪一部分應(yīng)為毛玻璃效果:
LRESULT CMainFrame::OnCompositionChanged(...)
{
if ( IsCompositionEnabled() )
{
MARGINS mar = {0};
mar.cyBottomHeight = 100;
DwmExtendFrameIntoClientArea ( m_hWnd, &mar );
}
return 0;
}
在對(duì)話框程序中應(yīng)用毛玻璃效果
在對(duì)話框程序中添加毛玻璃效果的過程,與上面框架窗口的例子非常相似,但需要對(duì)代碼作一些輕微的改動(dòng)。在示例對(duì)話框程序中為頂層窗口添加了毛玻璃效果,下面,相對(duì)前一例子作了修改或添加的代碼,將以黑體字標(biāo)出。
設(shè)置對(duì)話框
如之前一樣,要告之CThemeImpl我們要使用哪個(gè)窗口類主題,并調(diào)用DwmExtendFrameIntoClientArea()為窗口邊框添加毛玻璃效果。
CMainDlg::CMainDlg()
{
SetThemeClassList ( L"globals" );
}
BOOL CMainDlg::OnInitDialog ( HWND hwndFocus, LPARAM lParam )
{
//刪除了向?qū)傻哪承┏跏蓟a
//為頂層窗口添加毛玻璃效果
if ( IsCompositionEnabled() )
{
MARGINS mar = {0};
mar.cyTopHeight = 150;
DwmExtendFrameIntoClientArea ( m_hWnd, &mar );
}
接下來,構(gòu)建文本字體。注意,我們需要顯式調(diào)用OpenThemeData(),而為什么在前面的框架窗口例子中不需要調(diào)用呢,因?yàn)镃ThemeImpl在它的WM_CREATE處理程序中已調(diào)用了。反觀對(duì)話框取而代之接收WM_INITDIALOG,而CThemeImpl未處理WM_INITDIALOG,所以就需要我們自己調(diào)用OpenThemeData()了。另外,在代碼中也把字體設(shè)置得更大,只是為了演示更大字體的發(fā)光效果。