用C++品尝Vista美味[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
}
0条评论