使用系统托盘图标,显示 Balloon Tooltip 的 MASM32 演示代码

;功能:演示使用系统托盘图标,显示BalloonTooltip
;作者: PurpleEndurer | 紫郢剑侠㊣ 于广西河池
;日期内容
;----------------------------------------------------------------------
;2007.08.23完成。
;2007.08.21创建。


.386
.model flat, stdcall
option casemap: none

include/masm32/ include/windows.inc

include/masm32/ include/kernel32.inc
includelib/masm32/ lib/kernel32.lib

;include/masm32/include/ole32.inc
;includelib/masm32/lib/ole32.lib

include/masm32/ include/shell32.inc
includelib/masm32/ lib/shell32.lib

include/masm32/ include/user32.inc
includelib/masm32/ lib/user32.lib

;include/masm32/include/advapi32.inc
;includelib/masm32/lib/advapi32.lib
;include/masm32/include/comdlg32.inc
;includelib/masm32/lib/comdlg32.lib

;SSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSS
;prototype
;SSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSS
WinMainPROTO:DWORD,:DWORD,:DWORD,:DWORD

;SSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSS
;const
;SSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSS
WM_SHELLNOTIFYequWM_USER+200
IDI_TRAYequ0

NOTIFYICONDATA50struct
cbSizedword?
hwndHANDLE?
uIDdword?
uFlagsdword?
uCallbackMessagedword?
hIconHANDLE?
szTipdb128dup(?);Version5.0为128个,以前为64个
dwStatedword?;图标状态:NIS_HIDDEN:图标是隐藏的;NIS_SHAREDICON:图标是共享的
dwStateMaskdword?;指明dwState的哪些位可以被读取,如设置为NIS_HIDDEN则表示图标的隐藏状态可以被读取
szInfobyte256dup(?);气泡提示内容
union
uTimeoutdd?;Union类型系统默认设置最短10秒,最长30秒
uVersiondd?
ends
szInfoTitlebyte64dup(?);气泡提示标题
dwInfoFlagsdword?;指明是否在气泡提示上显示图标
NOTIFYICONDATA50ends

NOTIFYICON_VERSION=3
NOTIFYICON_OLDVERSION=0

NIM_ADD=0
NIM_MODIFY=1
NIM_DELETE=2
NIM_SETFOCUS=3
NIM_SETVERSION=4

NIF_MESSAGE=1;uCallbackMessage项包含了有效的信息
NIF_ICON=2;hIcon项包含了有效的信息
NIF_TIP=4;szTip项包含了有效的信息
NIF_STATE=8
NIF_INFO=010h

NIS_HIDDEN=1
NIS_SHAREDICON=2

;/---气泡提示信息图标控制
NIIF_NONE=0;不显示图标
NIIF_INFO=1;“信息”图标(蓝色)
NIIF_WARNING=2;“警告”图标(黄色)
NIIF_ERROR=3;“错误”图标(红色)
;---/

NIN_SELECT=WM_USER+0;
NIN_BALLOONSHOW=WM_USER+2;当气泡提示显示后外壳发送此消息
NIN_BALLOONHIDE=WM_USER+3;当气泡提示消失时(比如通知栏图标被删除)外壳发送此消息,但气泡提示由于超时而消失不会产生此消息
NIN_BALLOONTIMEOUT=WM_USER+4;当气泡提示由于超时而消失时外壳发送此消息
NIN_BALLOONUSERCLICK=WM_USER+5;当用户点击鼠标时(点击气泡提示和通知栏图标均可)外壳发送此消息
NINF_KEY=1
NIN_KEYSELECT=NIN_SELECTorNINF_KEY

IDC_ckbShowTrayIconequ100
IDC_ckbShowBalloonequ110
c_AppQuitequ1b
c_IconShowedequ10b

;SSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSS
.data
;SSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSS
g_szClassNamelabelbyte
g_szAppNamedb"Balloon_Tooltip_Demo",0
g_szButtondb"button",0
g_szShowTrayIcondb"显示托盘图标",0
g_szShowBalloondb"显示气泡信息",0

g_szAppQuitdb"程序退出",0
g_szInfodb"这是一个提示信息内容!",0
g_szInfoTitledb"这是一个提示信息标题!",0
g_szClickTrayIcondb"你击中了系统托盘区的图标",0
g_szClickBalloonOrIcondb"你击中了气泡或系统托盘区的图标",0
g_szMessageHidedb"信息隐藏了",0
g_szShowMessageNowdb"开始显示信息了",0
g_szMessageTimeOutdb"信息显示时间到了",0

g_dwFlagdword0

;SSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSS
.data?
;SSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSS
g_hInstanceHINSTANCE?
g_hWndMainHWND?
g_stNoteIconNOTIFYICONDATA50<>

.code
start:

invokeGetModuleHandle,NULL
movg_hInstance,eax
invokeWinMain,g_hInstance,NULL,NULL,SW_SHOWDEFAULT
invokeExitProcess,eax

