【转】PB实现在通知区域添加图标
“為應用程序在任務欄通知區(qū)域加個圖標,按最小化控制菜單后隱藏窗口,單擊通知區(qū)域內的圖標恢復并顯示窗口,右擊通知區(qū)域內的圖標彈出快捷方式菜單”,已成為時下程序設計上的一個時髦主題,有不少文章介紹了如何實現,但在?PowerBuilder?下由于調用 Win32 API 函數和消息處理不很方便,因而很少有人去涉及。本文將討論如何在?PowerBuilder?下使用任務欄通知區(qū)域。
?
?
1.相關的 Win32 API 函數
?
Win32 API 函數 Shell_NotifyIconA 是本文所涉 Win32 API 函數中最為關鍵者,通過它可以添刪通知區(qū)域圖標,其 Powersoft 原型為:
?
Function Boolean Shell_NotifyIconA(ULong dwMessage,stc_notifyicondata pnid) Library "Shell32.dll"
?
其中 stc_notifyicondata 是一個結構,其成員有:
?
Ulong cbSize // 結構大小為 88 字節(jié)
Ulong hWnd // 接受通知消息的窗口句柄
Ulong uID? // 通知區(qū)域圖標的標識號
Ulong uFlags // 指示哪些成員是有效的
Ulong uCallbackMessage // 通知消息的標識號
Ulong hIcon // 圖標的句柄
Char szTip[64] // 圖標提示
Ulong dwState // 圖標狀態(tài) (IE5)
Ulong dwStateMask // 狀態(tài)掩碼 (IE5)
Char szInfo[256] // balloon tooltip (IE5)
Ulong uTimeout // balloon tooltip 顯示時間 (IE5)
Char szInfoTitle[64] // balloon tooltip 標題 (IE5)
Ulong dwInfoFlags // balloon tooltip 標志 (IE5)
uFlags 可以是 NIF_MESSAGE(1)、NIF_ICON(2)、NIF_TIP(4)、NIF_STATE(8) 和 NIF_INFO(16) 的組合。如 uFlags = 7 表示結構的 uCallbackMessage、hIcon 和 szTip 是有效的,其他的一些成員的值將被忽略。
?
由于此處涉及回調消息和圖標,所以要用到另三個 Win32 API 函數,他們的 Powersoft 原型為:
?
Function UINT RegisterWindowMessageA(String lpString) Library "User32.dll"?
?
Function ULong LoadIconA(ULong hInstance,ULong lpIconName) Library "User32.dll"
?
Function Boolean DestroyIcon(ULong hIcon) Library "User32.dll"
?
函數 RegisterWindowMessageA 用來定義一個唯一的窗口消息,他的返回值被賦給 uCallbackMessage;函數 LoadIconA 用來加載一個圖標,由于此處要加載 OEM 圖標,所以聲明 lpIconName 的類型為 Ulong 而不是String;函數 DestroyIcon 釋放圖標所占內存。
?
2.添刪通知區(qū)域圖標
?
為了便于演示,筆者將在 w_main 的 Open 事件中添加通知區(qū)域圖標,在 Close 事件中刪除狀態(tài)區(qū)圖標,最小化 w_main 時隱藏 w_main,單擊通知區(qū)域內的圖標時恢復并顯示 w_main,右擊通知區(qū)域內的圖標時顯示快捷方式菜單,即在整個程序運行過程中通知區(qū)域的圖標始終存在。
?
筆者先聲明一個實例變量:
?
stc_notifyicondata??? istc_nid
?
添加通知區(qū)域圖標
?
定義窗口 w_main 的 Open 事件腳本為:
?
w_main.Event Open( ) returns long
istc_nid.cbSize = 88 // 結構大小
istc_nid.hWnd = Handle(this) // w_main 句柄
istc_nid.uFlags = 7 // uCallbackMessage、hIcon 和 szTip 有效
istc_nid.uID = 0 // 通知區(qū)域圖標的標識號
istc_nid.uCallbackMessage = RegisterWindowMessageA("Demo") // 定義消息
istc_nid.hIcon = LoadIconA(0, 32517) // 加載 Windows Logo 圖標
istc_nid.szTip = "Demostration Application" // 提示
Shell_NotifyIconA(0, istc_nid)? // 添加圖標
刪除通知區(qū)域圖標
?
定義窗口 w_main 的 Close 事件腳本為:
?
w_main.Event Close( ) returns long
Shell_NotifyIconA(2, istc_nid)? // 刪除通知區(qū)域圖標
DestroyIcon(istc_nid.hIcon) // 釋放內存
最小化窗口時隱藏窗口
?
定義窗口 w_main 的 Resize 事件腳本為:
?
w_main.Event Resize( ) returns long
if SizeType = 1 then Hide()
3.處理通知消息
?
當用戶在通知區(qū)域內的圖標上移動鼠標、單擊、雙擊或右擊時,Shell 會用 uCallbackMessage 所指示的標識號向 hWnd 指定的窗口發(fā)送通知消息。一般來說通知消息的參數 lparam 是個指向結構的指針,不過幸好如果我們象示例一樣只用到較早版本 Shell 的行為的話,lparam 就只是個鼠標事件的標識號而已。處理這樣的消息只要用 w_main 窗口的 Other 事件即可,可定義腳本為:
?
w_main.Event Other(Ulong wParam, Long lParam ) returns long
// 參數 wParam 指示對應的通知區(qū)域圖標的標識號;
// 參數 lParam 指示對應的消息類型(消息標識號)。
if Message.Number = istc_nid.uCallbackMessage and wParam = istc_nid.uID then // 判斷消息是否是待處理的消息
??? choose case lParam
??????? case 512? // 鼠標移動
??????? case 513? // 單擊
??????????? Show()
??????????? WindowState=Normal!
??????? case 515? //雙擊
??????? case 516? //右擊
??????????? ShowSCMenu()
??? end choose
end if
?轉載于:https://www.cnblogs.com/midu/archive/2012/09/04/2670553.html
總結
以上是生活随笔為你收集整理的【转】PB实现在通知区域添加图标的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 网红彩虹夫妇称带货一天赚400万 官方介
- 下一篇: 上市2年销量28万辆!比亚迪汉家族7月狂