Lập trình Visual Basic

Đặt biểu tượng chương trình vào
System Tray
Xem bai viet bang font ABC

thdang@tlnet.com.vn

Trong Thế Giới Vi Tính số 96 (Thánh 12/1999) bạn Trần Xuân Hoà (tranvuong@hn.vnn.vn) có hướng dẫn cách đặt biểu tượng chương trình vào System Tray nhưng không hướng dẫn cách xử lý các tình huống xảy ra giữa Mouse & Form, ở bài viết này tôi xin hướng dẫn bạn cách để tạo một menu popup cho chương trình.

Bạn hãy thiết kế các control như sau:

Form: frmStartUp

Menu: mnuDummy, mnuPopUp (Index=0). Tự bạn đặt Caption nhưng name thì phải đúng như vậy mới được. Gán cho sự kiện Click của mnuPopUp(0) một lệnh nào đó để thí nghiệm, trong ví dụ này là nạp biểu mẫu frmCalendar.

mnuDummy

mnuPopUp

Picture: picHook

Image: imgPlay

Lưu ý: chương trình này không hề đá động chi đến cái icon của form, khi chạy nó chỉ nạp bức ảnh trong imgPlay mà thôi. Cho nên biểu tượng của form là gì cũng được.

Khai báo kiểu NOTIFYICONDATA

Private Type NOTIFYICONDATA

    cbSize As Long
    hwnd As Long
    uId As Long
    uFlags As Long
    ucallbackMessage As Long
    hIcon As Long
    szTip As String * 64

End Type

Bạn hãy tiến hành khai báo một loạt các hằng sau:

Private Const NIM_ADD = &H0
Private Const NIM_MODIFY = &H1
Private Const NIM_DELETE = &H2
Private Const WM_MOUSEMOVE = &H200
Private Const NIF_MESSAGE = &H1
Private Const NIF_ICON = &H2
Private Const NIF_TIP = &H4

Private Const WM_LBUTTONDBLCLK = &H203
Private Const WM_LBUTTONDOWN = &H201
Private Const WM_LBUTTONUP = &H202
Private Const WM_RBUTTONDBLCLK = &H206
Private Const WM_RBUTTONDOWN = &H204
Private Const WM_RBUTTONUP = &H205

Khai báo hàm API để phục vụ cho việc đưa icon vào System tray.

Private Declare Function Shell_NotifyIcon Lib "shell32" Alias "Shell_NotifyIconA" (ByVal dwMessage As Long, pnid As NOTIFYICONDATA) As Boolean
Dim T As NOTIFYICONDATA

Các lệnh cần xử lý lúc có sự kiện nạp biểu mẫu.

Private Sub Form_Load()

    T.cbSize = Len(T)
    T.hwnd = pichook.hwnd
    T.uId = 1&
    T.uFlags = NIF_ICON Or NIF_TIP Or NIF_MESSAGE
    T.ucallbackMessage = WM_MOUSEMOVE
    T.hIcon = imgPlay.Picture
    T.szTip = "Agenda2000 (c) NGUYEN HO THIEN DANG" & Chr$(0)
    'Đặt ToolTipText cho biểu tượng trong System Tray.
    Shell_NotifyIcon NIM_ADD, T
    'ẩn form này đi    
    Me.Hide
    Beep

End Sub

Một khi form này UnLoad cũng đồng nghĩa với việc dừng chương trình (xóa Icon trong SysTray)

Private Sub Form_Unload(Cancel As Integer)

    T.cbSize = Len(T)
    T.hwnd = pichook.hwnd
    T.uId = 1&
    Shell_NotifyIcon NIM_DELETE, T
    End

End Sub

Private Sub mnuPopUp_Click(Index As Integer)
    frmCalendar.Show
End Sub

Sự kiện MouseMove trên picHook. Các dòng lệnh sau sẽ đảm nhận việc ẩn hiện cái menu tên là mnuDummy, và đón lấy các sự kiện của Mouse như: Up, Down, DoubleClick. Từ đây bạn chỉ cần đặt các lệnh cần thực hiện ứng với các sự kiện của Mouse là xong.

Với 

WM_LBUTTONDBLCLK: Nút trái được nhấn đôi

WM_LBUTTONDOWN: Nút trái được nhấn xuống

WM_LBUTTONUP: Nút trái được thả ra

WM_RBUTTONDBLCLK: Nút phải được nhấn đôi

WM_RBUTTONDOWN: Nút phải được nhấn xuống

WM_RBUTTONUP: Nút phải được thả ra

Private Sub picHook_MouseMove(Button As Integer, Shift As Integer, X As   

    Single, Y As Single)
    Static State As Boolean
    Static Popped As Boolean
    Static Msg As Long
    Msg = X / Screen.TwipsPerPixelX
    If Popped = False Then
        Popped = True

        Select Case Msg

            Case WM_LBUTTONDBLCLK:
                mnuPopUp_Click 0
            Case WM_LBUTTONDOWN:
                '
            Case WM_LBUTTONUP:
                mnuPopUp_Click 0
            Case WM_RBUTTONDBLCLK:
                '
            Case WM_RBUTTONDOWN:
                '
            Case WM_RBUTTONUP:
                PopupMenu mnuDummy, 2, , , mnuPopUp(0)

        End Select
        Popped = False
    End If

End Sub

Chúc bạn thành công với tác phẩm của mình. Tôi luôn mong nhận được các ý kiến đóng góp để các bài sau được tốt hơn.

Thiên Đăng, thdang@tlnet.com.vn 
03 tháng hai, 2002 07:35:27 CH


PcLeHoan 1996 - 2002
Mirror : http://www.pclehoan.com
Mirror : http://www.lehoanpc.net

Mirror : http://www.ktlehoan.com