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

字號:

//決定使用哪一種字體
    LOGFONT lf = {0};
    OpenThemeData();
    if ( !IsThemeNull() )
    GetThemeSysFont ( TMT_MSGBOXFONT, &lf );
    else
    {
    NONCLIENTMETRICS ncm = { sizeof(NONCLIENTMETRICS) };
    SystemParametersInfo (SPI_GETNONCLIENTMETRICS, sizeof(NONCLIENTMETRICS),&ncm, false );
    lf = ncm.lfMessageFont;
    }
    lf.lfHeight *= 3;
    m_font.CreateFontIndirect ( &lf );
    對話框的頂層窗口上有一個大的靜態(tài)文本控件,也就是我們要繪制時間的地方。代碼設(shè)置了控件的owner-draw風(fēng)格,因此,我們可把所有的文本繪制代碼都放在OnDrawItem()中:
    //設(shè)置靜態(tài)文本控件的owner-draw
    m_wndTimeLabel.Attach ( GetDlgItem(IDC_CLOCK) );
    m_wndTimeLabel.ModifyStyle ( SS_TYPEMASK, SS_OWNERDRAW );
    最后,調(diào)用EnableThemeDialogTexture()以便對話框背景使用當(dāng)前主題來繪制。
    //其他初始化代碼
    EnableThemeDialogTexture ( ETDT_ENABLE );
    //設(shè)置計時器的時間間隔為1秒,以在每個秒鐘內(nèi)都能更新時鐘
    SetTimer ( 1, 1000 );
    return TRUE;
    }
    打開毛玻璃效果
    如前面一樣,我們需要用黑色畫刷來填充毛玻璃區(qū)域,以便營造一種透視效果。因為內(nèi)置的對話框窗口處理過程會響應(yīng)WM_ERASEBKGND消息,來處理諸如非矩形或半透明控件,所以,我們需要在OnPaint()而不是OnEraseBkgnd()中做繪圖。
    void CMainDlg::OnPaint ( HDC hdc )
    {
    CPaintDC dc(m_hWnd);
    CRect rcGlassArea;
    if ( IsCompositionEnabled() )
    {
    GetClientRect ( rcGlassArea );
    rcGlassArea.bottom = 150;
    dc.FillSolidRect(rcGlassArea, RGB(0,0,0));
    }
    }
    繪制文本
    在OnTimer()中,獲取當(dāng)前時間,并以此設(shè)置靜態(tài)控件的文本:
    void CMainDlg::OnTimer ( UINT uID, TIMERPROC pProc )
    {
    //獲取當(dāng)前時間
    TCHAR szTime[64];
    GetTimeFormat ( LOCALE_USER_DEFAULT, 0, NULL, NULL,szTime, _countof(szTime) );
    m_wndTimeLabel.SetWindowText ( szTime )
    }