用C++品尝Vista美味[3],第1张

用C++品尝Vista美味[3],第2张

修改后,底部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;
}

位律师回复
DABAN RP主题是一个优秀的主题,极致后台体验,无插件,集成会员系统
白度搜_经验知识百科全书 » 用C++品尝Vista美味[3]

0条评论

发表评论

提供最优质的资源集合

立即查看 了解详情