用C++品尝Vista美味[3]
修改后,底部100像素现在是磨砂玻璃效果。
在毛玻璃区域添加文本
给窗口添加磨砂玻璃效果是比较简单的部分,但是给磨砂玻璃添加自己的UI就有点难了。因为必须始终保持像素的alpha值,所以有必要使用那些能够理解并适当设置alpha的绘图API。坏消息是几乎所有的GDI函数都忽略了alpha——剩下的API都是带SRCCOPY栅格操作的BilBlt()函数。所以程序必须使用GDI+或者主题API来绘制,这些API永远记住alpha。
在Vista中,磨砂玻璃效果一般用在表示程序状态的区域(而不是一般控件中的状态栏)。例如,Windows Media Player 11在窗口底部的毛玻璃区域显示播放控制和当前歌曲信息:
下面,我们将演示如何在毛玻璃区域上绘制文本,以及如何为文本添加发光效果,使文本在任何背景下都能轻松阅读。
使用正确的字体。
Vista已经完全放弃了MS Sans Serif和Tahoma字体,转而采用Segoe UI作为默认的UI字体。我们的程序也应该使用Segoe UI字体,所以我们将创建一个基于当前主题的字体。如果主题被禁用(例如,用户正在使用Windows经典配色方案),那么我们将使用SystemParametersInfo() API。
首先你需要在CMainFrame中添加主题支持,这很简单,因为WTL已经有了一个处理主题的类:CThemeImpl。我们可以将CThemeImpl添加到继承列表中,并将消息链接到CThemeImpl,这样当当前主题发生变化时,程序可以得到相应的通知。
class CMainFrame:
public CFrameWindowImpl,
public CMessageFilter,
public CThemeImpl
{
//...
BEGIN _ MSG _ MAP(CMainFrame)
CHAIN _ MSG _ MAP(CThemeImpl)
//...
END_MSG_MAP()
受保护的:
CFont m _ font;//用于绘制文本的字体
};
在CMainFrame的构造函数中,我们调用CThemeImpl::SetThemeClassList(),它指定了我们使用的是哪个主题窗口类。对于一般的窗口(即不是普通控件的窗口),名称为“globals”。
CMainFrame::CMainFrame()
{
SetThemeClassList(L " globals ");
}
最后,在OnCreate()中,从主题中读取字体信息,并创建一个自己使用的字体:
LRULT CMAINFRAME::oncreate(lpcreatestruct lpcs)
{
//...
/决定在文本中使用哪种字体。
log font lf = { 0 };
如果(!IsThemeNull())
GetThemeSysFont(TMT _ MSGBOXFONT,& lf);
else
{
nonclient metrics ncm = { sizeof(nonclient metrics)};
SystemParametersInfo(SPI _ GETNONCLIENTMETRICS,sizeof(NONCLIENTMETRICS),&ncm,false);
lf = ncm . lfmessagefont;
}
m_font。CreateFontIndirect(& lf);
返回0;
}
0条评论