• Thứ Năm, 30/12/2004 08:45 (GMT+7)

    Hiện Tooltip trong VB


    Một trong những chức năng thân thiện của ứng dụng là hiển thị tooltip - thông tin ngắn gọn về chức năng của menu khi rê chuột trên đó. Theo yêu cầu của nhiều bạn đọc, bài này hướng dẫn cách tạo tooltip trong VB.

    Khi thiết kế menu bằng tiện ích "Menu Editor" trong VB, ta không thể khai báo trực quan các thuộc tính ToolTip và StatusBar cho từng option menu. Nếu muốn hiển thị tooltip hay chuỗi đặc tả chức năng của từng option menu trên thanh StatusBar khi người dùng di chuột lên nó, bạn có thể viết hàm xử lý sự kiện WindowProc() cho cửa sổ chứa menu đó; trong hàm WindowProc(), bạn chặn thông báo WM_MENUSELECT rồi viết code hiển thị tooltip hay chuỗi đặc tả lên StatusBar hoặc lên cửa sổ bất kỳ nào đó.

    Để demo cụ thể ý tưởng trên, bạn hãy chạy VB, trên cửa sổ New ban đầu hãy chọn icon "VB Application Wizard", trả lời các tham số trên các cửa sổ Wizard để tạo 1 ứng dụng dạng "Single Document Interface". Đây là dạng ứng dụng có 1 thanh menu, 1 toolbar và 1 cửa sổ hiển thị dữ liệu của người dùng. Sau đó hãy chọn menu Run.Start để chạy thử ứng dụng này, bạn sẽ thấy nó có sẵn thanh menu, 1 toolbar chứa các thành phần mặc định và 1 thanh status bar. Khi dời chuột lên trên icon toolbar hay trên 1 option của menu nào đó, bạn chưa thấy chuỗi đặc tả chức năng của phần tử tương ứng trên thanh status bar. Bạn hãy nhấn đúp chuột vào mục Module1 trên cửa sổ Project của ứng dụng để hiển thị cửa sổ soạn code và nhập đoạn code dưới đây. Sau đó, bạn chạy thử ứng dụng, dời chuột về 1 menu option nào đó, bạn sẽ thấy chuỗi đặc tả "Cursor đang ở menu option số i" trên thanh status bar.

     

     

    'code của module1
    Option Explicit
    'khai báo các hàm API cần dùng
    Private Declare Function CallWindowProc Lib "user32" Alias "CallWindowProcA" (ByVal lpPrevWndFunc As Long, ByVal hwnd As Long, ByVal Msg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long
    Private Declare Function SetWindowLong Lib "user32" Alias "SetWindowLongA" (ByVal hwnd As Long, ByVal nIndex As Long, ByVal dwNewLong As Long) As Long
    Private Declare Function GetMenu Lib "user32" (ByVal hwnd As Long) As Long
    Private Declare Function GetSubMenu Lib "user32" (ByVal hMenu As Long, ByVal nPos As Long) As Long
    Private Declare Function GetMenuItemCount Lib "user32" (ByVal hMenu As Long) As Long
    Private Declare Function GetMenuState Lib "user32" (ByVal hMenu As Long, ByVal wID As Long, ByVal wFlags As Long) As Long
    Private Declare Function GetMenuString Lib "user32" Alias "GetMenuStringA" (ByVal hMenu As Long, ByVal wIDItem As Long, ByVal lpString
    As String, ByVal nMaxCount As Long, ByVal wFlag As Long) As Long
    'khai báo các hằng và biến
    Private Const MF_BYPOSITION = &H400&
    Private Const MF_HILITE = &H80&
    Private Const WM_MENUSELECT = &H11F
    Private Const GWL_WNDPROC = -4
    Public fMainForm As frmMain
    Public lpPrevWndProc As Long
    Public gHW As Long
    'thiết lập WindowProc cho cửa sổ
    Public Sub Hook()
    'Begin hooking into messages.
    lpPrevWndProc = SetWindowLong(gHW, GWL_WNDPROC, AddressOf WindowProc)
    End Sub
    'hàm gỡ bỏ WindowProc cho cửa sổ
    Public Sub Unhook()
    'Cease hooking into messages.
    SetWindowLong gHW, GWL_WNDPROC, lpPrevWndProc
    End Sub
    'hàm xử lý các sự kiện của cửa sổ
    Function WindowProc(ByVal hw As Long, ByVal uMsg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long
      'kiểm tra xem thông báo có phải là WM_MENUSELECT?
    If uMsg = WM_MENUSELECT Then
    fMainForm.sbStatusBar.Panels(1).Text = "Cursor đang ở menu option số " & (wParam And &HFF)
    End If
    'Gởi thông báo cho Windows xử lý tiếp
    WindowProc = CallWindowProc(lpPrevWndProc, hw, uMsg, _
    wParam, lParam)
    End Function
    'thủ tục miêu tả điểm nhập của ứng dụng (do VB tạo tự động)
    Sub Main()
    Set fMainForm = New frmMain
    fMainForm.Show
    End Sub
    'hàm xử lý sự kiện Form_Load
    Private Sub Form_Load()
    Me.Left = GetSetting(App.Title, "Settings", "MainLeft", 1000)
    Me.Top = GetSetting(App.Title, "Settings", "MainTop", 1000)
    Me.Width = GetSetting(App.Title, "Settings", "MainWidth", 6500)
    Me.Height = GetSetting(App.Title, "Settings", "MainHeight", 6500)
    'Lưu handle của form vào biến toàn cục gHW.
    gHW = Me.hwnd
    'Thiết lập WindowProc choform
    Hook
    End Sub
    ...
    'hàm xử lý sự kiện Form_Unload
    Private Sub Form_Unload(Cancel As Integer)
    Dim i As Integer
    'close all sub forms
    For i = Forms.Count - 1 To 1 Step -1
    Unload Forms(i)
    Next
    If Me.WindowState <> vbMinimized Then
    SaveSetting App.Title, "Settings", "MainLeft", Me.Left
    SaveSetting App.Title, "Settings", "MainTop", Me.Top
    SaveSetting App.Title, "Settings", "MainWidth", Me.Width
    SaveSetting App.Title, "Settings", "MainHeight", Me.Height
    End If
    ' Gỡ bỏ hàm WindowProc
    Unhook
    End Sub

     

    Nguyễn Văn Hiệp

    ID: A0412_129