学院首页 软件应用 编程开发 创意设计 认证培训 软件论坛
ASP ASP.NET PHP JSP SQL MYSQL Java VB

您的位置:学院 >> 编程开发 >> VB >> 用VB6.0在Vista下实现全磨砂玻璃窗口


用VB6.0在Vista下实现全磨砂玻璃窗口


  使用过Windows Vista 的用户都会对Vista窗口的磨砂玻璃效果印象深刻,而如果你在Windows Vista 下使用过 Windows Media Player 11 更会发现微软把这种效果扩展至WMP11的底部区域,使得WMP的底部按钮区域成为一条“玻璃带”,如图:

  

  事实上,Vista窗口的磨砂玻璃效果不仅限于窗体的边框(非客户区域),他可以任意的延伸,甚至铺满整个窗口,下面我们就来看看怎么用的vb6来实现这种扩展。

  Vista实现磨砂玻璃效果主要依靠一组叫做 Desktop Window Manager (DWM) 的API来实现,该组API均以dwm打头,存在于dwmapi.dll中(该文件为Vista特有),顾名思义,这些API是专门用来实现Vista窗口的特效的。由于篇幅所限,这里仅介绍和本文关系最密切的两个函数:DwmIsCompositionEnabled 和 DwmExtendFrameIntoClientArea。

  第一个函数DwmIsCompositionEnabled是用于判断系统的磨砂玻璃合成效果是否已经开启,因为该效果可以由用户关闭,尽管你可以在用户关闭合成效果的情况下在程序中单独使用合成效果。

  

  DwmIsCompositionEnabled的原型为:

HRESULT DwmIsCompositionEnabled( BOOL *pfEnabled )

  其中pfEnabled为一个输出参数,告诉后面的程序合成效果是否被打开。

  该函数的VB声明为:

  
Public Declare Function DwmIsCompositionEnabled Lib "dwmapi.dll" (ByRef enabledptr As Long) As Long

  这里要注意C++里的BOOL类型必须译成vb中的Long而不是Boolean,否则你将得到错误的结果。

  DwmExtendFrameIntoClientArea函数则用于将磨砂边框扩展至窗体客户区,使得整个窗体看上就像一张卡片(sheet)。

  该函数原型为:

  
HRESULT DwmExtendFrameIntoClientArea(HWND hWnd,const MARGINS *margins)

  其中hWnd 为目标窗口句柄,margins为一个MARGINS结构体指针

  MARGINS结构体定义为:

typedef struct _MARGINS
{
 int cxLeftWidth;
 int cxRightWidth;
 int cyTopHeight;
 int cyBottomHeight;
} MARGINS, *PMARGINS;


  该函数的vb引用为:

Public Declare Function DwmExtendFrameIntoClientArea Lib "dwmapi.dll" (ByVal hwnd As Long, margin As MARGINS) As Long
  
  MARGINS的vb形式定义:

Public Type MARGINS
 m_Left As Long
 m_Right As Long
 m_Top As Long
 m_Button As Long
End Type

  其中MARGINS中的各个成员为需要扩展的边框大小(单位:像素),如果要把磨砂玻璃效果铺满整个边框(本文以此为例),全部成员可设置为-1

  知道了这些,我们现在就可以动手了。

  我们在窗体的Form_Load事件里写上:

Dim mg As MARGINS, en As Long
mg.m_Left = -1
mg.m_Button = -1
mg.m_Right = -1
mg.m_Top = -1
DwmIsCompositionEnabled en
If en Then
 DwmExtendFrameIntoClientArea Me.hwnd, mg
End If

  然后运行(先确保系统使用Aero界面且合成效果被打开),结果发现窗体依然如故。原来,DwmExtendFrameIntoClientArea扩展后的边框并不会在客户区的前景显示(它其实是一个背景,你会发现,此时边框其实已经被扩展了,因为原来的客户区的凹陷边界已经消失),磨砂玻璃的效果被窗体默认画上去的前景覆盖了,所以我们得自己给窗体画个“透明”的前景。幸运的是,在RGB调色版中,黑色black (0x00000000)刚好就是ARGB(short for Alpha, Red, Green and Blue)的100%透明(这刚好可以解释为什么用Windows 画图板打开一个png图片时透明背景会变成纯黑)。所以,第一个方法,我们可以在窗口的Form_Paint事件(是的,Form_Paint就足够了,不用去子类化窗体。当然,如果要实现更高级功能,还是子类化吧…)中给窗口的前景用纯黑(RGB(0,0,0))填充,用的是经典的GDI,主要就是CreateSolidBrush和FillRect两个API工作,代码:

