快速业务通道

用C++品尝Vista美味:界面的毛玻璃效果

作者 佚名技术 来源 程序设计 浏览 发布时间 2012-06-30

简介

本文将演示在基于Windows Vista的普通Windows应用程序及对话框程序中,如何利用C++来生成Aero毛玻璃效果,此处使用的是Beta 2版本的Vista及Windows SDK,也许在后续的版本中,一些API在细节上会有所变化。另外,文中没有使用MFC,全部例子用WTL 7.5生成,其可在http://wtl.sourceforge.net/下载得到,虽然此处使用的是Visual C++ 2003,但Visual C++ 2005也类似。

Aero主题及毛玻璃效果,是随同Vista"桌面窗口管理(DWM)"而来的新特性,也是微软市场推广的一个重心,在应用程序中集成毛玻璃效果,当打开Aero主题时,程序看上去会显得非常与众不同--很酷,对吧。

Aero主题中的毛玻璃效果

当以Aero为主题时,Vista会根据计算机显卡进行判断是否开启毛玻璃效果,此时桌面由DWM进行绘制,而DWM使用一个composition进程来渲染桌面,其会在顶层窗口的非客户区自动使用Aero主题元素(有点类似于Windows XP)。话又说回来,也不是总会添加这些毛玻璃效果的,如果计算机运行于"电池模式",或用户决定关闭透明效果,那么非客户区就不会有毛玻璃效果了,如果在控制面板的可视效果中打开了透明玻璃效果,那非客户区看上去就像下图这样:

用C++品尝Vista美味:界面的毛玻璃效果

请留意,记事本的边框呈现绿色调,这是墙纸透过来的颜色,并且也可以透过标题栏看到桌面的一些图标。

我们在编写代码的时候,关键只须留意composition是否打开,而不是设置了什么毛玻璃效果,因为DWM会处理毛玻璃效果绘制的部分。

项目开始

第一个示例程序是不带视窗口、工具条、状态条的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 <atlbase.h>
#include <atltypes.h>//共享的CRect/CPoint/CSize
#include <atlapp.h>
extern CAppModule _Module;
#include <atlwin.h>
#include <atlframe.h>
#include <atlmisc.h>
#include <atlcrack.h>
#include <atltheme.h>// XP/Vista主题支持
#include <dwmapi.h>// 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;
}

但如果运行程序,看不到有任何变化:

用C++品尝Vista美味:界面的毛玻璃效果

这是因为毛玻璃效果依赖于窗口的透明度,为显示出玻璃效果

凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站:http://www.lingzhong.cn 为了给广大客户了解更多的技术信息,本技术文章收集来源于网络,凌众科技尊重文章作者的版权,如果有涉及你的版权有必要删除你的文章,请和我们联系。以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢!

分享到: 更多

Copyright ©1999-2011 厦门凌众科技有限公司 厦门优通互联科技开发有限公司 All rights reserved

地址(ADD):厦门软件园二期望海路63号701E(东南融通旁) 邮编(ZIP):361008

电话:0592-5908028 传真:0592-5908039 咨询信箱:web@lingzhong.cn 咨询OICQ:173723134

《中华人民共和国增值电信业务经营许可证》闽B2-20100024  ICP备案:闽ICP备05037997号