用C++品嘗Vista美味[3]

字號(hào):

修改之后,底部的100像素現(xiàn)在是毛玻璃效果了。
    在毛玻璃區(qū)域添加文本
    在窗口中添加毛玻璃效果是比較簡(jiǎn)單的部分,但要把自己的界面元素(UI)添加到毛玻璃之上,就有點(diǎn)難度了。因?yàn)楸仨氁恢北3窒袼氐腶lpha值,所以就要用到那些可以理解并適當(dāng)設(shè)置alpha的繪圖API。壞消息是,GDI函數(shù)差不多全部不理會(huì)alpha--剩下的API則為帶有SRCCOPY光柵操作的BilBlt()函數(shù)了,因此,程序必須使用GDI+或主題API來(lái)進(jìn)行繪圖,這些API都是時(shí)刻不忘alpha的。
    在Vista中,有關(guān)毛玻璃的效果一般用在表示程序狀態(tài)的區(qū)域(取代了通用控件中的狀態(tài)欄),例如,Windows Media Player 11就在窗口底部的毛玻璃區(qū)域顯示播放控制與當(dāng)前歌曲信息:
    以下,將演示怎樣在毛玻璃區(qū)域上繪制文本,并怎樣在文本上添加發(fā)光效果,以便文本在任何背景上都方便閱讀。
    使用正確的字體
    Vista已經(jīng)徹底放棄使用MS Sans Serif與Tahoma字體,轉(zhuǎn)而把Segoe UI作為默認(rèn)的UI字體。我們的程序也應(yīng)該使用Segoe UI字體,所以,將會(huì)在基于當(dāng)前主題的情況下創(chuàng)建一個(gè)字體。如果主題被禁用(如用戶正在使用Windows經(jīng)典顏色方案),那我們就使用SystemParametersInfo() API。
    首先,需要在CMainFrame中添加主題支持,這一點(diǎn)非常簡(jiǎn)單,因?yàn)閃TL已經(jīng)有一個(gè)用于處理主題的類:CThemeImpl。我們可把CThemeImpl添加到繼承列表,并把消息鏈接至CThemeImpl,以便在當(dāng)前主題改變時(shí),程序可以得到相應(yīng)的通知。
    class CMainFrame :
    public CFrameWindowImpl,
    public CMessageFilter,
    public CThemeImpl
    {
    // ...
    BEGIN_MSG_MAP(CMainFrame)
    CHAIN_MSG_MAP(CThemeImpl)
    // ...
    END_MSG_MAP()
    protected:
    CFont m_font; //用于繪制文本的字體
    };
    在CMainFrame的構(gòu)造函數(shù)中,我們調(diào)用了CThemeImpl::SetThemeClassList(),其指定了我們正在使用哪一個(gè)主題的窗口類。對(duì)一般窗口來(lái)說(shuō)(即不是普通控件的窗口),名稱為"globals"。
    CMainFrame::CMainFrame()
    {
    SetThemeClassList ( L"globals" );
    }
    最后,在OnCreate()中,從主題中讀取字體信息,并創(chuàng)建一個(gè)字體自用:
    LRESULT CMainFrame::OnCreate ( LPCREATESTRUCT lpcs )
    {
    // ...
    //決定在文本中使用哪一種字體
    LOGFONT lf = {0};
    if ( !IsThemeNull() )
    GetThemeSysFont ( TMT_MSGBOXFONT, &lf );
    else
    {
    NONCLIENTMETRICS ncm = { sizeof(NONCLIENTMETRICS) };
    SystemParametersInfo (SPI_GETNONCLIENTMETRICS, sizeof(NONCLIENTMETRICS),&ncm, false );
    lf = ncm.lfMessageFont;
    }
    m_font.CreateFontIndirect ( &lf );
    return 0;
    }