用C++品尝Vista美味[2],第1张

用C++品尝Vista美味[2],第2张

项目开始

第一个示例程序是没有可视窗口、工具栏和状态栏的SDI应用程序。运行WTL AppWizard后,要做的第一件事是在stdafx.h中设置#define,以利用Vista的新功能。Windows版Vista是6,Vista中IE的版本是7。设置后,它应该如下所示:

# define WINVER 0x 0600
# define _ WIN32 _ WINNT 0x 0600
# define _ WIN32 _ IE 0x 0700

接下来,包含ATL和WTL的头文件:

#define _WTL_NO_WTYPES //不要在WTL头文件中定义CRECT/CPINT/CSize
# include
# include//共享CRECT/CPINT/CSize
# include

extern CAppModule _ Module

# 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::GetHemetextMetrics(m _ h theme,...,(ptextmetric)ptextmetric);
}


GetThemeTextMetrics()API中的转换是对Platform SDK的uxtheme.h中错误的修正。但是,Windows SDK没有此错误,因此此转换会导致错误。函数中的这个转换可以删除,其他三个也可以。

增加了毛玻璃效果的边框

将毛玻璃效果从非客户区延伸到客户区,就可以完成添加程序的毛玻璃效果。这个API是DwmExtendFrameIntoClientArea()。DwmExtendFrameIntoClientArea()接受两个参数:框架窗口的HWND和用于解释磨砂玻璃效果在窗口周围延伸多远的MARGINS结构。您可以在OnCreate()中调用这个API:

LRULT CMAINFRAME::oncreate(lpcreatestruct lpcs)
{
//在底部添加玻璃效果
mar = { 0 };
mar . cybottomheight = 100;
DwmExtendFrameIntoClientArea(m _ hWnd,& mar);
返回0;
}

但是如果你运行这个程序,你看不到任何变化:

这是因为毛玻璃效果取决于窗户的透明度。为了显示玻璃效果,该区域中像素的alpha值(在本例中,客户区底部的100个像素)必须设置为0。最简单的方法是用黑色画笔绘制这个区域,这样会将像素的颜色值(红、绿、蓝、alpha)设置为0,这可以在OnEraseBkgnd()中完成:

BOOL CMainFrame::OnEraseBkgnd(HDC HDC)
{
CDCHandle DC = HDC;
CRect RC client;
GetClientRect(RC client);
dc。FillSolidRect(rcClient,RGB(0,0,0));
返回true
}

位律师回复
DABAN RP主题是一个优秀的主题,极致后台体验,无插件,集成会员系统
白度搜_经验知识百科全书 » 用C++品尝Vista美味[2]

0条评论

发表评论

提供最优质的资源集合

立即查看 了解详情