• Thứ Ba, 23/03/2004 11:16 (GMT+7)

    Câu hỏi :
    Xin chỉ cách tạo form có hình dạng bất kỳ với VB6.0.

    Trả lời :

    Windows dùng khái niệm 'Region' để qui định hình dạng và ranh giới của 1 form giao diện của ứng dụng bất kỳ. Windows cũng cung cấp 1 tập các hàm API để người lập trình có thể tạo 'region' cho ứng dụng của họ, nhưng thường các ứng dụng không tạo region theo ý riêng mà để cho hệ thống tạo dùm region truyền thống hình chữ nhật. Các hàm API sau cho phép bạn tạo region miêu tả hình dạng form giao diện: CreateRectRgn(), CreateEllipticRgn(), CreatePolygonRgn(), CombineRgn(), CombineTransform(), SetWindowRgn()... Để bạn thấy rõ hơn về qui trình gọi các hàm API để tạo 1 form có hình dạng bất kỳ, chúng tôi lấy thí dụ về qui trình tạo ứng dụng VB có form giao diện như sau:

    Chú ý form trên là sự tổng hợp của 3 region: 1 region hình chữ nhật bên trái, 1 region hình ellipse bên trái và 1 region ellipse khác nằm bên phải. Qui trình tạo form VB 6.0 trên như sau:

    1. Chạy VB 6.0, chọn loại ứng dụng 'Standard EXE' có form giao diện ban đầu là hình chữ nhật với tên là Form1, titlebar có nội dung là Form1.

    2. Trong cửa sổ Properties của Form1 bên góc dưới phải, thay đổi thuộc tính ScaleHeight=200 (độ cao của form), thay đổi thuộc tính ScaleWidth=300 (độ rộng của form).

    3. Nhấn phải chuột vào mục Form1 trong cửa sổ Project nằm ở góc trên phải màn hình để hiển thị danh sách lệnh tương ứng, chọn mục 'View Code' để hiển thị cửa sổ viết code cho Form1 rồi viết đoạn code cho hàm Form_Load() cho form như sau:

    Private Sub Form_Load()

       Call CreateRegion

    End Sub

    4. Nhấn phải chuột vào mục Project1 trong cửa sổ Project để hiển thị danh sách lệnh tương ứng, chọn mục Add.Module để tạo mới 1 module chứa code cho ứng dụng (tên mặc định là Module1) rồi viết đoạn code cho hàm CreateRegion như sau:

    Option Explicit

    Public Declare Function CreateRectRgn Lib 'gdi32' (ByVal X1 As Long, ByVal Y1 As Long, ByVal X2 As Long, ByVal Y2 As Long) 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 CombineRgn Lib 'gdi32' (ByVal hDestRgn As Long, ByVal hSrcRgn1 As Long, ByVal hSrcRgn2 As Long, ByVal nCombineMode As Long) As Long

    Public Declare Function SetWindowRgn Lib 'user32' (ByVal hWnd As Long, ByVal hRgn As Long, ByVal bRedraw As Boolean) As Long

    ' Thủ tục tạo region có hình dạng theo yêu cầu

    Public Sub CreateRegion()

    Dim hRgn1, hRgn2, hRgn3 As Long

    Dim ret As Long

       ' tạo 1 region hình chữ nhật

       hRgn1 = CreateRectRgn(0, 0, 100, 200)

       ' tạo 1 region hình ellipse

       hRgn2 = CreateEllipticRgn(0, 0, 200, 200)

       ' tạo 1 region hình ellipse

       hRgn3 = CreateEllipticRgn(150, 0, 500, 200)

       ' tổng hợp 2 region đầu thành 1

       ret = CombineRgn(hRgn1, hRgn1, hRgn2, 2)

       ' tổng hợp kết quả với region ellipse bên phải

       ret = CombineRgn(hRgn1, hRgn1, hRgn3, 2)

       ' thiết lập region vừa tổng hợp cho form

       ret = SetWindowRgn(Form1.hWnd, hRgn1, True)

    End Sub

    5. Chọn menu Run.Start để chạy thử ứng dụng, bạn sẽ thấy form có giao diện như  đặc tả  trên. Lưu ý bạn chỉ nên vẽ các phần tử giao diện trong Form1 sao cho nó nằm trong vùng giới hạn của region của Form1 vì nếu nó nằm ngoài region (mặc dù vẫn nằm trong hình chữ nhật bao quanh Form1), bạn sẽ không thể tương tác với đối tượng nằm ngoài region đó.

    Bạn có thể liên hệ tòa soạn PCWorld để copy toàn bộ project VB của ứng dụng demo này (tên là VBMyAnyForm).

     

    Chuyên mục: Lập trình