用C 品尝Vista美味[2]

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

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

项目开始

  第一个示例程式是不带视窗口、工具条、状态条的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;
}


  但假如运行程式,看不到有任何变化:


  这是因为毛玻璃效果依赖于窗口的透明度,为显示出玻璃效果,区域中像素(在本例中为客户区底部的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;
}

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




标签:

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

上一篇: 如何实现进程间数据通讯技术

下一篇: 写好C程式的10条秘籍

热门词条
热门标签