VB编写圆角无边框窗体

  我们经常看到别人的程序界面(UI)都设计的非常漂亮,使用了大量的picture来替换背景或者按钮。但是似乎有的窗体是圆角的,而自己制作出来的就只有方方正正的,是怎么实现的呢?
  首先创建一个窗体,并将窗体的BorderStyle属性设为0然后声明API函数,如下:

  Private Declare Function SetWindowRgn Lib “USER32” (ByVal hWnd As Long, ByVal hRgn As Long, ByVal bRedraw As Boolean) As Long
  Private Declare Function CreateRoundRectRgn Lib “gdi32” (ByVal X1 As Long, ByVal Y1 As Long, ByVal X2 As Long, ByVal Y2 As Long, ByVal X3 As Long, ByVal Y3 As Long) As Long
  Private Declare Function DeleteObject Lib “gdi32” (ByVal hObject As Long) As Long

  我们先来了解一下这几个函数
  函数CreateRoundRectRgn用于创建一个圆角矩形,该矩形由X1,Y1-X2,Y2确定,并由X3,Y3确定的椭圆描述圆角弧度,CreateRoundRectRgn参数、类型及说明:
    X1,Y1 Long,矩形左上角的X,Y坐标
    X2,Y2 Long,矩形右下角的X,Y坐标
    X3 Long,圆角椭圆的宽。其范围从0(没有圆角)到矩形宽(全圆)
    Y3 Long,圆角椭圆的高。其范围从0(没有圆角)到矩形高(全圆)
  函数SetWindowRgn用于将CreateRoundRectRgn创建的圆角区域赋给窗体。
  函数DeleteObject用于将CreateRoundRectRgn创建的区域删除,这是必要的,否则不必要的占用电脑内存。
  接下来声明一个全局变量,用来获得区域句柄,如下:

Dim outrgn As Long

  然后分别在窗体Activate()事件和Unload事件中输入以下代码:

Private Sub Form_Activate()
  Call rgnform(Me, 20, 20) ‘调用子过程,可以通过改变参数fw和fh的值就可以改变圆角大小。
End Sub
Private Sub Form_Unload(Cancel As Integer)
  DeleteObject outrgn ‘将圆角区域使用的所有系统资源释放
End Sub

  接下来我们开始编写子过程:

Private Sub rgnform(ByVal frmbox As Form, ByVal fw As Long, ByVal fh As Long)
  Dim w As Long, h As Long
  w = frmbox.ScaleX(frmbox.Width, vbTwips, vbPixels)
  h = frmbox.ScaleY(frmbox.Height, vbTwips, vbPixels)
  outrgn = CreateRoundRectRgn(0, 0, w, h, fw, fh)
  Call SetWindowRgn(frmbox.hWnd, outrgn, True)
End Sub

  好了,圆角窗体部分的程序写完了,可以运行一下,看看效果如何。Ps:我把背景色改为了黑色。

圆角窗体

圆角窗体


  一般情况下我们拖动一个窗体,必须把鼠标点在标题栏上才能拖动。我们会使用没有标题栏的窗体,这时怎么来拖动窗体呢?别着急我们一步一步来。
  程序实现的思路是在窗体的MouseDown事件(当鼠标在窗体上按下时发生)中获取鼠标相对于窗体的坐标,在MouseOver事件(当鼠标移动时发生)中获取新的鼠标坐标值,显然这两个坐标值的差加上窗体原来的坐标,就是窗体应该移动到的新的坐标值。然后采用From.Move方法把窗体位置移动到新坐标值处即可。
  下面是实现的步骤:
  1、在MouseDown事件发生时判断按键状态并获取鼠标位置:

  Private Sub Form_MouseDown(Button As Integer, Shift As Integer, X As Single, Y As Single)
  ’如果是鼠标左键按下
  If Button = 1 Then
    ’标示为移动状态
    MoveScreen = True
    ’得到鼠标在窗体上的位置(相对与窗体内部坐标)
    MousX = X
    MousY = Y
  End If
  End Sub

  2、当鼠标MouseMove事件发生时,计算新的窗体坐标,并移动:

  Private Sub Form_MouseMove(Button As Integer, Shift As Integer, X As Single, Y As Single)
  ’如果处于鼠标左键按下的状态,即MoveScreen = True时
  If MoveScreen Then
    ’计算新的窗体坐标值
    CurrX = Form1.Left – MousX + X
    CurrY = Form1.Top – MousY + Y
    ’移动窗体到新的位置
    Form1.Move CurrX, CurrY
  End If
  End Sub

您可能还喜欢...

1 条回复

  1. 纪 小年说道:

    TEST

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注

此站点使用Akismet来减少垃圾评论。了解我们如何处理您的评论数据