分享

VB.Net:如何实现Aero玻璃界面? - gqyz01sw的日志 - 网易博客

 冰山上的薰衣草 2010-10-03

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。

 '在程序开头导入这个,否则会出错
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)

好了,我们现在运行这个程序,看看是什么效果

VB.Net:如何实现Aero玻璃界面? - gqyz01sw - My Scientific Life

??这是怎么回事?为什么没有出现透明效果呢?难道这个函数是假的?
实际上,Aero的透明技术是将一种颜色映射为Alpha颜色,而这个颜色就是黑色。也就是说,我们必须把窗口的背景设置为黑色才能实现透明效果。但是如果直接把属性中的背景设置为黑色会影响界面设计,所以我们在FormLoad中再加一句:

Me.BackColor = Color.Black

这样在设计界面时窗体不是黑的,但运行时窗体颜色会自动设置为黑色,这样就可以实现透明界面了。好了,我们启动程序,看看效果:

VB.Net:如何实现Aero玻璃界面? - gqyz01sw - My Scientific Life

很好,这次的窗体就是全透明的了。但是我们设计程序不可能只有一个窗体,上面还得加一些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)

好了,我们现在运行这个程序,然后单击窗体里面的按钮,看看:

VB.Net:如何实现Aero玻璃界面? - gqyz01sw - My Scientific Life

看,黑色的字体可以用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的支持。

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多