用C  品尝Vista美味[2]
文章作者 100test 发表时间 2007:08:06 12:58:11
来源 100Test.Com百考试题网
项目开始
  第一个示例程序是不带视窗口、工具条、状态条的SDI应用程序,在运行完WTL AppWizard之后,第一件事就是设置stdafx.h中的#define,以便利用Vista的新特性。Vista的Windows版本为6,且Vista中IE的版本为7,设置完成后应像下面这样:
| #define WINVER 0x0600 #define _WIN32_WINNT 0x0600
 #define _WIN32_IE 0x0700
 | 
  接下来包含ATL与WTL的头文件:
| #define _WTL_NO_WTYPES // 不要在WTL头文件中定义CRect/CPoint/CSize #include
 #include //共享的CRect/CPoint/CSize
 #include
 
 extern CAppModule _Module.
 
 #include
 #include
 #include
 #include
 #include // XP/Vista主题支持
 #include // DWM API
 | 
  如果修改完成之后就编译,将会从atltheme.h中得到4个错误。例如,以下是不会编译通过的CTheme::GetThemeTextMetrics()代码:
| HRESULT GetThemeTextMetrics(..., PTEXTMETRICW pTextMetric) {
 ATLASSERT(m_hTheme != NULL).
 
 //注意:因为uxtheme.h头文件,所以转换为PTEXTMETRIC。
 //替换掉PTEXTMETRICW是不对的
 return ::GetThemeTextMetrics(m_hTheme, ..., (PTEXTMETRIC) pTextMetric).
 }
 | 
  在GetThemeTextMetrics() API中的转换,是对Platform SDK的uxtheme.h中错误的修正,然而,Windows SDK却没有这个错误,所以这个转换导致了一个错误,可删除函数中的这个转换,其他三个也同样。 
  添加边框的毛玻璃效果
  通过把毛玻璃效果从非客户区扩展到客户区,就可完成添加程序的毛玻璃效果,这个API是DwmExtendFrameIntoClientArea()。DwmExtendFrameIntoClientArea()接受两个参数:我们框架窗口的HWND和一个用于说明毛玻璃效果扩展到窗口四周多远的MARGINS结构。可在OnCreate()中调用这个API:
| LRESULT CMainFrame::OnCreate(LPCREATESTRUCT lpcs) {
 //在底部添加玻璃效果
 MARGINS mar = {0}.
 mar.cyBottomHeight = 100.
 DwmExtendFrameIntoClientArea ( m_hWnd, &.mar ).
 return 0.
 }
 | 
  但如果运行程序,看不到有任何变化:
  这是因为毛玻璃效果依赖于窗口的透明度,为显示出玻璃效果,区域中像素(在本例中为客户区底部的100像素)的alpha值必须设置为0。最简单的方法是用一个黑画刷来绘制这个区域,它会把像素的颜色值(红、绿、蓝和alpha)设为0,可在OnEraseBkgnd()中完成:
| BOOL CMainFrame::OnEraseBkgnd ( HDC hdc ) {
 CDCHandle dc = hdc.
 CRect rcClient.
 GetClientRect(rcClient).
 dc.FillSolidRect(rcClient, RGB(0,0,0)).
 return true.
 }
 | 
 src="/ncre2/js/wxgg.js">