银耳雪梨汤:VB.Net:如何实现Aero玻璃界面? - 志 - 网易博客
来源:百度文库 编辑:九乡新闻网 时间:2024/04/29 14:42:14
VB.Net:如何实现Aero玻璃界面?
计算机技术 2010-02-26 10:51:39 阅读732 评论4 字号:大中小 订阅
Vista与Windows 7中的Aero界面是它们最吸引人的新功能之一,它可以实现大面积的透明界面。但是我们在编程中却不能完全利用这个功能。虽然VB.Net 2005以后的控件已经开始支持XP和Vista的风格了,但是窗体的界面却无法完全实现Aero的毛玻璃效果,只有最外面的一层窗口标题栏是透明的。网上确实有关于如何用.Net语言来实现这一效果的,但那是C#,而不是VB.Net。要VB.Net语言来实现?在网上找不到。难道为了这个功能非得去学C#才行吗?虽然网上有将C#代码转换为VB.Net代码,但它要求完整的代码结构,而网上提供的往往只是一段代码,并不是完整的一个Class,所以也难实现。本文将讲述如何用vb.net做这个界面。
Aero毛玻璃界面之所以无法在vb.net的IDE中直接使用,是因为它是Vista和Win7专有的功能,XP是不可能实现的。这个功能被放在了Vista和Win7的系统目录中的一个API库中,它就是DWMAPI.DLL.所以如果我们要做这种窗口,首先要调用这个API。
'在程序开头导入这个,否则会出错
Imp
'声明函数和必要的类型,在Class <类名称> 后面输入
Public Structure MARGINS
Public cxLeftWidth As Integer
Public cxRightWidth As Integer
Public cyTopHeight As Integer
Public cyButtomheight As Integer
End Structure
Public Shared Function DwmExtendFrameIntoClientArea(ByVal hWnd As IntPtr, ByRef pMarinset As MARGINS) As Integer
End Function
调用完了以后我们就可以在窗体加载的时候使用了。在Form_Load过程中输入这些:
On Error Resume Next
Dim margins As MARGINS = New MARGINS
margins.cxLeftWidth = -1
margins.cxRightWidth = -1
margins.cyTopHeight = -1
margins.cyButtomheight = -1
'这四个值分别是透明区域的左、右、上、下的高度,如果设置为-1则说明全透明。
'如果设置指定区域则输入0以上的数字
Dim hwnd As IntPtr = Me.Handle
Dim result As Integer = DwmExtendFrameIntoClientArea(hwnd, margins)
好了,我们现在运行这个程序,看看是什么效果
??这是怎么回事?为什么没有出现透明效果呢?难道这个函数是假的?
实际上,Aero的透明技术是将一种颜色映射为Alpha颜色,而这个颜色就是黑色。也就是说,我们必须把窗口的背景设置为黑色才能实现透明效果。但是如果直接把属性中的背景设置为黑色会影响界面设计,所以我们在FormLoad中再加一句:
Me.BackColor = Color.Black
这样在设计界面时窗体不是黑的,但运行时窗体颜色会自动设置为黑色,这样就可以实现透明界面了。好了,我们启动程序,看看效果:
很好,这次的窗体就是全透明的了。但是我们设计程序不可能只有一个窗体,上面还得加一些Label等很多控件。好,我们在上面添加一个Label控件,文字内容为“Hello Aero”,字体设置为Segoe UI。
然后我们再运行程序,你会发现,为什么没有字呢?原因很简单,字是黑色的,也被当成透明颜色渲染了。实际上要想在这上面写黑色的字体还不容易,必须用graphics ”绘制”一段文本。
好,我们回到刚才的工程中,把Controlbox属性设为False,并把窗体的Text全去掉——自然,窗体就没有标题栏了,这时候窗体大小应该是300,300(vs窗体默认大小),如果不是请改成这个大小。
然后画一个300,200的Picturebox控件,backcolor设置为灰色(再设置一次,否则这个控件起不到作用)并对齐到窗体底部,然后把Locked属性设为TRUE,锁定这个控件。做这个控件的目的是盖住窗体中非透明的黑色区域,否则窗体会很难看。
在picturebox上画一个Button按钮,随便设置一些文字。
然后回到代码界面,在Form_load中要修改一些代码:
margins.cxLeftWidth = 0
margins.cxRightWidth = 0
margins.cyTopHeight = 70
margins.cyButtomheight = 0
这样透明的区域被限定为顶部70像素,出来的界面就很像Vista里面的各种向导的窗口了。
然后双击Button1,进入代码界面,在Button1_Click事件中输入这些代码:
Dim g As Graphics
g = CreateGraphics()
Dim blackfont As New System.Drawing.Drawing2D.GraphicsPath
Dim brsh As SolidBrush
brsh = New SolidBrush(Color.Black)
blackfont.AddString("Hello Aero!", New FontFamily("Tahoma"), FontStyle.Regular, 26, New Point(0, 0), StringFormat.GenericDefault)
g.SmoothingMode = Drawing2D.SmoothingMode.HighQuality
g.FillPath(brsh, blackfont)
好了,我们现在运行这个程序,然后单击窗体里面的按钮,看看:
看,黑色的字体可以用graphics来绘制出来。如果你要在picturebox上写字用Label控件也是可以的。
到现在我们的Aero玻璃界面就算完成了。现在你就可以用这个功能来做一个Aero透明界面的程序了。不过你最好在窗口启动的时候检测一下系统版本是不是Vista以上的,因为XP是不能实现的。
至于那些坚守在VB6上的人来说,要实现这个界面是不可能的,就算你调用一大堆API来实现了Aero毛玻璃效果,其他控件的98风格会显得很雷人(虽然vb6有办法实现xp或Vista的界面,但是仅限于一些控件,连进度条都不好使),所以根据时代的变化,还是换到VB.Net平台上吧,其实如果会vb6的话转移到vb.net是不难的,语法跟vb6差不多,有些不一样的东西动用一下搜索引擎就可以了,它的IDE比vb6实在是好用多了。别忘了,现在是2010年,vb6是Windows 98的产物啊……Windows 7开始,Microsoft已经缩减对vb6程序的支持了,Common Dialog控件已经不好使了。据说Windows 8的时候会完全取消对VB6的支持。