Code archives/Miscellaneous/fmc.SystemTray
This code has been declared by its author to be Public Domain code.
Download source code
| |||||
Since 2006-11-06 my modules stored in the code archives are out of synchronization. To have the latest version you need to use the bmk/syncmods utility or the MaxIDE. You need to add "webspace100.we.funpic.de/root/mod" as a new line to "cfg/modservers.cfg" in your BlitzMax installation directory. You can't synchronize with the default BlitzMax 1.22 IDE. If you don't have another IDE, you need to download a tweaked MaxIDE. You need to specify "fmc" as additional module scope. Alternative you can synchronize with the bmk tool: bmk syncmods fmc For a better description see my thread in the programming forum introducing these modules. | |||||
Strict Module fmc.SystemTray ?Win32 ModuleInfo "Version: 0.01" ModuleInfo "Modserver: Fabian" Import brl.win32maxgui Import fmc.ObjectTool Type TTrayIcon Field Link:TLink Field NID:Object Field SystemIcon:TSystemIcon Field Menu:TGadget Field ToolTip$ Function Create:TTrayIcon ( SystemIcon:TSystemIcon = Null , Menu:TGadget = Null , ToolTip$ = "" ) Local TrayIcon:TTrayIcon = New TTrayIcon Local NID:TNotifyIconData = New TNotifyIconData TrayIcon.Link = List.AddLast ( TrayIcon ) TrayIcon.NID = NID TrayIcon.Menu = Menu TrayIcon.ToolTip = ToolTip NID.Size = SizeOf NID NID.Win = Window NID.ID = Int Byte Ptr TrayIcon NID.Flags = 7 NID.CallbackMessage = $200 If SystemIcon TrayIcon.SystemIcon = SystemIcon NID.Icon = SystemIcon.Icon EndIf MemCopy Varptr NID.Tip00 , StringPtr ( ToolTip ) , 2 * Min ( Len ToolTip , 63 ) Shell_NotifyIconW 0 , NID Return TrayIcon EndFunction Method SetSystemIcon ( NewSystemIcon:TSystemIcon ) If Link SystemIcon = NewSystemIcon If SystemIcon TNotifyIconData ( NID ).Icon = SystemIcon.Icon Else TNotifyIconData ( NID ).Icon = 0 EndIf Shell_NotifyIconW 1 , NID EndIf EndMethod Method SetMenu ( NewMenu:TGadget ) If Link Menu = NewMenu EndIf EndMethod Method SetToolTip ( NewToolTip$ ) If Link ToolTip = NewToolTip MemClear Varptr TNotifyIconData ( NID ).Tip00 , 126 MemCopy Varptr TNotifyIconData ( NID ).Tip00 , StringPtr ( ToolTip ) , 2 * Min ( Len ToolTip , 63 ) Shell_NotifyIconW 1 , NID EndIf EndMethod Method GetSystemIcon:TSystemIcon ( ) If Link Return SystemIcon EndIf EndMethod Method GetMenu:TGadget ( ) If Link Return Menu EndIf EndMethod Method GetToolTip$ ( ) If Link Return ToolTip EndIf EndMethod Method Destroy ( ) If Link Shell_NotifyIconW 2 , NID Link.Remove Link = Null EndIf EndMethod EndType Type TSystemIcon Field Icon Function FromExeRes:TSystemIcon ( ResName$ = "101" , TryInt = True ) Local NamePtr:Short Ptr Local NameInt = Int ResName Local W:Short Ptr If TryInt And NameInt NamePtr = Short Ptr NameInt Else W = ResName.ToWString ( ) NamePtr = W EndIf Local Icon = LoadImageW ( GetModuleHandleW ( Null ) , NamePtr , 1 , 0 , 0 , 0 ) If W MemFree W EndIf If Icon Local SystemIcon:TSystemIcon = New TSystemIcon SystemIcon.Icon = Icon Return SystemIcon EndIf EndFunction Function FromFile:TSystemIcon ( FileName$ ) Local W:Short Ptr = FileName.ToWString ( ) Local Icon = LoadImageW ( 0 , W , 1 , 0 , 0 , 16 ) MemFree W If Icon Local SystemIcon:TSystemIcon = New TSystemIcon SystemIcon.Icon = Icon Return SystemIcon EndIf EndFunction Method Delete ( ) DestroyIcon Icon EndMethod EndType Private Global WinGad:TGadget = CreateWindow ( "" , 0 , 0 , 0 , 0 , Desktop ( ) , WINDOW_HIDDEN ) Global Window = QueryGadget ( WinGad , QUERY_HWND ) Global WinProc = SetWindowLongW ( Window , -4 , Int Byte Ptr Proc ) Global List:TList = CreateList ( ) Type TNotifyIconData Field Size Field Win Field ID Field Flags Field CallbackMessage Field Icon Field Tip00:Long Field Tip01:Long Field Tip02:Long Field Tip03:Long Field Tip04:Long Field Tip05:Long Field Tip06:Long Field Tip07:Long Field Tip08:Long Field Tip09:Long Field Tip10:Long Field Tip11:Long Field Tip12:Long Field Tip13:Long Field Tip14:Long Field Tip15:Long EndType Function Proc ( Win , Msg , WP , LP ) If Win = Window And Msg = $200 For Local TrayIcon:TTrayIcon = EachIn List If WP = Int Byte Ptr TrayIcon If LP = 514 TEvent.Create ( EVENT_GADGETACTION , TrayIcon ).Emit EndIf If LP = 517 If TrayIcon.Menu PopupWindowMenu WinGad , TrayIcon.Menu EndIf EndIf Return EndIf Next Return EndIf Return CallWindowProcW ( WinProc , Win , Msg , WP , LP ) EndFunction Extern "Win32" Function Shell_NotifyIconW ( Msg , Data:Byte Ptr ) Function GetModuleHandleW ( Name:Short Ptr ) Function LoadImageW ( Inst , Name:Short Ptr , T , W , H , L ) Function DestroyIcon ( Icon ) Function SetWindowLongW ( Win , Pos , Val ) Function CallWindowProcW ( Proc , Win , Msg , WP , LP ) EndExtern ? |
Comments
| ||
Fabian: There are lots of .ToWString() calls here. This allocates an unmanaged string which must be freed at some point with MemFree. |
| ||
Ok, thanks; I cleaned up the code; now it's using pub.TypeSystem to get the string ptr. I also removed some unneeded code. |
Code Archives Forum