WinMainprochInst:HINSTANCE,hPrevInst:HINSTANCE,CmdLine:LPSTR,CmdShow:DWORD
LOCALwc:WNDCLASSEX
LOCALmsg:MSG
LOCALhwnd:HWND

movwc.cbSize,SIZEOFWNDCLASSEX
movwc.style,CS_HREDRAWorCS_VREDRAWorCS_DBLCLKS
movwc.lpfnWndProc,OFFSETWndProc
movwc.cbClsExtra,NULL
movwc.cbWndExtra,NULL
moveax,hInst
movwc.hInstance,eax
movwc.hbrBackground,COLOR_BTNSHADOW
movwc.lpszMenuName,NULL
movwc.lpszClassName,OFFSETg_szClassName
invokeLoadIcon,NULL,IDI_APPLICATION
movwc.hIcon,eax
movwc.hIconSm,eax
invokeLoadCursor,NULL,IDC_ARROW
movwc.hCursor,eax
invokeRegisterClassEx,addrwc
invokeCreateWindowEx,NULL,addrg_szClassName,addrg_szAppName,/
WS_OVERLAPPED+WS_CAPTION+WS_SYSMENU,100,100,300,100,/
NULL,NULL,hInst,NULL;WS_VISIBLE
movhwnd,eax
invokeShowWindow,hwnd,SW_SHOW

.whileTRUE
invokeGetMessage,ADDRmsg,NULL,0,0
.BREAK.IF(!eax)
invokeTranslateMessage,ADDRmsg
invokeDispatchMessage,ADDRmsg
.endw
moveax, msg.wParam
ret
WinMainendp


WndProcprochWndMain:DWORD,uMsg:DWORD,wParam:DWORD,lParam:DWORD
.ifuMsg==WM_DESTROY
invokeShell_NotifyIcon,NIM_DELETE,addrg_stNoteIcon
invokePostQuitMessage,NULL

.elseifuMsg==WM_CLOSE
testg_dwFlag,c_IconShowed
jz@DestroyWin
testg_dwFlag,c_AppQuit
.ifZERO?
movg_stNoteIcon.uTimeout,20
invokelstrcpy,addrg_stNoteIcon.szInfo,addrg_szAppQuit
invokeShell_NotifyIcon,NIM_MODIFY,addrg_stNoteIcon
org_dwFlag,c_AppQuit
invokeShowWindow,g_hWndMain,SW_HIDE
.else
@DestroyWin:
invokeDestroyWindow,g_hWndMain
.endif
.elseifuMsg==WM_CREATE
moveax,hWndMain
movg_hWndMain,eax

invokeRtlZeroMemory,addrg_stNoteIcon,sizeofg_stNoteIcon
moveax,g_hWndMain
movg_stNoteIcon.hwnd,eax
movg_stNoteIcon.cbSize,sizeofg_stNoteIcon
movg_stNoteIcon.uID,IDI_TRAY
movg_stNoteIcon.uFlags,NIF_ICON+NIF_MESSAGE+NIF_TIP
movg_stNoteIcon.uCallbackMessage,WM_SHELLNOTIFY
invokeLoadIcon,NULL,IDI_WINLOGO
movg_stNoteIcon.hIcon,eax
invokelstrcpy,addrg_stNoteIcon.szTip,addrg_szAppName

invokeCreateWindowEx,NULL,addrg_szButton,addrg_szShowTrayIcon,/
WS_BORDER+WS_CHILD+WS_VISIBLE+BS_AUTOCHECKBOX,5,5,130,20,/
g_hWndMain,IDC_ckbShowTrayIcon,g_hInstance,NULL

invokeCreateWindowEx,NULL,addrg_szButton,addrg_szShowBalloon,/
WS_BORDER+WS_CHILD+WS_VISIBLE,5,30,130,20,/
g_hWndMain,IDC_ckbShowBalloon,g_hInstance,NULL

.elseif(uMsg==WM_COMMAND)
moveax,wParam
movedx,eax
shredx,16
.IF(dx==BN_CLICKED)
.if(eax==IDC_ckbShowTrayIcon)
testg_dwFlag,c_IconShowed
.ifZERO?
moveax,NIM_ADD
org_dwFlag,c_IconShowed
.else
moveax,NIM_DELETE
andg_dwFlag,notc_IconShowed
.endif
invokeShell_NotifyIcon,eax,addrg_stNoteIcon
.elseif(eax==IDC_ckbShowBalloon)
xoreax,eax
movg_stNoteIcon.dwState,eax
movg_stNoteIcon.dwStateMask,eax

invokelstrcpy,addrg_stNoteIcon.szInfo,addrg_szInfo
movg_stNoteIcon.uTimeout,200

invokelstrcpy,addrg_stNoteIcon.szInfoTitle,addrg_szInfoTitle
movg_stNoteIcon.dwInfoFlags,NIIF_INFO

movg_stNoteIcon.uFlags,NIF_ICON+NIF_MESSAGE+NIF_TIP+NIF_INFO

