level 11
--w---
楼主
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。
'在程序开头导入这个,否则会出错
Imports System.Runtime.InteropServices
'声明函数和必要的类型,在Class <类名称> 后面输入
<StructLayout(LayoutKind.Sequential)> _
Public Structure MARGINS
Public cxLeftWidth As Integer
Public cxRightWidth As Integer
Public cyTopHeight As Integer
Public cyButtomheight As Integer
End Structure
<DllImport("dwmapi.dll")> _
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窗体默认大小),如果不是请改成这个大小。
