用C++品尝Vista美味[6] |
|
www.nanhushi.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 ) } |
|
|
|
文章录入:杜斌 责任编辑:杜斌 |
|
上一篇文章: 用C++品尝Vista美味[5] 下一篇文章: 用C++品尝Vista美味[7] |
【字体:小 大】【发表评论】【加入收藏】【告诉好友】【打印此文】【关闭窗口】 |
|
|