用C++品尝Vista美味[6]
//决定使用哪种字体
log font lf = { 0 };
OpenThemeData();
如果(!IsThemeNull())
GetThemeSysFont(TMT _ MSGBOXFONT,& lf);
else
{
nonclient metrics ncm = { sizeof(nonclient metrics)};
SystemParametersInfo(SPI _ GETNONCLIENTMETRICS,sizeof(NONCLIENTMETRICS),&ncm,false);
lf = ncm . lfmessagefont;
}
lf . lf height * = 3;
m_font。CreateFontIndirect(& lf);
对话框的顶部窗口有一个很大的静态文本控件,就是我们要画时间的地方。该代码设置控件的所有者描述样式,因此我们可以将所有文本绘制代码放在OnDrawItem()中:
//设置静态文本控件的所有者描述
m_wndTimeLabel。attach(GetDlgItem(IDC _ CLOCK));
m_wndTimeLabel。ModifyStyle ( SS_TYPEMASK,SS _ owner draw);
最后,调用EnableThemeDialogTexture(),以便用当前主题绘制对话框背景。
//其他初始化代码
EnableThemeDialogTexture(ETDT _ ENABLE);
//将定时器间隔设置为1秒,这样时钟可以每秒更新一次。
SetTimer(11000);
返回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()中,获取当前时间并使用它来设置静态控件的文本:
Voidcmaindlg:: ontimer (uinuid,timer proc proroc)
{
//获取当前时间
TCHAR SZ time[64];
gettime format(LOCALE _ USER _ DEFAULT,0,NULL,NULL,szTime,_ count of(SZ time));
m_wndTimeLabel。SetWindowText(SZ time)
}
0条评论