|
說明
基本上, 表單縮小後只能在「開始」功能表右邊的工作列, 要縮到右下角要花功夫;右下角的圖示都不是表單或程式, 對 Windows 來說, 它只是一個圖示, 而想建立此一圖示, 方法是呼叫Shell_NotifyIconA API 函數 過程是這樣的 需填入 NOTIFYICONDATA 資料結構的長度。固定Len(nid) handle of window, 指被縮小進來的Window。 使用者為圖示所設定的 ID。可自訂 用來設定以下三個參數(uCallbackMessage、hIcon、szTip)是否有效, 通常設定成 (NIF_MESSAGE + NIF_ICON + NIF_TIP) 表示全部有效。 將來使用者在圖示上按下滑鼠時, Windows 會以訊息通知視窗程序, 而此一參數為訊息之編號。 圖示。 提示訊息。 該Function有一個傳回值,如果呼叫成功傳回1,否則傳回 0 para_Form指的是要被縮小的Form,當執行Shell_NotifyIconA(NIM_ADD, nid)成功時,表示已有圖示於其上,所以我們將Form 隱藏,而什麼時候讓Form再度出現呢?當我們在Icon上按一下Mouse左鍵時會出現,而這應該如做呢?方才說過,因NIF_MESSAGE的設定,使得在Icon上的Mosue Click等會傳送nid.uCallbackMessage的訊息給 nid.hWnd所在的Window Procedure,所以我們使用SubClass的動作,在NICON.BAS中的WndProcForIcon中,Check是否有我們定義的訊息出現,而進一步加以處理。 DelNIcon 來移除Icon,並取消SubClass的動作 ModNIcon 更動由AddNIcon所做出Icon的圖示與Tip
程式 '以下文章在NIcon.cls Private m_tip As String Private m_MsgNo As Long Private m_ID As Long Private m_hIcon As Long Private m_Icon As IPictureDisp Private m_Form As Form Private nid As NOTIFYICONDATA Private HadAdd As Boolean Private preWndProc As Long Public Property Get Tip() As String '取得Tip的文字 Tip = m_tip End Property '設定Mouse移至Icon時所show出之Tip Public Property Let Tip(ByVal vNewValue As String) m_tip = vNewValue End Property Public Property Get MsgNo() As Long MsgNo = m_MsgNo - WM_USER End Property '設定Mosue Click於Icon時,所送出之訊息編號 Public Property Let MsgNo(ByVal vNewValue As Long) m_MsgNo = vNewValue + WM_USER End Property '取得ID Public Property Get ID() As Long ID = m_ID End Property '設定ID Public Property Let ID(ByVal vNewValue As Long) m_ID = vNewValue End Property '設定Icon的圖示 Public Property Set Icon(ByVal vNewValue As IPictureDisp) Set m_Icon = vNewValue m_hIcon = m_Icon.Handle End Property '將原先的Form隱藏,並在右下方加入一個Icon,傳入的是待處理的Form Public Function AddNIcon(ByVal para_form As Form) As Boolean Dim ret As Long AddNIcon = False If Not HadAdd Then Call Shell_NotifyIconA(NIM_DELETE, nid) Set m_Form = para_form nid.cbSize = Len(nid) nid.hWnd = m_Form.hWnd nid.uID = m_ID nid.uFlags = NIF_ICON + NIF_TIP + NIF_MESSAGE nid.hIcon = m_hIcon nid.szTip = m_tip + Chr(0) nid.uCallbackMessage = m_MsgNo Dim i As Integer i = Shell_NotifyIconA(NIM_ADD, nid) If i = 1 Then '新增成功 IconMsg = m_MsgNo preWndProc = GetWindowLong(m_Form.hWnd, GWL_WNDPROC) '記錄原先window procedure的Addr於Window的extra 32 bits,每個Window都會保留32Bits給Application運用,在此記錄preWndProc的值 ret = SetWindowLong(m_Form.hWnd, GWL_USERDATA, preWndProc) ret = SetWindowLong(m_Form.hWnd, GWL_WNDPROC, AddressOf WndProcForIcon) m_Form.Hide '如果不想加入時就隱藏form,這行請Mark,並在您的程式中自行決定何時Hide form AddNIcon = True HadAdd = True End If End If End Function '刪除於右下方的Icon Public Sub DelNIcon() Dim ret As Long If preWndProc <> 0 Then ret = SetWindowLong(m_Form.hWnd, GWL_WNDPROC, preWndProc) preWndProc = 0 End If If HadAdd Then Call Shell_NotifyIconA(NIM_DELETE, nid) HadAdd = False Set m_Form = Nothing End If End Sub '修改Icon的設定,能改的只有Icon的圖與Icon的Tip Public Function ModNIcon() As Boolean ModNIcon = False If HadAdd Then nid.hIcon = m_hIcon nid.szTip = m_tip + Chr(0) Dim i i = Shell_NotifyIconA(NIM_MODIFY, nid) If i = 1 Then ModNIcon = True End If End If End Function Private Sub Class_Initialize() m_MsgNo = WM_USER m_ID = 9999 m_tip = Trim(Screen.ActiveForm.Caption) Set m_Form = Screen.ActiveForm m_hIcon = m_Form.Icon.Handle HadAdd = False End Sub Private Sub Class_Terminate() Call DelNIcon End Sub '以下文在NIcon.Bas Public Const WM_USER = &H400 Public Const GWL_WNDPROC = (-4) Public Const GWL_USERDATA = (-21) Public Const WM_LBUTTONDOWN = &H201 Public Const NIM_ADD = 0 Public Const NIM_MODIFY = 1 Public Const NIM_DELETE = 2 Public Const NIF_MESSAGE = 1 Public Const NIF_ICON = 2 Public Const NIF_TIP = 4 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 Public IconMsg As Long Declare Function CallWindowProc Lib "user32" Alias "CallWindowProcA" (ByVal lpPrevWndFunc As Long, ByVal hWnd As Long, ByVal Msg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long Declare Function GetWindowLong Lib "user32" Alias "GetWindowLongA" (ByVal hWnd As Long, ByVal nIndex As Long) As Long Declare Function SetWindowLong Lib "user32" Alias "SetWindowLongA" (ByVal hWnd As Long, ByVal nIndex As Long, ByVal dwNewLong As Long) As Long Declare Function Shell_NotifyIconA Lib "SHELL32" (ByVal dwMessage As Long, lpData As NOTIFYICONDATA) As Integer Function WndProcForIcon(ByVal hWnd As Long, ByVal Msg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long Dim prevWndProcForIcon As Long '取回前一個Window procdure所在的位置,這個值是在Nicon.AddNicon中放進去的 prevWndProcForIcon = GetWindowLong(hWnd, GWL_USERDATA) If Msg = IconMsg Then If lParam = WM_LBUTTONDOWN Then Dim mForm As Form For Each mForm In Forms If mForm.hWnd = hWnd Then mForm.Show End If Next Else If lParam = WM_RBUTTONDOWN Then '若您按Mosue右鍵,要執行什麼事,請在這裡加進來 'Else If lParam = WM_??? Then'其他訊息 '其他處理程式 End If End If WndProcForIcon = CallWindowProc(prevWndProcForIcon, hWnd, _ Msg, wParam, lParam) End Function '以下在Form '執行時,請不要用強制結束的方式結束, '要讓NICON Class有機會執行到Terminate的Code Private nid As New NIcon Private Sub Command1_Click() nid.Tip = "HaHa!!" nid.ID = 9998 '若沒設,會使用內訂值9999 nid.MsgNo = 2 '若沒設,內訂0 Call nid.AddNIcon(Me) '增加新圖示 End Sub Private Sub Command2_Click() nid.DelNIcon End Sub Private Sub Command3_Click() '使用自訂圖示 '以下這一行可以修改成您所要的Icon後再unmark 'Set nid.Icon = LoadPicture("f:\vbprg\nicon\technlgy.ico") nid.Tip = "Another Tip" Call nid.ModNIcon End Sub '不要在Command1沒有按下之前就按Command4 Private Sub Command4_Click() Me.Hide '按了Command1後使之產生Icon於右下方,再於Icon處mouse Click 'form會再出現,要讓Form再度不見時,請直接執行me.hide End Sub 另外還可以用非SubClassing去做 請參考 Icon加入SystemTray 相關資訊
文件出處
|
|
|
|
如果對本站有任何建議,歡迎來信給Honey,我們會盡快給您答覆 |