用C 品尝Vista美味[6]
文章作者 100test 发表时间 2007:08:06 12:58:09
来源 100Test.Com百考试题网
//决定使用哪一种字体 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 ). |
对话框的顶层窗口上有一个大的静态文本控件,也就是我们要绘制时间的地方。代码设置了控件的owner-draw风格,因此,我们可把所有的文本绘制代码都放在OnDrawItem()中:
//设置静态文本控件的owner-draw
m_wndTimeLabel.Attach ( GetDlgItem(IDC_CLOCK) ). m_wndTimeLabel.ModifyStyle ( SS_TYPEMASK, SS_OWNERDRAW ). |
最后,调用EnableThemeDialogTexture()以便对话框背景使用当前主题来绘制。
//其他初始化代码
EnableThemeDialogTexture ( ETDT_ENABLE ).
//设置计时器的时间间隔为1秒,以在每个秒钟内都能更新时钟
SetTimer ( 1, 1000 ). return TRUE. } |
打开毛玻璃效果
如前面一样,我们需要用黑色画刷来填充毛玻璃区域,以便营造一种透视效果。因为内置的对话框窗口处理过程会响应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()中,获取当前时间,并以此设置静态控件的文本:
void CMainDlg::OnTimer ( UINT uID, TIMERPROC pProc ) { //获取当前时间 TCHAR szTime[64]. GetTimeFormat ( LOCALE_USER_DEFAULT, 0, NULL, NULL,szTime, _countof(szTime) ). m_wndTimeLabel.SetWindowText ( szTime ) } |
src="/ncre2/js/wxgg.js">