打印本文 打印本文  关闭窗口 关闭窗口  
用C++品尝Vista美味[6]
作者:佚名  文章来源:不详  点击数  更新时间:2008/4/18 14:39:33  文章录入:杜斌  责任编辑:杜斌

//决定使用哪一种字体
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 )
}
打印本文 打印本文  关闭窗口 关闭窗口