moveax,NIM_MODIFY
testg_dwFlag,c_IconShowed
.ifZERO?
org_dwFlag,c_IconShowed
invokeSendDlgItemMessage,g_hWndMain,IDC_ckbShowTrayIcon,BM_SETCHECK,BST_CHECKED,0
moveax,NIM_ADD
.endif

invokeShell_NotifyIcon,eax,addrg_stNoteIcon
.endif
.ENDIF
.elseifuMsg==WM_SHELLNOTIFY
.ifwParam==IDI_TRAY
moveax,lParam
.if(eax==NIN_BALLOONSHOW);当气泡提示显示后外壳发送此消息
invokeMessageBox,g_hWndMain,addrg_szShowMessageNow,addrg_szAppName,MB_ICONINFORMATION
.else
testg_dwFlag,c_AppQuit
.ifZERO?
.if(eax==NIN_BALLOONHIDE)
invokeMessageBox,g_hWndMain,addrg_szMessageHide,addrg_szAppName,MB_ICONINFORMATION
.elseif(eax==WM_RBUTTONDOWN||eax==WM_LBUTTONDOWN)
invokeMessageBox,g_hWndMain,addrg_szClickTrayIcon,addrg_szAppName,MB_ICONINFORMATION
.elseif(eax==NIN_BALLOONTIMEOUT);当气泡提示由于超时而消失时外壳发送此消息
invokeMessageBox,g_hWndMain,addrg_szMessageTimeOut,addrg_szAppName,MB_ICONINFORMATION
.elseif(eax==NIN_BALLOONUSERCLICK)
invokeMessageBox,g_hWndMain,addrg_szClickBalloonOrIcon,addrg_szAppName,MB_ICONINFORMATION
.endif
.else
invokeSendMessage,g_hWndMain,WM_CLOSE,0,0
.endif
.endif
.endif
.else
invokeDefWindowProc,hWndMain,uMsg,wParam,lParam
ret
.endif

xoreax,eax
ret
WndProcendp

endstart

PB9以上的PB版本适用。 使用只有三个函数,很简单。 这是用PBNI编写的控件,VC6的IDE,VC2003的编译器编译,UNICODE版本。 三个函数的使用说明: of_addtip(unsignedlong winhandle, string tip) 添加一个tip。这是必须首先调用的函数,即:在使用其他两个函数前,必须先调用此函数。 winhandle:窗口句柄,操作tip的窗口的句柄,tip的图标即用此窗口的图标。 tip: tip的字符内容。 of_modifytip(string title, string info) 修改tip的内容,并且动态将修改的内容立即显示。参数的含义明显。 of_deletetip() 删除tip. 对tip图标上的鼠标操作的处理: 原理是:图标上的所有windows消息,都会转发到参数winhandle所代表的窗口,作为该窗口的WM_USER消息,即触发该窗口的pbm_custom01事件。pbm_custom01事件的lparm参数指定tip图标的windows消息号。 具体作法:在参数winhandle所代表的窗口的pbm_custom01事件中写代码,检测lparm的值,以判断鼠标进行了哪种操作,如:lparm为517(WM_RBUTTONUP),表示鼠标弹起。 pbm_custom01中的示例代码: //start CONSTANT long WM_MOUSEMOVE = 512 CONSTANT long WM_LBUTTONDOWN = 513 CONSTANT long WM_LBUTTONUP = 514 CONSTANT long WM_LBUTTONDBLCLK = 515 CONSTANT long WM_RBUTTONDOWN = 516 CONSTANT long WM_RBUTTONUP = 517 CONSTANT long WM_RBUTTONDBLCLK = 518 CONSTANT long WM_USER = 1024 CONSTANT long NIN_BALLOONSHOW =(WM_USER + 2) CONSTANT long NIN_BALLOONHIDE =(WM_USER + 3) CONSTANT long NIN_BALLOONTIMEOUT =(WM_USER + 4) CONSTANT long NIN_BALLOONUSERCLICK =(WM_USER + 5) m_base lm_menu CHOOSE CASE lparam CASE WM_MOUSEMOVE // CASE WM_LBUTTONDOWN //鼠标左键按下 CASE WM_LBUTTONUP //鼠标左键弹起 CASE WM_LBUTTONDBLCLK //鼠标左键双击 CASE WM_RBUTTONDOWN // SetFocus ( this ) lm_menu = CREATE m_base lm_menu.PopMenu(PointerX(),PointerY()) DESTROY lm_menu CASE WM_RBUTTONUP // CASE WM_RBUTTONDBLCLK // CASE NIN_BALLOONSHOW // CASE NIN_BALLOONHIDE // CASE NIN_BALLOONTIMEOUT // CASE NIN_BALLOONUSERCLICK // CASE ELSE Beep(0) END CHOOSE //end 注意事项: 经测试,本PBNI如果与其他非UNICODE版的PBNI同用时,会显示乱码。无解。 如有BUG,敬请及时告知。 本控件的讨论贴: http://topic.csdn.net/u/20090510/20/14a57e09-02ca-44df-8f9b-e3811678360d.html
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值