Monday, October 26, 2009

Đặt biểu tượng chương trình vào System Tray

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.

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

No comments:

Post a Comment