用C 品尝Vista美味[3]

文章作者 100test 发表时间 2007:08:06 12:58:06
来源 100Test.Com百考试题网


修改之后,底部的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()

 protected:
  CFont m_font. //用于绘制文本的字体
}.


  在CMainFrame的构造函数中,我们调用了CThemeImpl::SetThemeClassList(),其指定了我们正在使用哪一个主题的窗口类。对一般窗口来说(即不是普通控件的窗口),名称为"globals"。

CMainFrame::CMainFrame()
{
 SetThemeClassList ( L"globals" ).
}



  最后,在OnCreate()中,从主题中读取字体信息,并创建一个字体自用:

LRESULT CMainFrame::OnCreate ( LPCREATESTRUCT lpcs )
{
 // ...
 //决定在文本中使用哪一种字体

 LOGFONT lf = {0}.
 if ( !IsThemeNull() )
  GetThemeSysFont ( TMT_MSGBOXFONT, &.lf ).
 else
 {
  NONCLIENTMETRICS ncm = { sizeof(NONCLIENTMETRICS) }.
  SystemParametersInfo (SPI_GETNONCLIENTMETRICS, sizeof(NONCLIENTMETRICS),&.ncm, false ).
  lf = ncm.lfMessageFont.
 }
 m_font.CreateFontIndirect ( &.lf ).
 return 0.
}


src="/ncre2/js/wxgg.js">

相关文章


用C 品尝Vista美味[4]
用C 品尝Vista美味[3]
用C 品尝Vista美味[6]
用C 品尝Vista美味[2]
用C 品尝Vista美味[1]
澳大利亚华人论坛
考好网
日本华人论坛
华人移民留学论坛
英国华人论坛