ดาวน์โหลดโปรแกรม RSS Reader ได้ที่นี่ ...

|
|
|
Visitors - Session views |       
7 ธันวาคม พ.ศ.2549 102 Users On-Line. |
|
Visitors - Page views |        1 กุมภาพันธ์ พ.ศ.2551 |
|
|
|
 |
|
การแสดงไอคอนใน System Tray |
Category »
VB 6/VB.Net โดย : Webmaster เมื่อ 5/11/2549 13:11:00 | (อ่าน : 40061) |
ในบทความนี้ผมจะนำเสนอตัวอย่างในการแสดงไอคอนใน System Tray ก็ส่วนที่แสดงสถานะของทาสก์บาร์ ตรงแถวๆนาฬิกานั่นแหละครับ โดยที่เราจะอาศัย API เพื่อแสดงไอคอนใน System Tray ได้ง่ายๆ ด้วยการเรียกใช้งาน Shell_NotifyIcon ฟังค์ชั่น Shell_NotifyIcon จะมีลักษณะดังต่อไปนี้ Public Declare Function Shell_NotifyIcon Lib "shell32" Alias "Shell_NotifyIconA" & _ (ByVal dwMessage As Long, & _ pnid As NOTIFYICONDATA) As Boolean
โดยที่
|
ดูรายละเอียดเพิ่มเติมได้ที่ MSDN Library: » HOWTO: Use the System Tray Directly from Visual Basic 5.0 Article ID: Q176085 » HOWTO: Use Icons with the Windows 95 System Tray Article ID: Q149276
ดาวน์โหลด Source Code (VB6) ที่นี่... |
|
|
|
|
dwMessage คือ เมสเสจเพื่อระบุว่าต้องการทำงานใด โดยมีค่าดังต่อไปนี้ คือ ' Constants required by Shell_NotifyIcon API call: Public Const NIM_ADD = &H0 Public Const NIM_MODIFY = &H1 Public Const NIM_DELETE = &H2 ' ----------------------------------------- ' คำอธิบาย: NIM_ADD ใช้เพิ่มไอคอนเข้าไปใน System Tray NIM_MODIFY แก้ไขไอคอน NIM_DELETE ลบไอคอนออกจาก System Tray
pnid คือ Pointer ที่ชี้ไปยังโครงสร้าง NOTIFYICONDATA ซึ่งจะประกอบด้วยสมาชิกต่อไปนี้ ' User defined type required by Shell_NotifyIcon API call Public 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
โดยสมาชิกแต่ละตัวจะมีความหมายดังต่อไปนี้
cbSize ขนาดของข้อมูลในโครงสร้าง NOTIFYICONDATA เราสามารถใช้ฟังค์ชั่น Len เพื่อหาขนาดของโครงสร้างนี้
hWnd แฮนเดิลของ Windows ที่จะรับเมสเสจ เราสามารถใช้คุณสมบัติ hWnd ของคอนโทรล หรือ ฟอร์มสำหรับพารามิเตอร์ตัวนี้
uId ตัวระบุไอคอนที่จะแสดงใน System Tray สามารถกำหนดเป็นค่าใดๆก็ได้ หรืออาจกำหนดเป็น vbNull
uFlags เป็นอาเรย์ของแฟลก (Flag) เพื่อระบุว่าสมาชิกต่างๆในโครงสร้างนี้ แสดงถึงข้อมูลใด ด้วยการนำค่าของแต่ละแฟลกมาบวกกันด้วย โอเปอร์เรเตอร์ OR โดยแต่ละแฟลกจะมีความหมายดังต่อไปนี้ คือ ' การกำหนดค่าในส่วนของ uFlags Public Const NIF_MESSAGE = &H1 Public Const NIF_ICON = &H2 Public Const NIF_TIP = &H4
NIF_ICON ระบุว่าค่า hIcon คือไอคอนที่จะแสดงใน System Tray NIF_MESSAGE ระบุว่าค่า uCallBackMessage จะถูกใช้สำหรับการ Callback message NIF_TIP ระบุว่าค่า szTip ใช้สำหรับแสดงทูลทิป (ToolTip) ของไอคอน
uCallBackMessage เมสเสจที่จะถูกส่งกลับมาหาโปรแกรม เพื่อระบุว่ามีเหตุการณ์ (Event) เกิดขึ้นที่ System Tray ปกติเราจะใช้ WM_MOUSEMOVE เพราะมีค่าเท่ากับอีเวนท์ MouseMove ใน Visual Basic ทำให้ไม่ต้องทำ Sub Class เพื่อดักจับเมสเสจ อันจะทำให้โปรแกรมมีความซับซ้อนมากขึ้น
hIcon แฮนเดิลของไอคอนที่จะแสดงบน System Tray อาจจะเป็นคุณสมบัติ Icon ของคอนโทรล image ของคอนโทรล image หรือ ภาพไอคอน
szTip ข้อความที่จะใช้เป็นทูลทิป ความยาวคงที่ 64 ไบต์ ข้อความนี้ต้องลงท้ายด้วยอักขระ Null (หรือ vbNullChar) เสมอ
การทำงาน
อันดับแรกเราต้องกำหนดข้อมูลต่างสำหรับฟังค์ชั่น Shell_NotifyIcon ให้สมบูรณ์ (ตามรายละเอียดด้านบน) โดยกำหนดไว้ใน Module แยกต่างหากจากฟอร์มน่ะครับ ต่่อจากนั้นเราจึงจะเพิ่มไอคอนเข้าไปไว้ใน System Tray ดังนี้คือ
Private Sub Form_Load() 'the form must be fully visible before calling Shell_NotifyIcon Me.Show Me.Refresh With nid .cbSize = Len(nid) .hwnd = Me.hwnd .uId = vbNull .uFlags = NIF_ICON Or NIF_TIP Or NIF_MESSAGE .uCallBackMessage = WM_MOUSEMOVE .hIcon = Me.Icon .szTip = "Your ToolTip" & vbNullChar End With ' Shell_NotifyIcon NIM_ADD, nid End Sub
เมื่อเราเรียกใช้งานฟังค์ชั่นนี้ ไอคอนของฟอร์มจะปรากฏอยู่บน System Tray หลังจากนั้นเมื่อเลื่อนเมาส์พอยเตอร์ไปเหนือไอคอนบน System Tray ฟอร์มก็จะได้รับเมสเสจ WM_MOUSEMOVE ซึ่งก็คือการเกิดเหตุการณ์ MouseMove ของฟอร์มนั่นเอง
ค่า Argument X ของโปรซีเยอร์ Form_MouseMove ทำหน้าที่ระบุถึงเมาส์อินพุต อันได้แก่ การคลิ๊กซ้าย, คลิ๊กขวา หรือ การกดดับเบิ้ลคลิ๊ก และคุณสมบัติ TwipsPerPixelX ของจอภาพ เราสามารถรับค่าเมาส์อินพุตด้วยการหารค่า Argument ด้วยคุณสมบัตินี้ (Screen.TwipsPerPixelX) แล้วนำค่าที่ได้มาประมวลผลตามต้องการ เช่น
Private Sub Form_MouseMove(Button As Integer, Shift As Integer, X As Single, Y As Single) 'this procedure receives the callbacks from the System Tray icon. Dim Result As Long Dim msg As Long ' The value of X will vary depending upon the scalemode setting If Me.ScaleMode = vbPixels Then msg = X Else msg = X / Screen.TwipsPerPixelX End If Select Case msg Case WM_LBUTTONUP ' 514 restore form window Me.WindowState = vbNormal Result = SetForegroundWindow(Me.hwnd) Me.Show Case WM_LBUTTONDBLCLK ' 515 restore form window Me.WindowState = vbNormal Result = SetForegroundWindow(Me.hwnd) Me.Show Case WM_RBUTTONUP ' 517 display popup menu Result = SetForegroundWindow(Me.hwnd) Me.PopupMenu Me.mPopupSys End Select ' End Sub
การลบไอคอนออกจาก System Tray ให้กำหนดค่า dwMessage เป็น NIM_DELETE แล้วจึงเรียกใช้ฟังค์ชั่น Shell_NotifyIcon อีกครั้งดังนี้
Private Sub Form_Unload(Cancel As Integer) ' This removes the icon from the system tray Shell_NotifyIcon NIM_DELETE, nid End Sub
Code ที่เหลือของโปรแกรม Private Sub Form_Resize() ' This is necessary to assure that the minimized window is hidden If Me.WindowState = vbMinimized Then Me.Hide End Sub
Private Sub mPopExit_Click()' ต้องไปสร้างใน Menu Editor ให้ชื่อว่า mPopupExit ' Called when user clicks the popup menu Exit command Unload Me End Sub
Private Sub mPopRestore_Click()' ต้องไปสร้างใน Menu Editor ให้ชื่อว่า mPopupRestore Dim Result As Long ' Called when the user clicks the popup menu Restore command Me.WindowState = vbNormal Result = SetForegroundWindow(Me.hwnd) Me.Show End Sub
 การสร้างเมนู เพื่อที่คุณจะสามารถคลิ๊กขวาี่เมาส์ในการเลือกเหตุการณ์ MouseMove ได้
เป็นไงบ้างล่ะครับ จากรายละเอียดที่ผ่านมา ผมได้แสดงให้เห็นถึงการเพิ่ม และ ลบไอคอนเข้าไปไว้ใน System Tray นั้นค่อนข้างจะง่ายดาย (เสียเหลือเกิน) ผลที่ได้นี้มันก็ทำให้โปรแกรมที่เราพัฒนาขึ้นมาดูดีมีชาติตระกูลขึ้นอีกโขเลยครับ โปรแกรมจากราคา 200 ก็อาจขยับไปที่ 299 บาทขาดตัวก็เป็นได้น่ะ อิอิอิ
สำหรับรายละเอียดเพิ่มเติม คุณคงต้องเข้าไปศึกษาที่ MSDN Library HOWTO: Use the System Tray Directly from Visual Basic 5.0 Article ID: Q176085 และ HOWTO: Use Icons with the Windows 95 System Tray Article ID: Q149276 |
|
|