Dim hBrush As Long, m_Rect As RECT, hBrushOld As Long
hBrush = CreateSolidBrush(RGB(0, 0, 0))
hBrushOld = SelectObject(Me.hdc, hBrush)
GetClientRect Me.hwnd, m_Rect
FillRect Me.hdc, m_Rect, hBrush
SelectObject Me.hdc, hBrushOld
DeleteObject hBrush ‘别忘了删除对象

  现在再按一次F5,恩….很好!效果如下:

  

  但是接着问题就来了,当你在窗体上放上几个控件之后会发现,控件的黑色部分(一般就是文字)也带上了磨砂玻璃的“特效”,如图:

  

  注意到上面的Text1文字了吗?这种效果可不是我们想要的。怎么办呢?

  上帝说:要有更好的办法

  于是,就有了第二种实现方法。

  其实这个问题的关键是画出透明的客户区,那么,别忘了,还有一个API可以做成此事,记得.NET里面那些控件和窗口有的有个TransparentKey属性么?没错了,就是用它—— SetLayeredWindowAttributes

  SetLayeredWindowAttributes可以提供这样的一个功能:给一个窗口设定一个透明色,然后窗口显示的时候指定颜色的区域将变成透明。这样,只要我们给窗口指定一种没有用到的颜色(反正不是黑色就行,这里我用RGB(255,255,1)),就可以“画”出“透明”的区域了。

  我们在使用之前要先对SetLayeredWindowAttributes做做手脚,将其声明为:

  Public Declare Function SetLayeredWindowAttributesByColor Lib "user32" Alias "SetLayeredWindowAttributes" (ByVal hwnd As Long, ByVal crey As Long, ByVal bAlpha As Byte, ByVal dwFlags As Long) As Long

  为什么要这么干呢?留意函数第二个参数,本来有人将其声明为Byte类型(用于窗体半透明时没有问题),但是这里要传一个RGB值,所以要改成Long

  代码如下,相关的API和常量不再敷述,声明和值请读者自行补齐

  Form_Load事件:(先声明m_transparencyKey全局变量,Long类型)

m_transparencyKey = RGB(255, 255, 1) ‘多少没所谓
SetWindowLong Me.hwnd, GWL_EXSTYLE, GetWindowLong(Me.hwnd, GWL_EXSTYLE) Or WS_EX_LAYERED
SetLayeredWindowAttributesByColor Me.hwnd, m_transparencyKey, 0, LWA_COLORKEY
Dim mg As MARGINS, en As Long
mg.m_Left = -1
mg.m_Button = -1
mg.m_Right = -1
mg.m_Top = -1
MsgBox "1"
DwmIsCompositionEnabled en
If en Then
 DwmExtendFrameIntoClientArea Me.hwnd, mg
End If

  再在Form_Paint事件中画图:

  Form_Paint代码:

Dim hBrush As Long, m_Rect As RECT, hBrushOld As Long
hBrush = CreateSolidBrush(m_transparencyKey)
hBrushOld = SelectObject(Me.hdc, hBrush)
GetClientRect Me.hwnd, m_Rect
FillRect Me.hdc, m_Rect, hBrush
SelectObject Me.hdc, hBrushOld
DeleteObject hBrush

  再按F5,效果嘛……

  

  顺便提一下,此代码在Windows Vista以下版本,2000及以上Windows版本运行时会产生一个很有趣的效果(除控件外窗体客户区背景完全透明!),如图:

  
技术文章快速查找

栏目导航
软件应用
·操作系统 ·杀毒防黑 ·应用软件
·聊天软件 ·网络软件  
Web开发
·ASP ·JavaScript ·CGI
·JSP ·VbScript ·Web服务器
·PHP ·XML  
开发语言
·VB ·VC ·ASP.NET
·Java ·C/C++ ·Delphi
数据库开发
·MySQL ·SQL/Access ·PowerBuilder
·Oracle ·DB2  
网站设计
·Flash ·Dreamweaver ·HTML/CSS
·Fireworks ·FrontPage  
平面设计
·Photoshop ·CorelDraw ·AutoCAD
·FreeHand ·Illustrator ·3DsMAX
媒体动画
·Director ·Authorware ·Maya
·视频处理    


相关软件 产品库推荐
·笔记本 ·台式机 ·服务器
·数码相机 ·手机 ·GPS
·DV摄像机 ·MP3 ·MP4
·CPU ·硬盘 ·内存
·主板 ·显卡 ·显示器
·打印机 ·投影机 ·路由器

还没人留言,抢个先,哈哈!
对"用VB6.0在Vista下实现全磨砂玻璃窗口"的评论 - 快速回贴
内容:
  [完成后可按Ctrl+Enter发布]

百度中 用VB6.0在Vista下实现全磨砂玻璃窗口 相关内容
Google搜索中 用VB6.0在Vista下实现全磨砂玻璃窗口 相关内容
雅虎中 用VB6.0在Vista下实现全磨砂玻璃窗口 相关内容
Sogou搜索中 用VB6.0在Vista下实现全磨砂玻璃窗口 相关内容

相关软件 最新回复帖子:

·没有mysql支持时的替代方案
·一个可以发送附件及HTML格式邮件的PHP类
·AutoCAD打造精致三维鸟笼实例详解
·Photoshop自定义水晶字特效样式
·AutoCAD三维基础实例教程
·PS为黑背景长发美女照片抠图换背
·用Photoshop自制个性摩托车贴花小经验
·轻松几步将美女照片处理为手工素描
·巧用Photoshop画笔轻松绘制创意特效
·用Photoshop通道将模糊肖像照片清晰化


  相关软件 用VB6.0在Vista下实现全磨砂玻璃窗口相关文章
VB中调用MSN 6.2 API函数 Visual Basic中实现带预览的对话框
VB访问SQL Server数据库技术全揭密 用Visual Basic实现点对点通讯
Visual baisc中Byval与Byref的区别 VB6.0中Dir()函数的使用方法
VB中使用WinSock控件编写网络程序 VB程序中用ADO对象动态创建数据库和表
掌握VB中的ADO数据对象编程 用VB6.0实现网络实时监控系统
Visual Basic6.0事件机制分析 好文回顾:Visual Basic 十年风云
对VB6的后期绑定和前期绑定的一点看法 用VB设计“投票评选”程序的简单方法
用VB备份和恢复SQL Server数据库的方法 利用Visual Basic开发SAP接口程序初探
在VB环境中操作三维模型的实现方法 基于Visual Basic 6的网络程序设计
VB开发应用软件之写在动手之前 VB第三方控件实现XP资源管理器垂直栏