項(xiàng)目開(kāi)始
第一個(gè)示例程序是不帶視窗口、工具條、狀態(tài)條的SDI應(yīng)用程序,在運(yùn)行完WTL AppWizard之后,第一件事就是設(shè)置stdafx.h中的#define,以便利用Vista的新特性。Vista的Windows版本為6,且Vista中IE的版本為7,設(shè)置完成后應(yīng)像下面這樣:
#define WINVER 0x0600
#define _WIN32_WINNT 0x0600
#define _WIN32_IE 0x0700
接下來(lái)包含ATL與WTL的頭文件:
#define _WTL_NO_WTYPES // 不要在WTL頭文件中定義CRect/CPoint/CSize
#include
#include //共享的CRect/CPoint/CSize
#include
extern CAppModule _Module;
#include
#include
#include
#include
#include // XP/Vista主題支持
#include// DWM API
如果修改完成之后就編譯,將會(huì)從atltheme.h中得到4個(gè)錯(cuò)誤。例如,以下是不會(huì)編譯通過(guò)的CTheme::GetThemeTextMetrics()代碼:
HRESULT GetThemeTextMetrics(..., PTEXTMETRICW pTextMetric)
{
ATLASSERT(m_hTheme != NULL);
//注意:因?yàn)閡xtheme.h頭文件,所以轉(zhuǎn)換為PTEXTMETRIC。
//替換掉PTEXTMETRICW是不對(duì)的
return ::GetThemeTextMetrics(m_hTheme, ..., (PTEXTMETRIC) pTextMetric);
}
在GetThemeTextMetrics() API中的轉(zhuǎn)換,是對(duì)Platform SDK的uxtheme.h中錯(cuò)誤的修正,然而,Windows SDK卻沒(méi)有這個(gè)錯(cuò)誤,所以這個(gè)轉(zhuǎn)換導(dǎo)致了一個(gè)錯(cuò)誤,可刪除函數(shù)中的這個(gè)轉(zhuǎn)換,其他三個(gè)也同樣。
添加邊框的毛玻璃效果
通過(guò)把毛玻璃效果從非客戶(hù)區(qū)擴(kuò)展到客戶(hù)區(qū),就可完成添加程序的毛玻璃效果,這個(gè)API是DwmExtendFrameIntoClientArea()。DwmExtendFrameIntoClientArea()接受兩個(gè)參數(shù):我們框架窗口的HWND和一個(gè)用于說(shuō)明毛玻璃效果擴(kuò)展到窗口四周多遠(yuǎn)的MARGINS結(jié)構(gòu)??稍贠nCreate()中調(diào)用這個(gè)API:
LRESULT CMainFrame::OnCreate(LPCREATESTRUCT lpcs)
{
//在底部添加玻璃效果
MARGINS mar = {0};
mar.cyBottomHeight = 100;
DwmExtendFrameIntoClientArea ( m_hWnd, &mar );
return 0;
}
但如果運(yùn)行程序,看不到有任何變化:
這是因?yàn)槊AЧ蕾?lài)于窗口的透明度,為顯示出玻璃效果,區(qū)域中像素(在本例中為客戶(hù)區(qū)底部的100像素)的alpha值必須設(shè)置為0。最簡(jiǎn)單的方法是用一個(gè)黑畫(huà)刷來(lái)繪制這個(gè)區(qū)域,它會(huì)把像素的顏色值(紅、綠、藍(lán)和alpha)設(shè)為0,可在OnEraseBkgnd()中完成:
BOOL CMainFrame::OnEraseBkgnd ( HDC hdc )
{
CDCHandle dc = hdc;
CRect rcClient;
GetClientRect(rcClient);
dc.FillSolidRect(rcClient, RGB(0,0,0));
return true;
}
第一個(gè)示例程序是不帶視窗口、工具條、狀態(tài)條的SDI應(yīng)用程序,在運(yùn)行完WTL AppWizard之后,第一件事就是設(shè)置stdafx.h中的#define,以便利用Vista的新特性。Vista的Windows版本為6,且Vista中IE的版本為7,設(shè)置完成后應(yīng)像下面這樣:
#define WINVER 0x0600
#define _WIN32_WINNT 0x0600
#define _WIN32_IE 0x0700
接下來(lái)包含ATL與WTL的頭文件:
#define _WTL_NO_WTYPES // 不要在WTL頭文件中定義CRect/CPoint/CSize
#include
#include //共享的CRect/CPoint/CSize
#include
extern CAppModule _Module;
#include
#include
#include
#include
#include // XP/Vista主題支持
#include
如果修改完成之后就編譯,將會(huì)從atltheme.h中得到4個(gè)錯(cuò)誤。例如,以下是不會(huì)編譯通過(guò)的CTheme::GetThemeTextMetrics()代碼:
HRESULT GetThemeTextMetrics(..., PTEXTMETRICW pTextMetric)
{
ATLASSERT(m_hTheme != NULL);
//注意:因?yàn)閡xtheme.h頭文件,所以轉(zhuǎn)換為PTEXTMETRIC。
//替換掉PTEXTMETRICW是不對(duì)的
return ::GetThemeTextMetrics(m_hTheme, ..., (PTEXTMETRIC) pTextMetric);
}
在GetThemeTextMetrics() API中的轉(zhuǎn)換,是對(duì)Platform SDK的uxtheme.h中錯(cuò)誤的修正,然而,Windows SDK卻沒(méi)有這個(gè)錯(cuò)誤,所以這個(gè)轉(zhuǎn)換導(dǎo)致了一個(gè)錯(cuò)誤,可刪除函數(shù)中的這個(gè)轉(zhuǎn)換,其他三個(gè)也同樣。
添加邊框的毛玻璃效果
通過(guò)把毛玻璃效果從非客戶(hù)區(qū)擴(kuò)展到客戶(hù)區(qū),就可完成添加程序的毛玻璃效果,這個(gè)API是DwmExtendFrameIntoClientArea()。DwmExtendFrameIntoClientArea()接受兩個(gè)參數(shù):我們框架窗口的HWND和一個(gè)用于說(shuō)明毛玻璃效果擴(kuò)展到窗口四周多遠(yuǎn)的MARGINS結(jié)構(gòu)??稍贠nCreate()中調(diào)用這個(gè)API:
LRESULT CMainFrame::OnCreate(LPCREATESTRUCT lpcs)
{
//在底部添加玻璃效果
MARGINS mar = {0};
mar.cyBottomHeight = 100;
DwmExtendFrameIntoClientArea ( m_hWnd, &mar );
return 0;
}
但如果運(yùn)行程序,看不到有任何變化:
這是因?yàn)槊AЧ蕾?lài)于窗口的透明度,為顯示出玻璃效果,區(qū)域中像素(在本例中為客戶(hù)區(qū)底部的100像素)的alpha值必須設(shè)置為0。最簡(jiǎn)單的方法是用一個(gè)黑畫(huà)刷來(lái)繪制這個(gè)區(qū)域,它會(huì)把像素的顏色值(紅、綠、藍(lán)和alpha)設(shè)為0,可在OnEraseBkgnd()中完成:
BOOL CMainFrame::OnEraseBkgnd ( HDC hdc )
{
CDCHandle dc = hdc;
CRect rcClient;
GetClientRect(rcClient);
dc.FillSolidRect(rcClient, RGB(0,0,0));
return true;
}