用C 品尝Vista美味[3]

2008-02-23 05:39:19来源:互联网 阅读 ()

新老客户大回馈,云服务器低至5折

修改之后,框架窗口看起来像这样:


  底部的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<CMainFrame>,
public CMessageFilter,
public CThemeImpl<CMainFrame>
{
 // ...
 BEGIN_MSG_MAP(CMainFrame)
  CHAIN_MSG_MAP(CThemeImpl<CMainFrame>)
  // ...
 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;
}

[1] [2] [3] [4] [5] [6] [7]




标签:

版权申明:本站文章部分自网络,如有侵权,请联系:west999com@outlook.com
特别注意:本站所有转载文章言论不代表本站观点,本站所提供的摄影照片,插画,设计作品,如需使用,请与原作者联系,版权归原作者所有

上一篇: 用C 品尝Vista美味[1]

下一篇: 用C 品尝Vista美味[5]

热门词条
热门标签