• Thứ Hai, 22/12/2003 20:36 (GMT+7)

    Lập trình Vb6 - khắc phục 1 image chuyển động bị nhấp nháy

    Câu hỏi :
    Hỏi: Lập trình VB6, khi cho 1 image chuyển động thì bị nhấp nháy. Vậy phải làm sao để khắc phục?

    Trả lời :
    Đáp: Đúng là các hàm đồ họa của VB chỉ cho phép hiển thị các phần tử đồ họa tĩnh, còn nếu bạn dùng các hàm này để thay đổi nhanh nội dung ảnh thì sẽ bị hiện tượng nhấp nháy như bạn miêu tả. Để thay đổi ảnh động với tần suất nhanh 1 cách hiệu quả mà ảnh vẫn không bị giựt, bạn nên lập trình dùng DirectX. Đây là giao tiếp lập trình các thiết bị multimedia chuẩn của Microsoft. VB cung cấp 1 component tên là “DirectAnimation Library”, component này chứa 2 control tên là DAViewerControl và DAViewerControl Windowed. Bạn có thể dùng control DAViewerControlWindowed để hiển thị ảnh động. Sau đây chúng tôi giới thiệu qui trình để viết 1 form VB đơn giản trong đó có ảnh bitmap (dạng con cá) chạy từ phải sang trái:

    - Chạy VB, tạo 1 project dạng “Standard Exe”.
    - Ấn phải chuột vào cửa sổ Toolbox của project, chọn mục Components để hiển thị cửa sổ Components, chọn tab Control, duyệt danh sách và chọn mục “DirectAnimation Library” để ‘add’ component này vào Toolbox của project.
    - Vẽ 1 control “DAViewerControl Windowed” trên form, kích thước càng rộng càng tốt (nên hiệu chỉnh kích thước form cho rộng hết màn hình. Tên default của control này là DAViewerControlWindowed1.
    - Vào cửa sổ code của form (chọn menu View.Code) rồi nhập đoạn lệnh sau:

    Option Explicit
    Private Sub Form_Load()
    ‘ Hiển thị image trên control.
    DAViewerControlWindowed1.Image = Overlay(beans(), SolidColorImage( White))
    ‘ Thiết lập chu kỳ hiệu chỉnh là 50ms.
    DAViewerControlWindowed1.UpdateInterval = 0.05
    ‘ Bắt đầu ‘animate’ ảnh.
    DAViewerControlWindowed1.Start
    End Sub

    ‘Hàm này sẽ hiển thị ảnh con cá (ở tập tin fishleft.gif) từ phải sang trái trong control.
    Private Function beans()
    Dim delay As DANumber
    Dim Size As DANumber
    Dim initBean As DAImage
    Dim image0 As DAImage
    Dim bean As Object
    Dim motion As Object

    Set delay = DANumber(0.5)
    Set Size = DANumber(1)
    Set initBean = ImportImage(“c:\samples \vb\DirectXCoffee\ fishleft.gif”)
    Set image0 = CreateObject(“ DirectAnimation.DAImage”)
    image0.Init DAStatics.Until(initBean, TimerAnim(delay), image0)
    Set bean = image0.Transform( Scale2UniformAnim(Size))
    Set motion = Mul(LocalTime, DANumber(-0.01))
    Set beans = bean.Transform(Translate2Anim (motion, DANumber(0)))
    End Function
    Chuyên mục: Lập trình