Trong Thế Giới Vi Tính số 96 (Tháng 12/1999) 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.
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
No comments:
Post a Comment