• Thứ Sáu, 08/04/2005 14:18 (GMT+7)

    Tạo form hình dạng bất kỳ trong Visual Basic


    Nếu từng lập trình với Visual Basic, hẳn bạn thấy Visual Basic chỉ cho phép tạo giao diện ứng dụng chuẩn với hình chữ nhật truyền thống. Trong khi đó, có nhiều chương trình lại có những hình dáng khác nhau như hình tròn, hình chữ nhật có bo góc. Với sự trợ giúp của các hàm API Windows, Visual Basic cũng có thể làm được điều đó.Trước hết, ta xem xét lại khái niệm Region. Region hiểu nôm na là miền giới hạn của các phần tử giao diện. Các phần tử giao diện không thể vượt ra ngoài giới hạn này. Ưu điểm lớn nhất của Region là có hình dạng tuỳ ý. Có thể chia ra làm bốn loại Region cơ bản: hình chữ nhật, hình chữ nhật có bo góc, hình e-lip và đa giác. Chúng ta có thể dùng kết hợp các hàm API để tạo một Region tùy ý. Các hàm thường dùng để tạo Region là:

    CreateEllipticRgn tạo Region hình elip

    Declare Function CreateEllipticRgn Lib “gdi32” Alias “CreateEllipticRgn” (ByVal X1 As Long, ByVal Y1 As Long, ByVal X2 As Long, ByVal Y2 As Long) As Long

    x1, y1, x2, y2 là tọa độ các điểm trái trên, phải dưới của hình chữ nhật giới hạn elip.                 

    CreatePolygonRgn tạo Region hình đa giác

    Declare Function CreatePolygonRgn Lib “gdi32” Alias “CreatePolygonRgn” (lpPoint As POINTAPI, ByVal nCount As Long, ByVal nPolyFillMode As Long) As Long
    lpPoint trỏ tới thành phần thứ nhất của một mảng có cấu trúc POINTAPI (x as long, y as long) xác định các đỉnh của đa giác (đa giác được xem là khép kín).

    nCount là số đỉnh đa giác.

    nPolyfillmode đặt fill mode để xác định pixel nào nằm trong (ngoài) Region.

    CreatePolyPolygon tạo Region gồm nhiều đa giác

    Declare Function CreatePolyPolygonRgn Lib “gdi32” Alias “CreatePolyPolygonRgn” (lpPoint As POINTAPI, lpPolyCounts As Long, ByVal nCount As Long, ByVal nPolyFillMode As Long) As Long

    CreateRoundRectRgn tạo Region có đường bo góc

    Declare Function CreateRoundRectRgn Lib “gdi32” Alias “CreateRoundRectRgn” (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

    4 đối số đầu chỉ toạ độ điểm đầu điểm cuối của hình chữ nhật.

    2 đối số còn lại là chiều rộng và dài của elip tạo đường bo góc.

    Ngoài ra còn một số hàm khác như FrameRgn, EqualRgn, PaintRgn...

    Dưới đây là một ví dụ đơn giản tạo form có region hình elip. Ví dụ này chưa xử lý các nút đóng/ mở/ thu nhỏ form và điều khiển di chuyển form.

    Trước hết, bạn tạo một form cùng các điều khiển có thuộc tính như sau:

    Form1                

    Appearance: 0

    BorderStyle: 0

    Caption: EllipticRgn

    Picture              

    AutoRedraw: True     

    Name: FrmMain

    ScaleMode: 3

    Viết đoạn code sau vào FrmMain và module Declaration:

    Form  FrmMain

    Private Sub Form_Load()

    Call CreateWindow

    End Sub

     

    Module Declaration

    Public nCount As Integer

    Public hRgn As Long

    Public Declare Function CreateEllipticRgn Lib “gdi32” (ByVal X1 As Long, ByVal Y1 As Long, ByVal X2 As Long, ByVal Y2 As Long) As Long

    Public Declare Function SetWindowRgn Lib “user32” (ByVal hwnd As Long, ByVal hRgn As Long, ByVal bRedraw As Boolean) As Long

    Public Sub CreateWindow()

       hRgn = CreateEllipticRgn(0, 0, 300, 250)

       Call SetWindowRgn(FrmMain.hwnd, hRgn, True)

    End Sub

    Với phần code bổ sung dưới đây cho form FrmMain, bạn có thể nhấn giữ chuột lên vùng trống của form để di chuyển form hay nhấn đúp chuột để đóng form.

    Dim down As Boolean
    Dim t As Integer
    Dim w As Integer

    Private Sub Form_Load()

       down = False

       Call CreateWindow

    End Sub

    Private Sub Form_DblClick()

        Unload FrmMain

    End Sub

    Private Sub Form_MouseDown(Button As Integer, Shift As Integer, x As Single, y As Single)

        down = True
        w = x
        t = y

    End Sub

    Private Sub Form_MouseMove(Button As Integer, Shift As Integer, x As Single, y As Single)

    If down Then

       FrmMain.Top = FrmMain.Top + y - t
       FrmMain.Left = FrmMain.Left + x - w

    End If

    End Sub

    Private Sub Form_MouseUp(Button As Integer, Shift As Integer, x As Single, y As Single)

        down = False

    End Sub

    Chúc thành công.

    Trần Minh
    TranMinhhnvn@yahoo.com

    ID: A0207_90