用C++品尝Vista美味:界面的毛玻璃效果
,区域中像素(在本例中为客户区底部的100像素)的alpha值必须设置为0。最简单的方法是用一个黑画刷来绘制这个区域,它会把像素的颜色值(红、绿、蓝和alpha)设为0,可在OnEraseBkgnd()中完成:
BOOL CMainFrame::OnEraseBkgnd ( HDC hdc )
修改之后,框架窗口看起来像这样: 底部的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 :
在CMainFrame的构造函数中,我们调用了CThemeImpl::SetThemeClassList(),其指定了我们正在使用哪一个主题的窗口类。对一般窗口来说(即不是普通控件的窗口),名称为"globals"。 CMainFrame::CMainFrame()
最后,在OnCreate()中,从主题中读取字体信息,并创建一个字体自用: LRESULT CMainFrame::OnCreate ( LPCREATESTRUCT lpcs )
绘制文本 在毛玻璃效果上绘制文本涉及以下步骤: ·创建一个用于双缓冲绘制的内存DC。 ·创建一个32位色深的DIB,并选入DC。 ·用DrawThemeTextEx()把文本绘制在内存中的DIB上。 ·用BitBit()把文本复制到屏幕。 因为我们的绘制代码将会因为composition是否打开而有所不同,所以需要在绘制期间检查composition状态。检查状态的API为DwmIsCompositionEnabled(),如果API执行失败,在返回值中就不会指示出打开状态,但CMainFrame中有一个包装好的函数IsCompositionEnabled( |
凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站:http://www.lingzhong.cn 为了给广大客户了解更多的技术信息,本技术文章收集来源于网络,凌众科技尊重文章作者的版权,如果有涉及你的版权有必要删除你的文章,请和我们联系。以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢! |