หากมีคำถาม ขอให้ไปโพสต์ลง เว็บบอร์ดจีทูจีเน็ตดอตคอม ตัวใหม่แทนน่ะครับ

หรือติดต่อเข้ามาทาง Inbox ที่ เฟซบุ๊ค ผมครับ

หน้าหลัก
ข่าวสาร - บทความ ทั้งหมด
VB 6/VB.Net
ASP/ASP.Net
จับฉ่ายคอมพิวเตอร์
เรียนรู้ผ่าน Flash Movie
บทความที่มีผู้ตอบล่าสุด  
 RSS Feeds
 ดาวน์โหลดโปรแกรม RSS Reader ได้ที่นี่ ...   Download โปรแกรม RSS Reader

Forum - www.g2gnet.com
Webmaster - www.g2gnet.com
Visitors - Session views
 5 1 1 2 4 3 9

7 ธันวาคม พ.ศ.2549
12 Users On-Line.
Visitors - Page views
 8 4 0 5 8 9 1
1 กุมภาพันธ์ พ.ศ.2551

Google   
เว็บ g2gnet.com
ขนาดตัวอักษร:  

การแสดงไอคอนใน System Tray

Category »  VB 6/VB.Net
โดย : Webmaster เมื่อ 5/11/2549 13:11:00
(อ่าน : 37187) 
ในบทความนี้ผมจะนำเสนอตัวอย่างในการแสดงไอคอนใน 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

จี ทู จี เน็ต ดอต คอม - g2gNet Dot Com
เลขทะเบียนพาณิชย์อิเล็กทรอนิกส์ 0407314800231
CopyLeft © 2004 - 2099 g2gNet.Com All rights reserved.
Email: [email protected] หรือ โทร. 08-6862-6560