AutoBert Posted March 9, 2023 Share Posted March 9, 2023 I found this script: expandcollapse popup#Region ;**** Directives created by AutoIt3Wrapper_GUI **** #NoAutoIt3Execute #AutoIt3Wrapper_UseX64=n #AutoIt3Wrapper_AU3Check_Parameters=-q -d -w 1 -w 2 -w 3 -w 4 #EndRegion ;**** Directives created by AutoIt3Wrapper_GUI **** #Region ### includes ### ;AutoIt3Wrapper_AU3Check_Parameters=-q -w 1 -w 2 -w 3 -w 4 #include <GUIConstantsEx.au3> #include <StaticConstants.au3> #include <WindowsConstants.au3> #include <Ribbonsbar.au3> #include <GuiListView.au3> #include <EditConstants.au3> #EndRegion ### includes ### ConsoleWrite(512+256+32+2 & @crlf) Opt("GUIResizeMode", 802) Global $appname = 'Example App', $appver = '1.0', $additemsgui_W = 400, $additemsgui_H = 150 #Region ### $maingui ### Global $maingui = GUICreate($appname & ' ' & $appver, @DesktopWidth, 600, -1, -1, BitOr($WS_MINIMIZEBOX, $WS_MAXIMIZEBOX, $WS_SIZEBOX)) Global $hBar = _RibbonsBar_Create($maingui, 0, 0, 0, 0, 'blue') Global $hTab_Home = _RibbonsBar_Create_Tab($hBar, 'Home') Global $hItem_FileOps = _RibbonsBar_Create_TabItem($hTab_Home, 'File operations' , 225 ) Global $hGrandButton_New = _RibbonsBar_Create_GrandButton($hItem_FileOps,'',412,'New',52, True ) _RibbonsBar_GrandButtons_Enable($hGrandButton_New, 0) Global $hDropDownNew = _RibbonsBar_Create_ContextMenu($hGrandButton_New) Global $hDropDownNew_1 = _GUICtrlCreateODMenuItem("Standard ...", $hDropDownNew, "smallIcons.dll", 261) Global $hDropDownNew_2 = _GUICtrlCreateODMenuItem("Manual ...", $hDropDownNew, "smallIcons.dll", 382) Global $hGrandButton_Open = _RibbonsBar_Create_GrandButton($hItem_FileOps,'',453,'Open',52, False ) _RibbonsBar_GrandButtons_Enable($hGrandButton_Open, 0) Global $hGrandButton_Save = _RibbonsBar_Create_GrandButton($hItem_FileOps,'',514,'Save',52, True ) _RibbonsBar_GrandButtons_Enable($hGrandButton_Save, 0) Global $hDropDownSave = _RibbonsBar_Create_ContextMenu($hGrandButton_Save) Global $hDropDownSave_1 = _GUICtrlCreateODMenuItem("Save", $hDropDownSave, "smallIcons.dll", 287) Global $hDropDownSave_2 = _GUICtrlCreateODMenuItem("Save As ...", $hDropDownSave, "smallIcons.dll", 286) Global $hGrandButton_Export = _RibbonsBar_Create_GrandButton($hItem_FileOps,'',337,'Export',62, True ) _RibbonsBar_GrandButtons_Enable($hGrandButton_Export, 0) Global $hDropDownExport = _RibbonsBar_Create_ContextMenu($hGrandButton_Export) Global $hDropDownExport_1 = _GUICtrlCreateODMenuItem("To Excel", $hDropDownExport, "smallIcons.dll", 1243) Global $hItem_ItemOps = _RibbonsBar_Create_TabItem ( $hTab_Home, 'Item operations' , 393 ) Global $hGrandButton_AddItems = _RibbonsBar_Create_GrandButton($hItem_ItemOps,'',301,'Add item(s)',72, True ) Global $hDropDownAddItems = _RibbonsBar_Create_ContextMenu($hGrandButton_AddItems) _RibbonsBar_GrandButtons_Enable($hGrandButton_AddItems, 0) Global $hDropDownAddItems_1 = _GUICtrlCreateODMenuItem("From Catalogue", $hDropDownAddItems, "smallIcons.dll", 173) Global $hDropDownAddItems_2 = _GUICtrlCreateODMenuItem("From Quote", $hDropDownAddItems, "smallIcons.dll", 143) Global $hDropDownAddItems_3 = _GUICtrlCreateODMenuItem("Paste", $hDropDownAddItems, "smallIcons.dll", 9) Global $hGrandButton_DelItems = _RibbonsBar_Create_GrandButton($hItem_ItemOps,'',615,'Delete item(s)',82, False ) _RibbonsBar_GrandButtons_Enable($hGrandButton_DelItems, 0) Global $SmallButton_Undo = _RibbonsBar_Create_SmallButton($hItem_ItemOps,'',728,1,'Undo (Test: click to enable grand buttons)',230) Global $SmallButton_Redo = _RibbonsBar_Create_SmallButton($hItem_ItemOps,'',194,2,'Redo (Test: click to disable grand buttons)',230) _RibbonsBar_SmallButtons_Enable($SmallButton_Redo, 0) ;$idCboPrinter = GUICtrlCreateCombo('Drucker', 500, 30, 140, 23) Global $hTab_Help = _RibbonsBar_Create_Tab( $hBar, 'Help' ) Global $hItem_Information = _RibbonsBar_Create_TabItem ( $hTab_Help, 'Information' , 120 ) Global $hGrandButton_Help = _RibbonsBar_Create_GrandButton($hItem_Information,'',631,'Help','',False) Global $hGrandButton_About = _RibbonsBar_Create_GrandButton($hItem_Information,'',644,'About','',False) Global $htest = _RibbonsBar_Create_GrandButton($hItem_Information, '', 645, 'Info') _RibbonsBar_Tab_SetState($hTab_Home) GUISwitch($maingui) WinMove($maingui, "", Default, Default, 800, Default) Global $wPos = WinGetPos($maingui) WinMove($maingui, "", @DesktopWidth/2 - $wPos[2]/2, @DesktopHeight/2 - $wPos[3]/2, Default, Default) $wPos = WinGetPos($maingui) Global $mainlistview = GUICtrlCreateListView('Col 1|Col 2|Col 3|Col 4|Col 5|Col 6', -2, 120, _ $wPos[2], $wPos[3], Default) _GUICtrlListView_SetExtendedListViewStyle($mainlistview, BitOR($LVS_EX_CHECKBOXES, $LVS_EX_FULLROWSELECT, $LVS_EX_DOUBLEBUFFER, $LVS_EX_GRIDLINES, $LVS_EX_SUBITEMIMAGES, $LVS_EX_FLATSB)) _GUICtrlListView_SetColumnWidth($mainlistview, 0, 120) _GUICtrlListView_SetColumnWidth($mainlistview, 1, 250) _GUICtrlListView_SetColumnWidth($mainlistview, 2, 50) _GUICtrlListView_SetColumnWidth($mainlistview, 3, 100) _GUICtrlListView_SetColumnWidth($mainlistview, 4, 100) _GUICtrlListView_SetColumnWidth($mainlistview, 5, 50) #EndRegion ### $additemsgui ### #Region ### $additemsgui ### Global $additemsgui = GUICreate('Add item(s) from Catalogue', $additemsgui_W, $additemsgui_H, 0, 0, BitXOR($GUI_SS_DEFAULT_GUI, $WS_MINIMIZEBOX), $WS_EX_MDICHILD, $maingui) GUISetBkColor(0xf2f8ff) GUISetFont(10, 400) Global $additems_addlabel = GUICtrlCreateLabel('Start typing below to add item(s) from catalogue (min 2 chars):', 10, 15, $additemsgui_W - 20, 21) Global $additemsinput = GUICtrlCreateInput('', 10, 45, $additemsgui_W - 20, Default) GUICtrlSendMsg(-1, $EM_SETCUEBANNER, False, 'Enter an item number here') Global $additemsbn_add = GUICtrlCreateButton('Add', 10, 85, 110, 40) #EndRegion ### $additemsgui ### GUIRegisterMsg($WM_GETMINMAXINFO, "WM_GETMINMAXINFO") ; Register WM_GETMINMAXINFO GUISetState(@SW_SHOW, $maingui) GUICtrlSetResizing($mainlistview, BitOR($GUI_DOCKLEFT, $GUI_DOCKRIGHT, $GUI_DOCKTOP)) Global $mPos, $msg While 1 $msg = GUIGetMsg(1) Switch $msg[1] Case $maingui Switch $msg[0] Case $GUI_EVENT_CLOSE Exit Case $hDropDownAddItems_1 GUISetState(@SW_DISABLE, $maingui) $mPos = WinGetPos($maingui) WinMove($additemsgui, '', $mPos[0] + (($mPos[2]/2) - ($additemsgui_W/2)), $mPos[1] + (($mPos[3]/2) - ($additemsgui_H/2))) GUICtrlSetData($additemsinput, '') GUISetState(@SW_SHOW, $additemsgui) _WinAPI_SetFocus(ControlGetHandle('', '', $additems_addlabel)) Case $hDropDownNew_1 ConsoleWrite('Clicked "New" menu item 1'&@CRLF) Case $hDropDownNew_2 ConsoleWrite('Clicked "New" menu item 2'&@CRLF) EndSwitch Case $additemsgui Switch $msg[0] Case $GUI_EVENT_CLOSE GUISetState(@SW_ENABLE, $maingui) GUISetState(@SW_HIDE, $additemsgui) Case $additemsbn_add MsgBox(0, '', 'Add') EndSwitch EndSwitch Switch _RibbonsBar_GetMsg() Case $hGrandButton_Open ConsoleWrite('open...'&@CRLF) Case $SmallButton_Undo _RibbonsBar_GrandButtons_Enable($hGrandButton_New, 1) _RibbonsBar_GrandButtons_Enable($hGrandButton_Save, 1) _RibbonsBar_GrandButtons_Enable($hGrandButton_Export, 1) _RibbonsBar_GrandButtons_Enable($hGrandButton_AddItems, 1) _RibbonsBar_GrandButtons_Enable($hGrandButton_DelItems, 1) _RibbonsBar_GrandButtons_Enable($hGrandButton_Open, 1) If _RibbonsBar_SmallButtons_GetState($SmallButton_Undo) = 1 Then ConsoleWrite('undo...'&@CRLF) EndIf Case $SmallButton_Redo _RibbonsBar_GrandButtons_Enable($hGrandButton_New, 0) _RibbonsBar_GrandButtons_Enable($hGrandButton_Save, 0) _RibbonsBar_GrandButtons_Enable($hGrandButton_Export, 0) _RibbonsBar_GrandButtons_Enable($hGrandButton_AddItems, 0) _RibbonsBar_GrandButtons_Enable($hGrandButton_DelItems, 0) _RibbonsBar_GrandButtons_Enable($hGrandButton_Open, 0) If _RibbonsBar_SmallButtons_GetState($SmallButton_Redo) = 1 Then ConsoleWrite('redo...'&@CRLF) EndIf Case $hTab_Home _RibbonsBar_Tab_SetState($hTab_Home) Case $hGrandButton_Export _RibbonsBar_ContextMenu_SetState( $hDropDownExport) Case $hGrandButton_Save _RibbonsBar_ContextMenu_SetState( $hDropDownSave) MsgBox(0, '', 'save') Case $hGrandButton_AddItems _RibbonsBar_ContextMenu_SetState( $hDropDownAddItems) Case $hGrandButton_New _RibbonsBar_ContextMenu_SetState( $hDropDownNew) Case $hTab_Help _RibbonsBar_Tab_SetState($hTab_Help) Case $hGrandButton_Help MsgBox(0, '', 'help') EndSwitch WEnd Func WM_GETMINMAXINFO($hwnd, $Msg, $wParam, $lParam) If $hWnd = $maingui Then Local $tagMaxinfo = DllStructCreate("int;int;int;int;int;int;int;int;int;int", $lParam) DllStructSetData($tagMaxinfo, 7, 800) ; W (min size) DllStructSetData($tagMaxinfo, 8, 600) ; H (min size) Return 0 EndIf EndFunc ;==>WM_GETMINMAXINFO but it runs only correct when using #AutoIt3Wrapper_UseX64=n Also needed: Ribbonsbar.au3 ModernMenuRaw.au3 both in include or scriptpath. And the DLL's from example.zipshould be in @CommonFilesDir & '\Ribbonsbar\ . I think the problem is in the ModernMenuRaw.au3. Link to comment Share on other sites More sharing options...
Solution AutoBert Posted March 10, 2023 Author Solution Share Posted March 10, 2023 The problem was the ModernMenuRaw.au3. Replaced with this one: expandcollapse popup#include-once #include <ApiShellExConstants.au3> ;autoBert 10.03.2023 #include <WindowsConstants.au3> ;******************************************************************** ; ModernMenu UDF by Holger Kotsch ; Version-date: 06.05.2008 ;******************************************************************** ; Modified by ProgAndy ; Modify-date: 08.08.2008 ;******************************************************************** ; Modified by LarsJ ; Modify-date: 19.10.2014 ; Modify-date: 24.01.2015, updates suggested by nickston ;******************************************************************** #cs ModernMenu possible commands: ---------------------------- *** Common parameters *** bUseAdvMenu - switch on/off GUI advanced menu bUseAdvTrayMenu - switch on/off Tray advanced menu bUseRGBColors - use RGB colors instead of BGR colors (default BGR) ---------------------------- *** GUI menu color commands *** _SetMenuBkColor(Color) _SetMenuIconBkColor(Color) _SetMenuIconBkGrdColor(Color) _SetMenuSelectBkColor(Color) _SetMenuSelectRectColor(Color) _SetMenuSelectTextColor(Color) _SetMenuTextColor(Color) *** GUI menu item commands *** _GUICtrlCreateODTopMenu($sText, $nParentGUI) ; <--- ProgAndy _GUICtrlCreateODMenuItem(Text, ParentMenuID [, IconFile [, IconID [, Radio]]]) _GUICtrlCreateODMenu(Text, ParentMenuID [, IconFile [, IconID]]) _GUICtrlODMenuItemSetText(MenuID, Text) _GUICtrlODMenuItemSetIcon(MenuID [, IconFile], IconID]]) _GUICtrlODMenuItemSetSelIcon(MenuID [, IconFile ], IconID]]) _GUICtrlODMenuItemDelete(MenuID) _GUIMenuBarSetBkColor($nParentGUI,$nMenuBkClr) ; <--- ProgAndy ---------------------------- *** Tray menu color/flash commands *** _SetTrayBkColor(Color) _SetTrayIconBkColor(Color) _SetTrayIconBkGrdColor(Color) _SetTraySelectBkColor(Color) _SetTraySelectRectColor(Color) _SetTraySelectTextColor(Color) _SetTrayTextColor(Color) _SetFlashTimeOut([ToggleTimeout]) *** Tray menu item commands *** _TrayCreateContextMenu([TrayIconID]) _TrayCreateItem(Text [, TrayParentMenuID [, MenuEntryPos [, Radio]]]) _TrayCreateMenu(Text [, TrayParentMenuID [, MenuEntryPos]]) _TrayItemSetIcon(TrayMenuID [, IconFile [, IconID]]) _TrayItemSetSelIcon(TrayMenuID [, IconFile [, IconID]]) _TrayItemSetText([TrayMenuID [, Text]]) _TrayDeleteItem(TrayMenu/itemID) *** Tray icon commands *** _TrayIconCreate([ToolTip [, IconFile [, IconID [, Callback [, Msg [, hIcon]]]]]]) _TrayIconSetState([TrayIconID [, State]]) _TrayIconSetClick(TrayIconID, Clicks) _TrayIconSetIcon([TrayIconID [, IconFile [, IconID]]]) _TrayIconSetToolTip([TrayIconID [, ToolTip]]) _TrayIconDelete(TrayIconID) _TrayTip(TrayIconID, Title, Text [, TimeOut [, InfoFlags]]) _TrayGetMenuHandle(TrayIconID) ---------------------------- *** Side Menu commands *** _CreateSideMenu(MenuID) ; returns a SideMenuID/index _DeleteSideMenu(SideMenuID) ; delete a menu sidebar _SetSideMenuText(SideMenuID, Text) ; set a text for the sidebar _SetSideMenuColor(SideMenuID, Color) ; set text color _SetSideMenuBkColor(SideMenuID, Color) ; set text background color _SetSideMenuBkGradColor(SideMenuID, Color) ; set text background gradient color _SetSideMenuImage(SideMenuID, Bitmapfile [, Resourcename/number [, Expand/Compress Bitmap]]) #ce ; Alphabetical list of functions ; ------------------------------ ; _AddMenuIcon($sIconFile, $nIconID) ; _ColorGetClr($nColor, $nMode) ; _CreateBlankIcon() ; _CreateMenuFont(ByRef $hFont, $bBold = FALSE, $bSide = FALSE) ; _CreateMenuFontByName($sFontName, $nHeight = 8, $nWidth = 400) ; _CreateSideMenu($nMenuID) ; _DeleteSideMenu($nIdx) ; _FillGradientRect($hDC, $stRect, $nClr1, $nClr2, $bVert = FALSE) ; _GetBGRColor($nColor) ; _GetIconID($nID, $sFile) ; _GetMenuHandle($nMenuItemID) ; _GetMenuIconIndex($nMenuItemID, ByRef $nIconIndex, ByRef $nSelIconIndex) ; _GetMenuIndex($hMenu, $nMenuItemID) ; _GetMenuInfos(ByRef $nS, ByRef $nX) ; _GetMenuIsRadio($nMenuItemID) ; _GetMenuMaxTextWidth($hDC, $hMenu, ByRef $nMaxWidth, ByRef $nMaxAccWidth) ; _GetMenuText($nMenuItemID) ; _GetNewTrayIndex() ; _GetNewItemIndex() ; _GetNewSideItemIndex() ; _GetSideMenuColors($nIdx, ByRef $nColor, ByRef $nBkColor, ByRef $nBkGradColor) ; _GetSideMenuImage($nIdx) ; _GetSideMenuImageSize($nIdx, ByRef $nWidth, ByRef $nHeight, ByRef $bStretch) ; _GetSideMenuIndex($hMenu) ; _GetSideMenuText($nIdx) ; _GetSideMenuTextWidth($hDC, $sText) ; _GetTrayNotifyIdx($nID) ; _GUICtrlCreateODMenu($sText, $nParentMenu = "", $sIconFile = "", $nIconID = 0) ; _GUICtrlCreateODMenuItem($sMenuItemText, $nParentMenu, $sIconFile = "", $nIconID = 0, $bRadio = 0) ; _GUICtrlCreateODTopMenu($sText, $nParentGUI) ; <--- ProgAndy ; _GUICtrlODMenuItemDelete($nID) ; _GUICtrlODMenuItemSetIcon($nMenuID, $sIconFile = "", $nIconID = 0) ; _GUICtrlODMenuItemSetSelIcon($nMenuID, $sIconFile = "", $nIconID = 0) ; _GUICtrlODMenuItemSetText($nMenuID, $sText) ; _GUIMenuBarSetBkColor($nParentGUI,$nMenuBkClr) ; <--- ProgAndy ; _IsSideMenuIdx($nIdx) ; _IsTrayItem($nMenuItemID) ; _ReplaceMenuIcon($sIconFile, $nIconID, $nReplaceIndex) ; _SetFlashTimeOut($nTime = 750) ; _SetItemRect(ByRef $stStruct, $p1, $p2, $p3, $p4) ; _SetMenuBkColor($nColor) ; _SetMenuIconBkColor($nColor) ; _SetMenuIconBkGrdColor($nColor) ; _SetMenuSelectBkColor($nColor) ; _SetMenuSelectRectColor($nColor) ; _SetMenuSelectTextColor($nColor) ; _SetMenuTextColor($nColor) ; _SetOwnerDrawn($hMenu, $MenuItemID, $sText, $bOwnerDrawn = TRUE) ; _SetSideMenuBkColor($nIdx, $nColor = -2) ; _SetSideMenuBkGradColor($nIdx, $nColor = -2) ; _SetSideMenuColor($nIdx, $nColor = -2) ; _SetSideMenuColors($nIdx, $nColor = -1, $nBkColor = -1, $nBkGrdColor = -1) ; _SetSideMenuImage($nIdx, $sFile, $sResName = "", $bStretch = FALSE) ; _SetSideMenuText($nIdx, $sText, $sResName = "", $bIsBitmap = FALSE, $bStretch = FALSE) ; _SetTrayBkColor($nColor) ; _SetTrayIconBkColor($nColor) ; _SetTrayIconBkGrdColor($nColor) ; _SetTraySelectBkColor($nColor) ; _SetTraySelectRectColor($nColor) ; _SetTraySelectTextColor($nColor) ; _SetTrayTextColor($nColor) ; _TrayCreateContextMenu($nID = -1) ; _TrayCreateItem($sText, $nMenuID = -1, $nMenuEntry = -1, $bRadio = 0) ; _TrayCreateMenu($sText, $nMenuID = -1, $nMenuEntry = -1) ; _TrayDeleteItem($nID) ; _TrayGetMenuHandle($nID) ; _TrayIconCreate($sToolTip = "", $sIconFile = @AutoItExe, $nIconID = 0, $sCallback = "", $nMsg = 0, $hIcon = 0) ; _TrayIconDelete($nID) ; _TrayIconSetClick($nID, $nClicks) ; _TrayIconSetIcon($nID = -1, $sIconFile = @AutoItExe, $nIconID = 0) ; _TrayIconSetState($nID = -1, $nState = 1) ; _TrayIconSetToolTip($nID = -1, $sToolTip = $sDefaultTT) ; _TrayItemSetIcon($nMenuID, $sIconFile = "", $nIconID = -1) ; _TrayItemSetSelIcon($nMenuID, $sIconFile = "", $nIconID = -1) ; _TrayItemSetText($nMenuID = -1, $sText = "") ; _TrayNotifyIcon($hWnd, $Msg, $wParam, $lParam) ; _TrayTip($nID, $sTitle, $sText, $nTimeOut = 10, $nInfoFlags = 0) ; _TrayWndProc($hWnd, $Msg, $wParam, $lParam) ; Windows messages: ; $WM_DRAWITEM ; $WM_MEASUREITEM ; $WM_SETTINGCHANGE ; $WM_TIMER ; $TRAYTIPMSG = $WM_USER + 1 Global $sLOGFONT = "int;" & _ ; Height "int;" & _ ; Average width "int;" & _ ; Excapement "int;" & _ ; Orientation "int;" & _ ; Weight "byte;" & _ ; Italic "byte;" & _ ; Underline "byte;" & _ ; Strikeout "byte;" & _ ; Charset "byte;" & _ ; Outprecision "byte;" & _ ; Clipprecision "byte;" & _ ; Quality "byte;" & _ ; Pitch & Family "wchar[32]" ; Font name Global Const $sNONCLIENTMETRICS = "uint;" & _ ; Struct size "int;" & _ ; "int;" & _ ; "int;" & _ ; "int;" & _ ; "int;" & _ ; $sLOGFONT & ";" & _ ; Caption LogFont structure "int;" & _ ; "int;" & _ ; $sLOGFONT & ";" & _ ; Small caption LogFont structure "int;" & _ ; "int;" & _ ; $sLOGFONT & ";" & _ ; Menu LogFont structure $sLOGFONT & ";" & _ ; Statusbar LogFont structure $sLOGFONT ; Message box LogFont structure Global Const $sMENUITEMINFO = "uint;" & _ ; "uint;" & _ ; "uint;" & _ ; "uint;" & _ ; "uint;" & _ ; "hwnd;" & _ ; "hwnd;" & _ ; "hwnd;" & _ ; "long;" & _ ; "ptr;" & _ ; "uint;" & _ ; "hwnd" ; ;********************************************************************** ; NotifyIconData struct ;********************************************************************** Global $sNOTIFYICONDATAW = "dword;" & _ ; Struct size "hwnd;" & _ ; Callback window handle "uint;" & _ ; Icon ID "uint;" & _ ; Flags "uint;" & _ ; Callback message ID "hwnd;" & _ ; Icon handle "wchar[128];" & _ ; ToolTip text "dword;" & _ ; Icon state "dword;" & _ ; Icon state mask "wchar[256];" & _ ; Balloon ToolTip text "uint;" & _ ; Timeout / Version -> NIM_SETVERSION values 0, 3, 4 "wchar[64];" & _ ; Balloon ToolTip title text "dword" ; Balloon ToolTip info flags ;********************************************************************** ; Notify icon constants ;********************************************************************** If Not IsDeclared("NIN_SELECT") Then Global Const $NIN_SELECT = 0x0400 If Not IsDeclared("NINF_KEY") Then Global Const $NINF_KEY = 0x1 If Not IsDeclared("NIN_KEYSELECT") Then Global Const $NIN_KEYSELECT = BitOr($NIN_SELECT, $NINF_KEY) If Not IsDeclared("NIN_BALLOONSHOW") Then Global Const $NIN_BALLOONSHOW = 0x0400 + 2 If Not IsDeclared("NIN_BALLOONHIDE") Then Global Const $NIN_BALLOONHIDE = 0x0400 + 3 If Not IsDeclared("NIN_BALLOONTIMEOUT") Then Global Const $NIN_BALLOONTIMEOUT = 0x0400 + 4 If Not IsDeclared("NIN_BALLOONUSERCLICK") Then Global Const $NIN_BALLOONUSERCLICK = 0x0400 + 5 If Not IsDeclared("NIN_POPUPOPEN") Then Global Const $NIN_POPUPOPEN = 0x0400 + 6 If Not IsDeclared("NIN_POPUPCLOSE") Then Global Const $NIN_POPUPCLOSE = 0x0400 + 7 #cs ;Alreay declared in #include <ApiShellExConstants.au3> ;autoBert 10.03.2023 If Not IsDeclared("NIM_ADD") Then Global Const $NIM_ADD = 0x00000000 If Not IsDeclared("NIM_MODIFY") Then Global Const $NIM_MODIFY = 0x00000001 If Not IsDeclared("NIM_DELETE") Then Global Const $NIM_DELETE = 0x00000002 If Not IsDeclared("NIM_SETFOCUS") Then Global Const $NIM_SETFOCUS = 0x00000003 If Not IsDeclared("NIM_SETVERSION") Then Global Const $NIM_SETVERSION = 0x00000004 If Not IsDeclared("NIF_MESSAGE") Then Global Const $NIF_MESSAGE = 0x00000001 If Not IsDeclared("NIF_ICON") Then Global Const $NIF_ICON = 0x00000002 If Not IsDeclared("NIF_TIP") Then Global Const $NIF_TIP = 0x00000004 If Not IsDeclared("NIF_STATE") Then Global Const $NIF_STATE = 0x00000008 If Not IsDeclared("NIF_INFO") Then Global Const $NIF_INFO = 0x00000010 If Not IsDeclared("NIF_REALTIME") Then Global Const $NIF_REALTIME = 0x00000040 If Not IsDeclared("NIF_SHOWTIP") Then Global Const $NIF_SHOWTIP = 0x00000080 If Not IsDeclared("NIS_HIDDEN") Then Global Const $NIS_HIDDEN = 0x00000001 If Not IsDeclared("NIS_SHAREDICON") Then Global Const $NIS_SHAREDICON = 0x00000002 If Not IsDeclared("NIIF_NONE") Then Global Const $NIIF_NONE = 0x00000000 If Not IsDeclared("NIIF_INFO") Then Global Const $NIIF_INFO = 0x00000001 If Not IsDeclared("NIIF_WARNING") Then Global Const $NIIF_WARNING = 0x00000002 If Not IsDeclared("NIIF_ERROR") Then Global Const $NIIF_ERROR = 0x00000003 If Not IsDeclared("NIIF_USER") Then Global Const $NIIF_USER = 0x00000004 If Not IsDeclared("NIIF_ICON_MASK") Then Global Const $NIIF_ICON_MASK = 0x0000000F If Not IsDeclared("NIIF_NOSOUND") Then Global Const $NIIF_NOSOUND = 0x00000010 If Not IsDeclared("NIIF_LARGE_ICON") Then Global Const $NIIF_LARGE_ICON = 0x00000020 #ce ;********************************************************************** ; Constants for LoadIcon() ;********************************************************************** ;If Not IsDeclared("IDI_APPLICATION") Then Global Const $IDI_APPLICATION = 32512 ;If Not IsDeclared("IDI_HAND") Then Global Const $IDI_HAND = 32513 ;If Not IsDeclared("IDI_QUESTION") Then Global Const $IDI_QUESTION = 32514 ;If Not IsDeclared("IDI_EXCLAMATION") Then Global Const $IDI_EXCLAMATION = 32515 ;If Not IsDeclared("IDI_ASTERISK") Then Global Const $IDI_ASTERISK = 32516 ;If Not IsDeclared("IDI_WINLOGO") Then Global Const $IDI_WINLOGO = 32517 ;********************************************************************** ; Mouse constants ;********************************************************************** ;If Not IsDeclared("WM_MOUSEMOVE") Then Global Const $WM_MOUSEMOVE = 0x0200 ;If Not IsDeclared("WM_LBUTTONDOWN") Then Global Const $WM_LBUTTONDOWN = 0x0201 ;If Not IsDeclared("WM_LBUTTONUP") Then Global Const $WM_LBUTTONUP = 0x0202 ;If Not IsDeclared("WM_LBUTTONDBLCLK") Then Global Const $WM_LBUTTONDBLCLK = 0x0203 ;If Not IsDeclared("WM_RBUTTONDOWN") Then Global Const $WM_RBUTTONDOWN = 0x0204 ;If Not IsDeclared("WM_RBUTTONUP") Then Global Const $WM_RBUTTONUP = 0x0205 ;If Not IsDeclared("WM_RBUTTONDBLCLK") Then Global Const $WM_RBUTTONDBLCLK = 0x0206 ;If Not IsDeclared("WM_MBUTTONDOWN") Then Global Const $WM_MBUTTONDOWN = 0x0207 ;If Not IsDeclared("WM_MBUTTONUP") Then Global Const $WM_MBUTTONUP = 0x0208 ;If Not IsDeclared("WM_MBUTTONDBLCLK") Then Global Const $WM_MBUTTONDBLCLK = 0x0209 ;******************************************************************** ; Main Creation Part ;******************************************************************** Global $hComctl32Dll = DllOpen("comctl32.dll") Global $hGdi32Dll = DllOpen("gdi32.dll") Global $hKernel32Dll = DllOpen("kernel32.dll") Global $hShell32Dll = DllOpen("shell32.dll") Global $hUser32Dll = DllOpen("user32.dll") Global $hMsimg32Dll = DllOpen("msimg32.dll") Global $bUseAdvMenu = TRUE Global $bUseAdvTrayMenu = TRUE Global $bUseRGBColors = FALSE ; Set default color values if not given Global $nMenuBkClr = 0xFFFFFF Global $nMenuIconBkClr = 0xDBD8D8 Global $nMenuSelectBkClr = 0xD2BDB6 Global $nMenuSelectRectClr = 0x854240 Global $nMenuSelectTextClr = 0x000000 Global $nMenuTextClr = 0x000000 Global $nMenuSideBkClr = 0xD00000 Global $nMenuSideTxtClr = 0xFFFFFF Global $nTrayBkClr = 0xFFFFFF Global $nTrayIconBkClr = 0xD1D8DB Global $nTraySelectBkClr = 0xD2BDB6 Global $nTraySelectRectClr = 0x854240 Global $nTraySelectTextClr = 0x000000 Global $nTrayTextClr = 0x000000 If $bUseRGBColors Then $nMenuIconBkClr = 0xD8D8DB $nMenuSelectBkClr = 0xB6BDD2 $nMenuSelectRectClr = 0x404285 $nMenuSideBkClr = 0x0000D0 $nTrayIconBkClr = 0xDBD8D1 $nTraySelectBkClr = 0xB6BDD2 $nTraySelectRectClr = 0x404285 EndIf Global $nMenuIconBkClr2 = $nMenuIconBkClr Global $nMenuSideBkClr2 = $nMenuSideBkClr Global $nTrayIconBkClr2 = $nTrayIconBkClr ; Store here the menu item: ; ID/Text/IconIndex/ParentMenu/Tray/SelIconIndex/IsMenu Global $arMenuItems[1][8] $arMenuItems[0][0] = 0 Global $nMenuItemsRedim = 10 ; Store here the side item: ; MenuHandle/Text/TextColor/BkColor/GradientColor/IsBitmap/BitmapHandle/Width/Height/Stretch Global $arSideItems[1][10] $arSideItems[0][0] = 0 ; Create a usable font for using in ownerdrawn menus Global $hMenuFont = 0 _CreateMenuFont($hMenuFont) ; Create an image list for saving/drawing our menu icons Global $hMenuImageList = ImageList_Create(16, 16, BitOr(0x0001, 0x0020), 0, 1) Global $hBlankIcon = 0 ; Store here the tray icon: ; NotifyID/TrayIcon/Menu/Click/ToolTip/Callback/OnlyMsg/Flash/FlashBlank Global $TRAYNOTIFYIDS[1][9] $TRAYNOTIFYIDS[0][0] = 0 Global $TRAYMSGWND = 0 Global $TRAYNOTIFYID = -1 Global $TRAYLASTID = -1 Global $MENULASTITEM = -1 Global $TRAYLASTITEM = -1 Global $TRAYLASTMENU = -1 Global $TRAYTIPMSG = $WM_USER + 1 ; This message ID will be used in a GUIRegisterMsg() procdure Global $FLASHTIMERID = 3 Global $FLASHTIMEOUT = 750 Global $sDefaultTT = "AutoIt - " & @ScriptName GUIRegisterMsg($WM_DRAWITEM, "WM_DRAWITEM") GUIRegisterMsg($WM_MEASUREITEM, "WM_MEASUREITEM") GUIRegisterMsg($TRAYTIPMSG, "_TrayWndProc") GUIRegisterMsg($WM_SETTINGCHANGE, "WM_SETTINGCHANGE") GUIRegisterMsg($WM_TIMER, "WM_TIMER") ; Cleanup Func OnAutoItExit() For $i = 0 To UBound($TRAYNOTIFYIDS)-1 _TrayIconDelete($TRAYNOTIFYIDS[ $i ][0]) Next ImageList_Destroy($hMenuImageList) DeleteObject($hMenuFont) For $i = 1 To $arSideItems[0][0] If $arSideItems[$i][6] <> 0 Then _ DeleteObject($arSideItems[$i][6]) Next DllClose($hComctl32Dll) DllClose($hGdi32Dll) DllClose($hKernel32Dll) DllClose($hShell32Dll) DllClose($hUser32Dll) DllClose($hMsimg32Dll) $arMenuItems = 0 $arSideItems = 0 $TRAYNOTIFYIDS = 0 EndFunc ;******************************************************************** ; Define the colors for the menu/selection bar ;******************************************************************** Func _SetMenuBkColor($nColor) $nMenuBkClr = _GetBGRColor($nColor) EndFunc Func _SetMenuIconBkColor($nColor) $nMenuIconBkClr = _GetBGRColor($nColor) $nMenuIconBkClr2 = $nMenuIconBkClr EndFunc Func _SetMenuIconBkGrdColor($nColor) $nMenuIconBkClr2 = _GetBGRColor($nColor) EndFunc Func _SetMenuSelectBkColor($nColor) $nMenuSelectBkClr = _GetBGRColor($nColor) EndFunc Func _SetMenuSelectRectColor($nColor) $nMenuSelectRectClr = _GetBGRColor($nColor) EndFunc Func _SetMenuSelectTextColor($nColor) $nMenuSelectTextClr = _GetBGRColor($nColor) EndFunc Func _SetMenuTextColor($nColor) $nMenuTextClr = _GetBGRColor($nColor) EndFunc Func _SetTrayBkColor($nColor) $nTrayBkClr = _GetBGRColor($nColor) EndFunc Func _SetTrayIconBkColor($nColor) $nTrayIconBkClr = _GetBGRColor($nColor) $nTrayIconBkClr2 = $nMenuIconBkClr EndFunc Func _SetTrayIconBkGrdColor($nColor) $nTrayIconBkClr2 = _GetBGRColor($nColor) EndFunc Func _SetTraySelectBkColor($nColor) $nTraySelectBkClr = _GetBGRColor($nColor) EndFunc Func _SetTraySelectRectColor($nColor) $nTraySelectRectClr = _GetBGRColor($nColor) EndFunc Func _SetTraySelectTextColor($nColor) $nTraySelectTextClr = _GetBGRColor($nColor) EndFunc Func _SetTrayTextColor($nColor) $nTrayTextClr = _GetBGRColor($nColor) EndFunc Func _SetSideMenuColor($nIdx, $nColor = -2) Return _SetSideMenuColors($nIdx, _GetBGRColor($nColor)) EndFunc Func _SetSideMenuBkColor($nIdx, $nColor = -2) Return _SetSideMenuColors($nIdx, -1, _GetBGRColor($nColor)) EndFunc Func _SetSideMenuBkGradColor($nIdx, $nColor = -2) Return _SetSideMenuColors($nIdx, -1, -1, _GetBGRColor($nColor)) EndFunc Func _SetFlashTimeOut($nTime = 750) $FLASHTIMEOUT = $nTime If $FLASHTIMEOUT < 50 Then $FLASHTIMEOUT = 50 EndFunc ;********************************************************************** ; Return an BGR color to a given RGB color ;********************************************************************** Func _GetBGRColor($nColor) If $bUseRGBColors And $nColor <> -2 Then Return BitOr(BitShift(BitAnd($nColor, 0xFF), -16), BitAnd($nColor, 0xFF00), BitShift($nColor, 16)) Else Return $nColor EndIf EndFunc ;********************************************************************** ; Get the icon ID like in newer Autoit versions ;********************************************************************** Func _GetIconID($nID, $sFile) If StringRight($sFile, 4) = ".exe" Then If $nID < 0 Then $nID = - ($nID + 1) ElseIf $nID > 0 Then $nID = - $nID EndIf ElseIf StringRight($sFile, 4) = ".icl" And $nID < 0 Then $nID = - ($nID + 1) Else If $nID > 0 Then $nID = - $nID ElseIf $nID < 0 Then $nID = - ($nID + 1) EndIf EndIf Return $nID EndFunc ;********************************************************************** ; Main functions: ;********************************************************************** Func _TrayWndProc($hWnd, $Msg, $wParam, $lParam) If $hWnd = $TRAYMSGWND Then _TrayNotifyIcon($hWnd, $Msg, $wParam, $lParam) EndIf EndFunc Func _TrayNotifyIcon($hWnd, $Msg, $wParam, $lParam) #forceref $Msg Local $nClick = 0 Local $nID = $wParam If $TRAYNOTIFYIDS[$nID][5] <> "" And _ ($TRAYNOTIFYIDS[$nID][6] = 0 Or _ $TRAYNOTIFYIDS[$nID][6] = $lParam) Then Call($TRAYNOTIFYIDS[$nID][5], $nID, $lParam) EndIf Switch $lParam Case $WM_LBUTTONDOWN $nClick = 1 case $WM_LBUTTONUP $nClick = 2 case $WM_LBUTTONDBLCLK $nClick = 4 case $WM_RBUTTONDOWN $nClick = 8 case $WM_RBUTTONUP $nClick = 16 case $WM_RBUTTONDBLCLK $nClick = 32 case $WM_MOUSEMOVE $nClick = 64 EndSwitch If BitAnd($nClick, $TRAYNOTIFYIDS[$nID][3]) And $TRAYNOTIFYIDS[$nID][2] > 0 Then Local $hMenu = GUICtrlGetHandle($TRAYNOTIFYIDS[$nID][2]) If $hMenu <> 0 Then Local $stPoint = DllStructCreate("int;int") GetCursorPos(DllStructGetPtr($stPoint)) SetForegroundWindow($hWnd) TrackPopupMenuEx($hMenu, 0, DllStructGetData($stPoint, 1), DllStructGetData($stPoint, 2), $hWnd, 0) PostMessage($hWnd, 0, 0, 0) EndIf EndIf EndFunc ;********************************************************************** ; Create a new tray notify ID ;********************************************************************** Func _GetNewTrayIndex() Local $i, $bFreeFound = FALSE For $i = 1 To $TRAYNOTIFYIDS[0][0] If $TRAYNOTIFYIDS[$i][0] = 0 Then $bFreeFound = TRUE ExitLoop EndIf Next If Not $bFreeFound Then $TRAYNOTIFYIDS[0][0] += 1 Local $nSize = UBound($TRAYNOTIFYIDS) ;If $TRAYNOTIFYIDS[0][0] > $nSize - 10 Then _ ; nickston ; Redim $TRAYNOTIFYIDS[$nSize + 10][9] If $TRAYNOTIFYIDS[0][0] > $nSize - 1 Then _ Redim $TRAYNOTIFYIDS[$nSize + 10][9] $i = $TRAYNOTIFYIDS[0][0] EndIf Return $i EndFunc ;********************************************************************** ; Check for existing tray notify ID ;********************************************************************** Func _GetTrayNotifyIdx($nID) If $TRAYMSGWND = 0 Then Return 0 Local $i, $nResult = 0 If $nID = -1 Then $nID = $TRAYLASTID For $i = 1 To $TRAYNOTIFYIDS[0][0] If $TRAYNOTIFYIDS[$i][0] = $nID Then $nResult = $i ExitLoop EndIf Next Return $nResult EndFunc ;******************************************************************** ; Change the menu item icon ;******************************************************************** Func _TrayItemSetIcon($nMenuID, $sIconFile = "", $nIconID = -1) If $nMenuID = -1 Then $nMenuID = $TRAYLASTITEM If $nMenuID <= 0 Then Return 0 $nIconID = _GetIconID($nIconID, $sIconFile) Local $i, $sText = "", $hMenu = 0 For $i = 1 To $arMenuItems[0][0] If $arMenuItems[$i][0] = $nMenuID Then $sText = $arMenuItems[$i][1] $hMenu = $arMenuItems[$i][3] If $sIconFile = "" And $nIconID = -1 Then $arMenuItems[$i][2] = -1 _SetOwnerDrawn($hMenu, $nMenuID, $sText, FALSE) GUICtrlSetData($nMenuID, $sText) Else If $sIconFile <> "" Then $arMenuItems[$i][2] = _AddMenuIcon($sIconFile, $nIconID) Else $arMenuItems[$i][2] = -1 EndIf _SetOwnerDrawn($hMenu, $nMenuID, $sText) EndIf Return 1 EndIf Next Return 0 EndFunc ;******************************************************************** ; Set the selected menu item icon ;******************************************************************** Func _TrayItemSetSelIcon($nMenuID, $sIconFile = "", $nIconID = -1) If $nMenuID = -1 Then $nMenuID = $TRAYLASTITEM If $nMenuID <= 0 Then Return 0 $nIconID = _GetIconID($nIconID, $sIconFile) Local $i, $sText = "", $hMenu = 0 For $i = 1 To $arMenuItems[0][0] If $arMenuItems[$i][0] = $nMenuID Then $sText = $arMenuItems[$i][1] $hMenu = $arMenuItems[$i][3] If $sIconFile = "" And $nIconID = -1 Then $arMenuItems[$i][6] = -1 _SetOwnerDrawn($hMenu, $nMenuID, $sText, FALSE) GUICtrlSetData($nMenuID, $sText) Else If $sIconFile <> "" Then $arMenuItems[$i][6] = _AddMenuIcon($sIconFile, $nIconID) Else $arMenuItems[$i][6] = -1 EndIf _SetOwnerDrawn($hMenu, $nMenuID, $sText) EndIf Return 1 EndIf Next Return 0 EndFunc ;******************************************************************** ; Set the text of an menu item ;******************************************************************** Func _TrayItemSetText($nMenuID = -1, $sText = "") If $nMenuID = -1 Then $nMenuID = $TRAYLASTITEM If $nMenuID <= 0 Then Return 0 Local $i For $i = 1 To $arMenuItems[0][0] If $arMenuItems[$i][0] = $nMenuID Then $arMenuItems[$i][1] = $sText ;_SetOwnerDrawn($arMenuItems[$i][3], $nMenuID, $sText, FALSE) GUICtrlSetData($nMenuID, $sText) ;_SetOwnerDrawn($arMenuItems[$i][3], $nMenuID, $sText) Return 1 EndIf Next Return 0 EndFunc ;********************************************************************** ; _TrayIconCreate([ToolTip [, IconFile [, IconID]]]) ;********************************************************************** Func _TrayIconCreate($sToolTip = "", $sIconFile = @AutoItExe, $nIconID = 0, $sCallback = "", $nMsg = 0, $hIcon = 0) If $sToolTip = "" Then $sToolTip = $sDefaultTT $nIconID = _GetIconID($nIconID, $sIconFile) If $sIconFile = "" Then If $hIcon = 0 Then If $nIconID = 0 Then $sIconFile = @AutoItExe Else $hIcon = LoadIcon(0, $nIconID) EndIf EndIf EndIf If $sIconFile <> "" Then Local $stIcon = DllStructCreate("hwnd") If ExtractIconExW($sIconFile, $nIconID, 0, DllStructGetPtr($stIcon), 1) > 0 Then $hIcon = DllStructGetData($stIcon, 1) Else $hIcon = LoadIcon(0, 32516) EndIf EndIf If $TRAYMSGWND = 0 Then $TRAYMSGWND = GUICreate("", 1, 1, 9999, 9999, -1, 0x00000080) GUISetState() ShowWindow($TRAYMSGWND, @SW_HIDE) EndIf Local $nNID = _GetNewTrayIndex() If $nNID = 0 Then DestroyIcon($hIcon) Return 0 EndIf $TRAYNOTIFYIDS[$nNID][0] = $nNID $TRAYNOTIFYIDS[$nNID][1] = $hIcon $TRAYNOTIFYIDS[$nNID][2] = 0 $TRAYNOTIFYIDS[$nNID][3] = 9 $TRAYNOTIFYIDS[$nNID][4] = $sToolTip $TRAYNOTIFYIDS[$nNID][5] = $sCallback $TRAYNOTIFYIDS[$nNID][6] = $nMsg $TRAYNOTIFYIDS[$nNID][7] = FALSE $TRAYNOTIFYIDS[$nNID][8] = FALSE $TRAYLASTID = $nNID Return $nNID EndFunc ;********************************************************************** ; _TrayIconDelete($NotificationID) ;********************************************************************** Func _TrayIconDelete($nID) If $nID = -1 Then $nID = $TRAYLASTID If $TRAYMSGWND = 0 Or $nID <= 0 Then Return 0 Local $stNID ; = DllStructCreate($sNOTIFYICONDATAW) ; nickston ;DllStructSetData($stNID, 1, DllStructGetSize($stNID)) ; nickston ;DllStructSetData($stNID, 2, $TRAYMSGWND) ;DllStructSetData($stNID, 3, $nID) Local $nResult = 0 Local $i For $i = 1 To $TRAYNOTIFYIDS[0][0] If $nID = $TRAYNOTIFYIDS[$i][0] Then $stNID = DllStructCreate($sNOTIFYICONDATAW) DllStructSetData($stNID, 1, DllStructGetSize($stNID)) DllStructSetData($stNID, 2, $TRAYMSGWND) DllStructSetData($stNID, 3, $nID) $nResult = Shell_NotifyIcon($NIM_DELETE, DllStructGetPtr($stNID)) DestroyIcon($TRAYNOTIFYIDS[$i][1]) $TRAYNOTIFYIDS[$i][8] = FALSE $TRAYNOTIFYIDS[$i][7] = FALSE $TRAYNOTIFYIDS[$i][6] = 0 $TRAYNOTIFYIDS[$i][5] = "" $TRAYNOTIFYIDS[$i][4] = "" $TRAYNOTIFYIDS[$i][3] = 0 If $TRAYNOTIFYIDS[$i][2] <> 0 Then GUIDelete($TRAYNOTIFYIDS[$i][2]) $TRAYNOTIFYIDS[$i][2] = 0 $TRAYNOTIFYIDS[$i][1] = 0 $TRAYNOTIFYIDS[$i][0] = 0 ExitLoop EndIf Next Return $nResult EndFunc ;********************************************************************** ; _TrayIconSetState($NotificationID, $NewState) ;********************************************************************** Func _TrayIconSetState($nID = -1, $nState = 1) If $nState = 0 Then Return 1 ; No change If $nID = -1 Then $nID = $TRAYLASTID If $TRAYMSGWND = 0 Or $nID <= 0 Then Return 0 Local $i, $nResult = 0, $bFound = FALSE For $i = 1 To $TRAYNOTIFYIDS[0][0] If $nID = $TRAYNOTIFYIDS[$i][0] Then $bFound = TRUE ExitLoop EndIf Next If Not $bFound Then Return 0 Local $stNID = DllStructCreate($sNOTIFYICONDATAW) If BitAnd($nState, 1) Then DllStructSetData($stNID, 1, DllStructGetSize($stNID)) DllStructSetData($stNID, 2, $TRAYMSGWND) DllStructSetData($stNID, 3, $nID) DllStructSetData($stNID, 4, BitOr($NIF_ICON, $NIF_MESSAGE)) DllStructSetData($stNID, 5, $TRAYTIPMSG) DllStructSetData($stNID, 6, $TRAYNOTIFYIDS[$nID][1]) $nResult = Shell_NotifyIcon($NIM_ADD, DllStructGetPtr($stNID)) If $nResult Then _TrayIconSetToolTip($nID, $TRAYNOTIFYIDS[$nID][4]) ElseIf BitAnd($nState, 2) Then DllStructSetData($stNID, 1, DllStructGetSize($stNID)) DllStructSetData($stNID, 2, $TRAYMSGWND) DllStructSetData($stNID, 3, $nID) $nResult = Shell_NotifyIcon($NIM_DELETE, DllStructGetPtr($stNID)) EndIf If BitAnd($nState, 4) Then If Not $TRAYNOTIFYIDS[$nID][7] Then If $hBlankIcon = 0 Then _CreateBlankIcon() If $hBlankIcon <> 0 Then ;SetTimer($TRAYMSGWND, $FLASHTIMERID, $FLASHTIMEOUT, 0) ; nickston SetTimer($TRAYMSGWND, $nID, $FLASHTIMEOUT, 0) $TRAYNOTIFYIDS[$nID][7] = TRUE EndIf EndIf ElseIf BitAnd($nState, 8) Then ;KillTimer($TRAYMSGWND, $FLASHTIMERID) ; nickston KillTimer($TRAYMSGWND, $nID) DllStructSetData($stNID, 1, DllStructGetSize($stNID)) DllStructSetData($stNID, 2, $TRAYMSGWND) DllStructSetData($stNID, 3, $nID) DllStructSetData($stNID, 4, $NIF_ICON) DllStructSetData($stNID, 6, $TRAYNOTIFYIDS[$nID][1]) $nResult = Shell_NotifyIcon($NIM_MODIFY, DllStructGetPtr($stNID)) $TRAYNOTIFYIDS[$nID][7] = FALSE $TRAYNOTIFYIDS[$nID][8] = FALSE EndIf Return $nResult EndFunc ;********************************************************************** ; _TrayIconSetIcon($NotificationID, IconFile [, IconID]) ;********************************************************************** Func _TrayIconSetIcon($nID = -1, $sIconFile = @AutoItExe, $nIconID = 0) If $nID = -1 Then $nID = $TRAYLASTID If $TRAYMSGWND = 0 Or $nID <= 0 Then Return 0 $nIconID = _GetIconID($nIconID, $sIconFile) Local $hIcon = 0 If $sIconFile = "" Then If $nIconID = 0 Then $sIconFile = @AutoItExe Else $hIcon = LoadIcon(0, $nIconID) EndIf EndIf If $sIconFile <> "" Then Local $stIcon = DllStructCreate("hwnd") If ExtractIconExW($sIconFile, $nIconID, 0, DllStructGetPtr($stIcon), 1) > 0 Then $hIcon = DllStructGetData($stIcon, 1) Else $hIcon = LoadIcon(0, 32516) EndIf EndIf Local $stNID = DllStructCreate($sNOTIFYICONDATAW) DllStructSetData($stNID, 1, DllStructGetSize($stNID)) DllStructSetData($stNID, 2, $TRAYMSGWND) DllStructSetData($stNID, 3, $nID) DllStructSetData($stNID, 4, $NIF_ICON) DllStructSetData($stNID, 6, $hIcon) DestroyIcon($TRAYNOTIFYIDS[$nID][1]) Local $nResult = Shell_NotifyIcon($NIM_MODIFY, DllStructGetPtr($stNID)) If $nResult Then $TRAYNOTIFYIDS[$nID][1] = $hIcon Else DestroyIcon($hIcon) $TRAYNOTIFYIDS[$nID][1] = 0 EndIf Return $nResult EndFunc ;********************************************************************** ; _TrayIconSetToolTip($NotificationID, $sToolTip) ;********************************************************************** Func _TrayIconSetToolTip($nID = -1, $sToolTip = $sDefaultTT) If $nID = -1 Then $nID = $TRAYLASTID If $TRAYMSGWND = 0 Or $nID <= 0 Then Return 0 Local $stNID = DllStructCreate($sNOTIFYICONDATAW) DllStructSetData($stNID, 1, DllStructGetSize($stNID)) DllStructSetData($stNID, 2, $TRAYMSGWND) DllStructSetData($stNID, 3, $nID) DllStructSetData($stNID, 4, $NIF_TIP) DllStructSetData($stNID, 7, $sToolTip) Return Shell_NotifyIcon($NIM_MODIFY, DllStructGetPtr($stNID)) EndFunc ;********************************************************************** ; _TrayGetMenuHandle($NotificationID) ;********************************************************************** Func _TrayGetMenuHandle($nID) If $nID = -1 Then $nID = $TRAYLASTID If $TRAYMSGWND = 0 Or $nID <= 0 Then Return 0 Return $TRAYNOTIFYIDS[$nID][2] EndFunc ;********************************************************************** ; Return a free index in the item array or create a new index ;********************************************************************** Func _GetNewItemIndex() Local $i = 0, $bFreeFound = FALSE For $i = 1 To $arMenuItems[0][0] If $arMenuItems[$i][0] = 0 Then $bFreeFound = TRUE ExitLoop EndIf Next If Not $bFreeFound Then $arMenuItems[0][0] += 1 Local $nSize = UBound($arMenuItems) If $arMenuItems[0][0] > $nSize - $nMenuItemsRedim Then _ Redim $arMenuItems[$nSize + $nMenuItemsRedim][8] $i = $arMenuItems[0][0] EndIf Return $i EndFunc ;********************************************************************** ; Return a free index in the item array or create a new index ;********************************************************************** Func _GetNewSideItemIndex() Local $i = 0, $bFreeFound = FALSE For $i = 1 To $arSideItems[0][0] If $arSideItems[$i][0] = 0 Then $bFreeFound = TRUE ExitLoop EndIf Next If Not $bFreeFound Then $arSideItems[0][0] += 1 Local $nSize = UBound($arSideItems) If $arSideItems[0][0] > $nSize - $nMenuItemsRedim Then _ Redim $arSideItems[$nSize + $nMenuItemsRedim][10] $i = $arSideItems[0][0] EndIf Return $i EndFunc ;********************************************************************** ; Create a context menu for a tray notify ID ;********************************************************************** Func _TrayCreateContextMenu($nID = -1) Local $nIdx = _GetTrayNotifyIdx($nID) If $nIdx = 0 Then Return 0 Local $nContext = 0 If $TRAYNOTIFYIDS[$nIdx][2] = 0 Then Local $nDummy = GUICtrlCreateDummy() $nContext = GUICtrlCreateContextMenu($nDummy) $TRAYNOTIFYIDS[$nIdx][2] = $nContext $TRAYLASTMENU = $nContext EndIf Return $nContext EndFunc ;********************************************************************** ; Create a (context) menu for a tray notify ID ;********************************************************************** Func _TrayCreateMenu($sText, $nMenuID = -1, $nMenuEntry = -1) If $nMenuID = -1 Then $nMenuID = $TRAYLASTMENU Local $nMenu = GUICtrlCreateMenu($sText, $nMenuID, $nMenuEntry) If $nMenu > 0 Then Local $nIdx = _GetNewItemIndex() If $nIdx = 0 Then Return 0 $TRAYLASTITEM = $nMenu Local $hMenu = GUICtrlGetHandle($nMenuID) $arMenuItems[$nIdx][0] = $nMenu $arMenuItems[$nIdx][1] = $sText $arMenuItems[$nIdx][2] = -1 $arMenuItems[$nIdx][3] = $hMenu $arMenuItems[$nIdx][4] = 0 $arMenuItems[$nIdx][5] = TRUE $arMenuItems[$nIdx][6] = -1 $arMenuItems[$nIdx][7] = TRUE EndIf Return $nMenu EndFunc ;********************************************************************** ; Create a menuitem for a tray notify ID ;********************************************************************** Func _TrayCreateItem($sText, $nMenuID = -1, $nMenuEntry = -1, $bRadio = 0) If $nMenuID = -1 Then $nMenuID = $TRAYLASTMENU Local $nMenuItem = GUICtrlCreateMenuItem($sText, $nMenuID, $nMenuEntry, $bRadio) If $nMenuItem > 0 Then Local $nIdx = _GetNewItemIndex() If $nIdx = 0 Then Return 0 $TRAYLASTITEM = $nMenuItem Local $hMenu = GUICtrlGetHandle($nMenuID) $arMenuItems[$nIdx][0] = $nMenuItem $arMenuItems[$nIdx][1] = $sText $arMenuItems[$nIdx][2] = -1 $arMenuItems[$nIdx][3] = $hMenu $arMenuItems[$nIdx][4] = $bRadio $arMenuItems[$nIdx][5] = TRUE $arMenuItems[$nIdx][6] = -1 $arMenuItems[$nIdx][7] = FALSE EndIf Return $nMenuItem EndFunc ;********************************************************************** ; Delete a menu (item) ;********************************************************************** Func _GUICtrlODMenuItemDelete($nID) Return _TrayDeleteItem($nID) EndFunc Func _TrayDeleteItem($nID) Local $i, $k, $nResult = 0, $bFound = FALSE Local $hMenu = GUICtrlGetHandle($nID) Local $bIsMenu = FALSE If $hMenu <> 0 Then $bIsMenu = TRUE For $i = 1 To $arMenuItems[0][0] If $arMenuItems[$i][0] = 0 Then ContinueLoop If $bIsMenu Then For $k = 1 To $arMenuItems[0][0] If $arMenuItems[$k][3] = $hMenu And _ $arMenuItems[$i][0] <> $arMenuItems[$k][0] Then _TrayDeleteItem($arMenuItems[$k][0]) ;$k <> $i Then _TrayDeleteItem($arMenuItems[$k][0]) Next EndIf If $arMenuItems[$i][0] = $nID Then If GUICtrlDelete($nID) Then $arMenuItems[$i][0] = 0 $arMenuItems[$i][1] = "" $arMenuItems[$i][2] = -1 $arMenuItems[$i][3] = 0 $arMenuItems[$i][4] = 0 $arMenuItems[$i][5] = FALSE $arMenuItems[$i][6] = -1 $arMenuItems[$i][7] = FALSE $nResult = 1 $bFound = TRUE EndIf ExitLoop EndIf Next If Not $bFound And $nID <> 0 Then GUICtrlDelete($nID) Return $nResult EndFunc ;********************************************************************** ; Sets the possible clicks ;********************************************************************** Func _TrayIconSetClick($nID, $nClicks) If $nID = -1 Then $nID = $TRAYLASTID If $TRAYMSGWND = 0 Or $nID <= 0 Then Return 0 $TRAYNOTIFYIDS[$nID][3] = $nClicks EndFunc ;********************************************************************** ; TrayTip() ;********************************************************************** Func _TrayTip($nID, $sTitle, $sText, $nTimeOut = 10, $nInfoFlags = 0) If $nID = -1 Then $nID = $TRAYLASTID If $TRAYMSGWND = 0 Or $nID <= 0 Then Return 0 Local $stNID = DllStructCreate($sNOTIFYICONDATAW) DllStructSetData($stNID, 1, DllStructGetSize($stNID)) DllStructSetData($stNID, 2, $TRAYMSGWND) DllStructSetData($stNID, 3, $nID) DllStructSetData($stNID, 4, $NIF_INFO) DllStructSetData($stNID, 10, $sText) DllStructSetData($stNID, 11, $nTimeOut * 1000) DllStructSetData($stNID, 12, $sTitle) DllStructSetData($stNID, 13, $nInfoFlags) Local $nResult = Shell_NotifyIcon($NIM_MODIFY, DllStructGetPtr($stNID)) Return $nResult EndFunc ;******************************************************************** ; WM_MEASURE procedure ;******************************************************************** Func WM_MEASUREITEM($hWnd, $Msg, $wParam, $lParam) #forceref $Msg, $wParam Local $nResult = FALSE Local $stMeasureItem = DllStructCreate("uint;uint;uint;uint;uint;dword", $lParam) If DllStructGetData($stMeasureItem, 1) = 1 Then Local $nIconSize = 0 Local $nCheckX = 0 Local $nSpace = 2 _GetMenuInfos($nIconSize, $nCheckX) If $nIconSize < $nCheckX Then $nIconSize = $nCheckX Local $nMenuItemID = DllStructGetData($stMeasureItem, 3) Local $hDC = GetDC($hWnd) Local $hMenu = _GetMenuHandle($nMenuItemID) Local $nState = GetMenuState($hMenu, $nMenuItemID, 0) ; Reassign the current menu font to the menuitem Local $hMFont = 0 Local $bBoldFont = FALSE If BitAnd($nState, 0x00001000) And Not BitAnd($nState, 0x00000010) Then _CreateMenuFont($hMFont, TRUE) $bBoldFont = TRUE Else $hMFont = $hMenuFont EndIf Local $hFont = SelectObject($hDC, $hMFont) Local $sText = _GetMenuText($nMenuItemID) Local $nSideIdx = _GetSideMenuIndex($hMenu) Local $sSideText = _GetSideMenuText($nSideIdx) Local $hSideImage = _GetSideMenuImage($nSideIdx) Local $nSideWidth = 0 If $sSideText <> "" Then If $hSideImage = 0 Then Local $hSideFont = 0 _CreateMenuFont($hSideFont, TRUE, TRUE) Local $hOldObj = SelectObject($hDC, $hSideFont) $nSideWidth = _GetSideMenuTextWidth($hDC, $sSideText) + 2 ; 1 x 1 left + right SelectObject($hDC, $hOldObj) DeleteObject($hSideFont) Else Local $nSideHeight = 0 Local $bStretch = FALSE _GetSideMenuImageSize($nSideIdx, $nSideWidth, $nSideHeight, $bStretch) EndIf EndIf Local $nMaxTextWidth = 0 Local $nMaxTextAccWidth = 0 _GetMenuMaxTextWidth($hDC, $hMenu, $nMaxTextWidth, $nMaxTextAccWidth) If $nMaxTextAccWidth > 0 Then $nMaxTextAccWidth += 4 Local $nHeight = 2 * $nSpace + $nIconSize Local $nWidth = 0 ; Set a default separator height If $sText = "" Then $nHeight = 4 Else $nWidth = 6 * $nSpace + 2 * $nIconSize + $nMaxTextWidth + $nMaxTextAccWidth + $nSideWidth If $hMenu = "TOP" Then $nWidth = 4 * $nSpace+$nMaxTextWidth + $nMaxTextAccWidth ; Maybe this differs - have no emulator here at the moment $nWidth = $nWidth - $nCheckX + 1 EndIf DllStructSetData($stMeasureItem, 4, $nWidth) ; ItemWidth DllStructSetData($stMeasureItem, 5, $nHeight) ; ItemHeight SelectObject($hDC, $hFont) If $bBoldFont Then DeleteObject($hMFont) ReleaseDC($hWnd, $hDC) $nResult = TRUE EndIf $stMeasureItem = 0 Return $nResult EndFunc ;******************************************************************** ; WM_DRAWITEM procedure ;******************************************************************** Func WM_DRAWITEM($hWnd, $Msg, $wParam, $lParam) #forceref $hWnd, $Msg, $wParam Local $nResult = "GUI_RUNDEFMSG" ;Local $stDrawItem = DllStructCreate("uint;uint;uint;uint;uint;dword;dword;int[4];dword", $lParam) Local $stDrawItem = DllStructCreate("uint;uint;uint;uint;uint;hwnd;hwnd;int[4];dword", $lParam) ; Works on x64 If DllStructGetData($stDrawItem, 1) = 1 Then ; 1 = ODT_MENU $nResult = FALSE Local $nMenuItemID = DllStructGetData($stDrawItem, 3) Local $nAction = DllStructGetData($stDrawItem, 4) Local $nState = DllStructGetData($stDrawItem, 5) Local $hMenu = DllStructGetData($stDrawItem, 6) Local $hDC = DllStructGetData($stDrawItem, 7) Local $bChecked = BitAnd($nState, 0x0008) Local $bGrayed = BitAnd($nState, 0x0002) Local $bSelected = BitAnd($nState, 0x0001) Local $bDefault = BitAnd($nState, 0x0020) Local $bNoAcc = BitAnd($nState, 0x0100) Local $bIsRadio = _GetMenuIsRadio($nMenuItemID) Local $nSideIdx = _GetSideMenuIndex($hMenu) Local $sSideText = _GetSideMenuText($nSideIdx) Local $hSideImage = _GetSideMenuImage($nSideIdx) Local $hSideFont = 0 Local $hOldObj = 0 Local $nSideWidth = 0 Local $nSideHeight = 0 Local $bHasSide = FALSE Local $bStretch = FALSE If $sSideText <> "" Then If $hSideImage = 0 Then _CreateMenuFont($hSideFont, TRUE, TRUE) $hOldObj = SelectObject($hDC, $hSideFont) $nSideWidth = _GetSideMenuTextWidth($hDC, $sSideText) + 2 ; 1 left + 1 right SelectObject($hDC, $hOldObj) Else _GetSideMenuImageSize($nSideIdx, $nSideWidth, $nSideHeight, $bStretch) EndIf $bHasSide = TRUE EndIf Local $arIR[4] $arIR[0] = DllStructGetData($stDrawItem, 8, 1) + $nSideWidth $arIR[1] = DllStructGetData($stDrawItem, 8, 2) $arIR[2] = DllStructGetData($stDrawItem, 8, 3) $arIR[3] = DllStructGetData($stDrawItem, 8, 4) Local $stItemRect = DllStructCreate("int;int;int;int") _SetItemRect($stItemRect, $arIR[0], $arIR[1], $arIR[2], $arIR[3]) ; Set default menu values if info function fails Local $nIconSize = 16 Local $nCheckX = 16 Local $nSpace = 2 _GetMenuInfos($nIconSize, $nCheckX) Local $nMBkClr = $nMenuBkClr Local $nMIconBkClr = $nMenuIconBkClr Local $nMIconBkClr2 = $nMenuIconBkClr2 Local $nMSelectBkClr = $nMenuSelectBkClr Local $nMSelectRectClr = $nMenuSelectRectClr Local $nMSelectTextClr = $nMenuSelectTextClr Local $nMTextClr = $nMenuTextClr Local $bIsTrayItem = _IsTrayItem($nMenuItemID) Local $IsMenuBarItem = (_GetMenuHandle($nMenuItemID)== "TOP") And Not $bIsTrayItem If $nState = 320 And $IsMenuBarItem Then $nMBkClr = $nMSelectBkClr $nMTextClr = $nMSelectTextClr EndIf If $bIsTrayItem Then $nMBkClr = $nTrayBkClr $nMIconBkClr = $nTrayIconBkClr $nMIconBkClr2 = $nTrayIconBkClr2 $nMSelectBkClr = $nTraySelectBkClr $nMSelectRectClr = $nTraySelectRectClr $nMSelectTextClr = $nTraySelectTextClr $nMTextClr = $nTrayTextClr EndIf ; Select our at beginning selfcreated menu font into the item device context Local $hMFont = 0 Local $bBoldFont = FALSE If $bDefault Then _CreateMenuFont($hMFont, TRUE) $bBoldFont = TRUE Else $hMFont = $hMenuFont EndIf Local $hBrush = 0 Local $hOldBrush = 0 Local $nClrSel = 0 Local $hBorderBrush = 0 Local $nLen = 0 ; Show side menu only if action = ODA_DRAWENTIRE If $nAction = 1 Then Local $nCount = GetMenuItemCount($hMenu) Local $nID = GetMenuItemID($hMenu, $nCount - 1) If $nID = -1 Then Local $stMII = DllStructCreate($sMENUITEMINFO) DllStructSetData($stMII, 1, DllStructGetSize($stMII)) DllStructSetData($stMII, 2, 0x00000002) ; MIIM_ID If GetMenuItemInfo($hMenu, $nCount - 1, TRUE, DllStructGetPtr($stMII)) Then _ $nID = DllStructGetData($stMII, 5) EndIf If $nID = $nMenuItemID And $bHasSide Then Local $stSideRect = DllStructCreate("int;int;int;int") _SetItemRect($stSideRect, 0, 0, $nSideWidth, $arIR[3]) Local $nSideClr = $nMenuSideTxtClr Local $nSideBkClr = $nMenuSideBkClr Local $nSideBkClr2 = $nMenuSideBkClr2 _GetSideMenuColors($nSideIdx, $nSideClr, $nSideBkClr, $nSideBkClr2) If $nSideBkClr <> -1 Then If $nSideBkClr = $nSideBkClr2 Or _ $nSideBkClr2 = -1 Then SetBkColor($hDC, $nSideBkClr) $hBrush = CreateSolidBrush($nSideBkClr) $hOldBrush = SelectObject($hDC, $hBrush) FillRect($hDC, DllStructGetPtr($stSideRect), $hBrush) SelectObject($hDC, $hOldBrush) DeleteObject($hBrush) $hBrush = 0 $hOldBrush = 0 Else _FillGradientRect($hDC, $stSideRect, $nSideBkClr2, $nSideBkClr, TRUE) EndIf EndIf If $hSideImage = 0 Then $nLen = StringLen($sSideText) Local $stSideText = DllStructCreate("wchar[" & $nLen + 1 & "]") DllStructSetData($stSideText, 1, $sSideText) $hOldObj = SelectObject($hDC, $hSideFont) Local $nOldMode = SetBkMode($hDC, 1) SetTextColor($hDC, $nSideClr) DllStructSetData($stSideRect, 2, 8) DllStructSetData($stSideRect, 4, DllStructGetData($stSideRect, 4) + 8) DrawTextW($hDC, DllStructGetPtr($stSideText), _ StringLen($sSideText), _ DllStructGetPtr($stSideRect), _ BitOr(0x00000008, 0x00000020, 0x00000100)) SetBkMode($hDC, $nOldMode) SelectObject($hDC, $hOldObj) Else Local $hCDC = CreateCompatibleDC($hDC) Local $hObjOld = SelectObject($hCDC, $hSideImage) If $bStretch Then StretchBlt($hDC, 0, 0, $nSideWidth, $arIR[3], $hCDC, 0, 0, $nSideWidth, $nSideHeight, 0x00CC0020) Else BitBlt($hDC, 0, 0, $nSideWidth, $arIR[3], $hCDC, 0, $nSideHeight - $arIR[3], 0x00CC0020) EndIf SelectObject($hCDC, $hObjOld) DeleteDC($hCDC) EndIf EndIf EndIf If $hSideFont <> 0 Then DeleteObject($hSideFont) Local $hFont = SelectObject($hDC, $hMFont) ; Only show a menu bar when the item is enabled If $bSelected Then ;And Not $bGrayed Then If ($bUseAdvMenu And $bIsTrayItem = FALSE) Or ($bUseAdvTrayMenu And $bIsTrayItem) Then $hBorderBrush = CreateSolidBrush($nMSelectRectClr) If $bGrayed Then $hBrush = CreateSolidBrush($nMBkClr) $nClrSel = $nMBkClr Else $hBrush = CreateSolidBrush($nMSelectBkClr) ; BGR color value $nClrSel = $nMSelectBkClr EndIf Else $hBrush = GetSysColorBrush(13) $nClrSel = GetSysColor(13) EndIf Else If ($bUseAdvMenu And $bIsTrayItem = FALSE) Or ($bUseAdvTrayMenu And $bIsTrayItem) Then $hBrush = CreateSolidBrush($nMBkClr) $nClrSel = $nMBkClr Else $hBrush = GetSysColorBrush(4) $nClrSel = GetSysColor(4) EndIf EndIf Local $nClrTxt = 0 If $bSelected And Not $bGrayed Then If ($bUseAdvMenu And $bIsTrayItem = FALSE) Or ($bUseAdvTrayMenu And $bIsTrayItem) Then $nClrTxt = SetTextColor($hDC, $nMSelectTextClr) Else $nClrTxt = SetTextColor($hDC, GetSysColor(14)) EndIf ElseIf $bGrayed Then $nClrTxt = SetTextColor($hDC, GetSysColor(17)) Else If ($bUseAdvMenu And $bIsTrayItem = FALSE) Or ($bUseAdvTrayMenu And $bIsTrayItem) Then $nClrTxt = SetTextColor($hDC, $nMTextClr) Else $nClrTxt = SetTextColor($hDC, GetSysColor(7)) EndIf EndIf Local $nClrBk = SetBkColor($hDC, $nClrSel) $hOldBrush = SelectObject($hDC, $hBrush) FillRect($hDC, DllStructGetPtr($stItemRect), $hBrush) SelectObject($hDC, $hOldBrush) DeleteObject($hBrush) If $IsMenuBarItem Then $nIconSize = 0 $nCheckX = 0 $nSpace = 2 EndIf If Not $IsMenuBarItem And ($bUseAdvMenu And $bIsTrayItem = FALSE) Or ($bUseAdvTrayMenu And $bIsTrayItem) Then ; Create a small gray edge If Not $bSelected Or $bGrayed Then ; Reassign the item rect _SetItemRect($stItemRect, $arIR[0], $arIR[1], $arIR[0] + 2 * $nSpace + $nIconSize + 1, $arIR[3]) If $nMIconBkClr = $nMIconBkClr2 Or _ $nMIconBkClr2 = -1 Then $hBrush = CreateSolidBrush($nMIconBkClr) $hOldBrush = SelectObject($hDC, $hBrush) FillRect($hDC, DllStructGetPtr($stItemRect), $hBrush) SelectObject($hDC, $hOldBrush) DeleteObject($hBrush) Else _FillGradientRect($hDC, $stItemRect, $nMIconBkClr, $nMIconBkClr2) EndIf EndIf EndIf If $bChecked Then _SetItemRect($stItemRect, $arIR[0] + 1, $arIR[1] + 1, $arIR[0] + $nIconSize + $nSpace + 1, $arIR[1] + $nIconSize + $nSpace + 1) If $bSelected Then If ($bUseAdvMenu And $bIsTrayItem = FALSE) Or ($bUseAdvTrayMenu And $bIsTrayItem) Then $hBrush = CreateSolidBrush($nMSelectBkClr) Else $hBrush = GetSysColorBrush(13) EndIf Else If ($bUseAdvMenu And $bIsTrayItem = FALSE) Or ($bUseAdvTrayMenu And $bIsTrayItem) Then $hBrush = CreateSolidBrush($nMBkClr) Else $hBrush = GetSysColorBrush(4) EndIf EndIf $hOldBrush = SelectObject($hDC, $hBrush) FillRect($hDC, DllStructGetPtr($stItemRect), $hBrush) SelectObject($hDC, $hOldBrush) DeleteObject($hBrush) ; Create a checkmark/bullet for the checked/radio items Local $hDCBitmap = CreateCompatibleDC($hDC) Local $hbmpCheck = CreateBitmap($nIconSize, $nIconSize, 1, 1, 0) Local $hbmpOld = SelectObject($hDCBitmap, $hbmpCheck) Local $x = DllStructGetData($stItemRect, 1) + ($nIconSize + $nSpace - $nCheckX) / 2 Local $y = DllStructGetData($stItemRect, 2) + ($nIconSize + $nSpace - $nCheckX) / 2 - $nSpace _SetItemRect($stItemRect, 0, 0, $nIconSize, $nIconSize) Local $nCtrlStyle = 0x0001 If $bIsRadio Then $nCtrlStyle = 0x0002 DrawFrameControl($hDCBitmap, DllStructGetPtr($stItemRect), 2, $nCtrlStyle) BitBlt($hDC, $x, $y + 1, $nCheckX, $nCheckX, $hDCBitmap, 0, 0, 0x00CC0020) If ($bUseAdvMenu And $bIsTrayItem = FALSE) Or ($bUseAdvTrayMenu And $bIsTrayItem) Then _SetItemRect($stItemRect, $arIR[0] + 1, $arIR[1] + 1, $arIR[0] + $nIconSize + $nSpace + 1, $arIR[1] + $nIconSize + $nSpace + 1) $hBrush = CreateSolidBrush($nMSelectRectClr) $hOldBrush = SelectObject($hDC, $hBrush) FrameRect($hDC, DllStructGetPtr($stItemRect), $hBrush) SelectObject($hDC, $hOldBrush) DeleteObject($hBrush) EndIf SelectObject($hDCBitmap, $hbmpOld) DeleteObject($hbmpCheck) DeleteDC($hDCBitmap) EndIf ; Reassign the item rect _SetItemRect($stItemRect, $arIR[0], $arIR[1], $arIR[2], $arIR[3]) If ($bUseAdvMenu And $bIsTrayItem = FALSE) Or ($bUseAdvTrayMenu And $bIsTrayItem) Then ;If $bSelected And Not $bGrayed Then If $bSelected Then ; Show also a rect around a disabled item $hOldBrush = SelectObject($hDC, $hBorderBrush) FrameRect($hDC, DllStructGetPtr($stItemRect), $hBorderBrush) SelectObject($hDC, $hOldBrush) DeleteObject($hBorderBrush) EndIf EndIf Local $sText = _GetMenuText($nMenuItemID) If $bNoAcc Then $sText = StringReplace($sText, "&", "") Local $nWidth = 0 Local $sAcc = "" Local $arText = StringSplit($sText, @Tab) Local $bTab = FALSE If IsArray($arText) And $arText[0] > 1 Then $sText = $arText[1] $sAcc = $arText[2] $bTab = TRUE EndIf $nLen = StringLen($sText) Local $stText = DllStructCreate("wchar[" & $nLen + 1 & "]") DllStructSetData($stText, 1, $sText) Local $nSaveLeft = DllStructGetData($stItemRect, 1) Local $nLeft = $nSaveLeft $nLeft += $nSpace ; Left border $nLeft += $nSpace ; Space after gray border $nLeft += $nIconSize ; Icon width $nLeft += $nSpace + 2 ; Right after the icon DllStructSetData($stItemRect, 1, $nLeft) Local $nFlags = BitOr(0x00000100, 0x00000020, 0x00000004) DrawTextW($hDC, DllStructGetPtr($stText), $nLen, DllStructGetPtr($stItemRect), $nFlags) ; Draw accelerator text If $bTab Then Local $nMaxTextWidth = 0 Local $nMaxTextAccWidth = 0 _GetMenuMaxTextWidth($hDC, $hMenu, $nMaxTextWidth, $nMaxTextAccWidth) If $nMaxTextAccWidth > 0 Then $nMaxTextAccWidth += 4 $nWidth = 6 * $nSpace + 2 * $nIconSize + $nMaxTextWidth ; Maybe this differs - have no emulator here at the moment $nWidth = $nWidth - $nCheckX + 1 $nLen = StringLen($sAcc) $stText = DllStructCreate("wchar[" & $nLen + 1 & "]") DllStructSetData($stText, 1, $sAcc) ; Set rect for acc text _SetItemRect($stItemRect, $arIR[0] + $nWidth, $arIR[1], $arIR[0] + $nWidth + $nMaxTextAccWidth, $arIR[3]) DrawTextW($hDC, DllStructGetPtr($stText), $nLen, DllStructGetPtr($stItemRect), $nFlags) ; Reset rect values _SetItemRect($stItemRect, $arIR[0], $arIR[1], $arIR[2], $arIR[3]) EndIf Local $nNoSelIconIndex = -1 Local $nSelIconIndex = -1 _GetMenuIconIndex($nMenuItemID, $nNoSelIconIndex, $nSelIconIndex) Local $nIconIndex = $nNoSelIconIndex If $bSelected And $nSelIconIndex > -1 Then $nIconIndex = $nSelIconIndex If $nIconIndex > -1 Then If Not $bChecked Then If $bGrayed Then ; An easy way to draw something that looks deactivated ImageList_DrawEx($hMenuImageList, _ $nIconIndex, _ $hDC, _ $nSpace + $nSideWidth, _ DllStructGetData($stItemRect, 2) + 2, _ 0, _ 0, _ 0xFFFFFFFF, _ 0xFFFFFFFF, _ BitOr(0x0004, 0x0001)) Else ; Draw the icon "normal" ImageList_Draw($hMenuImageList, _ $nIconIndex, _ $hDC, _ $nSpace + $nSideWidth, _ DllStructGetData($stItemRect, 2) + 2, _ 0x0001) EndIf EndIf EndIf DllStructSetData($stItemRect, 1, $nSaveLeft) ; Draw a "line" for a separator item If StringLen($sText) = 0 Then If ($bUseAdvMenu And $bIsTrayItem = FALSE) Or ($bUseAdvTrayMenu And $bIsTrayItem) Then DllStructSetData($stItemRect, 1, DllStructGetData($stItemRect, 1) + 4 * $nSpace + $nIconSize) Else DllStructSetData($stItemRect, 1, DllStructGetData($stItemRect, 1)) EndIf DllStructSetData($stItemRect, 2, DllStructGetData($stItemRect, 2) + 1) DllStructSetData($stItemRect, 4, DllStructGetData($stItemRect, 1) + 2) DrawEdge($hDC, DllStructGetPtr($stItemRect), 0x0006, 0x0002) EndIf $stText = 0 $stItemRect = 0 SelectObject($hDC, $hFont) If $bBoldFont Then DeleteObject($hMFont) SetTextColor($hDC, $nClrTxt) SetBkColor($hDC, $nClrBk) $nResult = TRUE EndIf $stDrawItem = 0 Return $nResult EndFunc ;******************************************************************** ; Get color part ;******************************************************************** Func _ColorGetClr($nColor, $nMode) Local $nClr = $nColor If $bUseRGBColors Then $nClr = _GetBGRColor($nColor) Switch $nMode Case 1 $nClr = BitShift($nClr, 16) Case 2 $nClr = BitShift(BitAnd($nClr, 0xFF00), 8) Case 3 $nClr = BitAnd($nClr, 0xFF) EndSwitch Return $nClr EndFunc ;******************************************************************** ; Fill background rect with gradient colors ;******************************************************************** Func _FillGradientRect($hDC, $stRect, $nClr1, $nClr2, $bVert = FALSE) Local $stVert = DllStructCreate("long;long;ushort;ushort;ushort;ushort;" & _ "long;long;ushort;ushort;ushort;ushort") DllStructSetData($stVert, 1, DllStructGetData($stRect, 1)) DllStructSetData($stVert, 2, DllStructGetData($stRect, 2)) DllStructSetData($stVert, 3, BitShift(_ColorGetClr($nClr1, 3), -8)) DllStructSetData($stVert, 4, BitShift(_ColorGetClr($nClr1, 2), -8)) DllStructSetData($stVert, 5, BitShift(_ColorGetClr($nClr1, 1), -8)) DllStructSetData($stVert, 6, 0) DllStructSetData($stVert, 7, DllStructGetData($stRect, 3)) DllStructSetData($stVert, 8, DllStructGetData($stRect, 4)) DllStructSetData($stVert, 9, BitShift(_ColorGetClr($nClr2, 3), -8)) DllStructSetData($stVert, 10, BitShift(_ColorGetClr($nClr2, 2), -8)) DllStructSetData($stVert, 11, BitShift(_ColorGetClr($nClr2, 1), -8)) DllStructSetData($stVert, 12, 0) Local $stGradRect = DllStructCreate("ulong;ulong") DllStructSetData($stGradRect, 1, 0) DllStructSetData($stGradRect, 2, 1) If $bVert Then GradientFill($hDC, DllStructGetPtr($stVert), 2, DllStructGetPtr($stGradRect), 1, 1) Else GradientFill($hDC, DllStructGetPtr($stVert), 2, DllStructGetPtr($stGradRect), 1, 0) EndIf EndFunc ;******************************************************************** ; Sets 4 values to a itemrect struct ;******************************************************************** Func _SetItemRect(ByRef $stStruct, $p1, $p2, $p3, $p4) DllStructSetData($stStruct, 1, $p1) DllStructSetData($stStruct, 2, $p2) DllStructSetData($stStruct, 3, $p3) DllStructSetData($stStruct, 4, $p4) EndFunc ;******************************************************************** ; WM_SETTINGCHANGE procedure ;******************************************************************** Func WM_SETTINGCHANGE($hWnd, $Msg, $wParam, $lParam) #forceref $hWnd, $Msg, $lParam If $wParam = 0x002A Then _CreateMenuFont($hMenuFont) EndFunc ;******************************************************************** ; WM_TIMER procedure ;******************************************************************** Func WM_TIMER($hWnd, $Msg, $wParam, $lParam) #forceref $hWnd, $Msg, $lParam Local $nID = Number($wParam) If $TRAYNOTIFYIDS[$nID][0] > 0 Then If $TRAYNOTIFYIDS[$nID][7] Then Local $stNID = DllStructCreate($sNOTIFYICONDATAW) DllStructSetData($stNID, 1, DllStructGetSize($stNID)) DllStructSetData($stNID, 2, $TRAYMSGWND) DllStructSetData($stNID, 3, $nID) DllStructSetData($stNID, 4, $NIF_ICON) If $TRAYNOTIFYIDS[$nID][8] Then DllStructSetData($stNID, 6, $hBlankIcon) $TRAYNOTIFYIDS[$nID][8] = FALSE Else DllStructSetData($stNID, 6, $TRAYNOTIFYIDS[$nID][1]) $TRAYNOTIFYIDS[$nID][8] = TRUE EndIf Shell_NotifyIcon($NIM_MODIFY, DllStructGetPtr($stNID)) EndIf EndIf KillTimer($TRAYMSGWND, $FLASHTIMERID) SetTimer($TRAYMSGWND, $FLASHTIMERID, $FLASHTIMEOUT, 0) EndFunc ;******************************************************************** ; Create a menu item and set its style to OwnerDrawn ;******************************************************************** Func _GUICtrlCreateODMenuItem($sMenuItemText, $nParentMenu, $sIconFile = "", $nIconID = 0, $bRadio = 0) Local $nMenuItem = GUICtrlCreateMenuItem($sMenuItemText, $nParentMenu, -1, $bRadio) $nIconID = _GetIconID($nIconID, $sIconFile) If $nMenuItem > 0 Then Local $nIdx = _GetNewItemIndex() If $nIdx = 0 Then Return 0 $MENULASTITEM = $nMenuItem Local $hMenu = GUICtrlGetHandle($nParentMenu) $arMenuItems[$nIdx][0] = $nMenuItem $arMenuItems[$nIdx][1] = $sMenuItemText $arMenuItems[$nIdx][2] = _AddMenuIcon($sIconFile, $nIconID) $arMenuItems[$nIdx][3] = $hMenu $arMenuItems[$nIdx][4] = $bRadio $arMenuItems[$nIdx][5] = FALSE $arMenuItems[$nIdx][6] = -1 $arMenuItems[$nIdx][7] = FALSE _SetOwnerDrawn($hMenu, $nMenuItem, $sMenuItemText) EndIf Return $nMenuItem EndFunc ;******************************************************************** ; Create a menu and set its style to OwnerDrawn ;******************************************************************** Func _GUICtrlCreateODMenu($sText, $nParentMenu = "", $sIconFile = "", $nIconID = 0) Local $nMenu If $nParentMenu = "" Then $nMenu = GUICtrlCreateMenu($sText) Else $nMenu = GUICtrlCreateMenu($sText, $nParentMenu) EndIf $nIconID = _GetIconID($nIconID, $sIconFile) If $nMenu > 0 Then Local $nIdx = _GetNewItemIndex() If $nIdx = 0 Then Return 0 $MENULASTITEM = $nMenu Local $hMenu = GUICtrlGetHandle($nParentMenu) $arMenuItems[$nIdx][0] = $nMenu $arMenuItems[$nIdx][1] = $sText $arMenuItems[$nIdx][2] = _AddMenuIcon($sIconFile, $nIconID) $arMenuItems[$nIdx][3] = $hMenu $arMenuItems[$nIdx][4] = 0 $arMenuItems[$nIdx][5] = FALSE $arMenuItems[$nIdx][6] = -1 $arMenuItems[$nIdx][7] = TRUE _SetOwnerDrawn($hMenu, $nMenu, $sText) EndIf Return $nMenu EndFunc Func _GUICtrlCreateODTopMenu($sText, $nParentGUI) Local $nMenu = GUICtrlCreateMenu($sText) If $nMenu > 0 Then Local $nIdx = _GetNewItemIndex() If $nIdx = 0 Then Return 0 $MENULASTITEM = $nMenu Local $hMenu = DllCall("User32.dll", "hwnd", "GetMenu", "hwnd", $nParentGUI) If @error Or $hMenu[0]=0 Then Return SetError(1,0,0) ;~ GetMenuItemInfo(GUICtrlGetHandle($nMenu) $arMenuItems[$nIdx][0] = $nMenu $arMenuItems[$nIdx][1] = $sText $arMenuItems[$nIdx][2] = -1 $arMenuItems[$nIdx][3] = "TOP" $arMenuItems[$nIdx][4] = 0 $arMenuItems[$nIdx][5] = FALSE $arMenuItems[$nIdx][6] = -1 $arMenuItems[$nIdx][7] = TRUE _SetOwnerDrawn($hMenu[0], $nMenu, $sText) MenuBarBKColor($hMenu[0],$nMenuBkClr) EndIf Return $nMenu EndFunc Func _GUIMenuBarSetBkColor($nParentGUI,$nMenuBkClr) Local $hMenu = DllCall("User32.dll", "hwnd", "GetMenu", "hwnd", $nParentGUI) If @error Then Return 0 Local $r = MenuBarBKColor($hMenu[0],$nMenuBkClr) DllCall("User32.dll", "int", "DrawMenuBar", "hwnd",$nParentGUI) DllCall("User32.dll", "int", "RedrawWindow", "hwnd", $nParentGUI, "ptr", 0, "handle", 0, "uint", 0x0400) ;DllCall("User32.dll", "int", "RedrawWindow", "hwnd", $nParentGUI, "ptr", 0, "int", 0, "int", 0x400) Return $r EndFunc ;******************************************************************** ; Set the text of an menu item ;******************************************************************** Func _GUICtrlODMenuItemSetText($nMenuID, $sText) If $nMenuID = -1 Then $nMenuID = $MENULASTITEM If $nMenuID <= 0 Then Return 0 Local $i For $i = 1 To $arMenuItems[0][0] If $arMenuItems[$i][0] = $nMenuID Then $arMenuItems[$i][1] = $sText _SetOwnerDrawn($arMenuItems[$i][3], $nMenuID, $sText, FALSE) GUICtrlSetData($nMenuID, $sText) _SetOwnerDrawn($arMenuItems[$i][3], $nMenuID, $sText) Return 1 EndIf Next EndFunc ;******************************************************************** ; Set the icon of an menu item ;******************************************************************** Func _GUICtrlODMenuItemSetIcon($nMenuID, $sIconFile = "", $nIconID = 0) If $nMenuID = -1 Then $nMenuID = $MENULASTITEM If $nMenuID <= 0 Then Return 0 $nIconID = _GetIconID($nIconID, $sIconFile) Local $i For $i = 1 To $arMenuItems[0][0] If $arMenuItems[$i][0] = $nMenuID Then If $sIconFile = "" Then $arMenuItems[$i][2] = -1 Else If $arMenuItems[$i][2] = -1 Then $arMenuItems[$i][2] = _AddMenuIcon($sIconFile, $nIconID) Else _ReplaceMenuIcon($sIconFile, $nIconID, $arMenuItems[$i][2]) EndIf EndIf Return 1 EndIf Next Return 0 EndFunc ;******************************************************************** ; Set the selected icon of an menu item ;******************************************************************** Func _GUICtrlODMenuItemSetSelIcon($nMenuID, $sIconFile = "", $nIconID = 0) If $nMenuID = -1 Then $nMenuID = $MENULASTITEM If $nMenuID <= 0 Then Return 0 $nIconID = _GetIconID($nIconID, $sIconFile) Local $i For $i = 1 To $arMenuItems[0][0] If $arMenuItems[$i][0] = $nMenuID Then If $sIconFile = "" Then $arMenuItems[$i][6] = -1 Else If $arMenuItems[$i][6] = -1 Then $arMenuItems[$i][6] = _AddMenuIcon($sIconFile, $nIconID) Else _ReplaceMenuIcon($sIconFile, $nIconID, $arMenuItems[$i][6]) EndIf EndIf Return 1 EndIf Next Return 0 EndFunc ;******************************************************************** ; Add an icon to our menu image list ;******************************************************************** Func _AddMenuIcon($sIconFile, $nIconID) If IsHWnd($sIconFile) Or Number($sIconFile)>0 Then Return ImageList_AddIcon($hMenuImageList, $sIconFile) Local $stIcon = DllStructCreate("hwnd") Local $nCount = ExtractIconExW($sIconFile, $nIconID, 0, DllStructGetPtr($stIcon), 1) Local $nIndex = -1 If $nCount > 0 Then $nIndex = ImageList_AddIcon($hMenuImageList, DllStructGetData($stIcon, 1)) DestroyIcon(DllStructGetData($stIcon, 1)) EndIf $stIcon = 0 Return $nIndex EndFunc ;******************************************************************** ; Replace an icon in our menu image list ;******************************************************************** Func _ReplaceMenuIcon($sIconFile, $nIconID, $nReplaceIndex) If $nReplaceIndex < 0 Then Return -1 If IsHWnd($sIconFile) Or Number($sIconFile)>0 Then Return ImageList_ReplaceIcon($hMenuImageList, $nReplaceIndex, $sIconFile) Local $stIcon = DllStructCreate("hwnd") Local $nCount = ExtractIconExW($sIconFile, $nIconID, 0, DllStructGetPtr($stIcon), 1) If $nCount > 0 Then ImageList_ReplaceIcon($hMenuImageList, $nReplaceIndex, DllStructGetData($stIcon, 1)) DestroyIcon(DllStructGetData($stIcon, 1)) EndIf $stIcon = 0 Return 1 EndFunc ;******************************************************************** ; Get the parent menu handle for a menu item ;******************************************************************** Func _GetMenuHandle($nMenuItemID) Local $i, $hMenu = 0 For $i = 1 To $arMenuItems[0][0] If $arMenuItems[$i][0] = $nMenuItemID Then $hMenu = $arMenuItems[$i][3] ExitLoop EndIf Next Return $hMenu EndFunc ;******************************************************************** ; Get the index of a menu item in our store ;******************************************************************** Func _GetMenuIndex($hMenu, $nMenuItemID) Local $nIndex = -1 Local $nCount = GetMenuItemCount($hMenu) Local $nPos, $nID For $nPos = 0 To $nCount[0] - 1 $nID = GetMenuItemID($hMenu, $nPos) If $nID = $nMenuItemID Then $nIndex = $nPos ExitLoop EndIf Next Return $nIndex EndFunc ;******************************************************************** ; Get the menu item text ;******************************************************************** Func _GetMenuText($nMenuItemID) Local $i, $sText = "" For $i = 1 To $arMenuItems[0][0] If $arMenuItems[$i][0] = $nMenuItemID Then $sText = $arMenuItems[$i][1] ExitLoop EndIf Next Return $sText EndFunc ;******************************************************************** ; Creates a menu side ;******************************************************************** Func _CreateSideMenu($nMenuID) If $nMenuID <= 0 Then Return 0 Local $hMenu = GUICtrlGetHandle($nMenuID) If $hMenu = 0 Then Return 0 Local $i = _GetNewSideItemIndex() If $i = 0 Then Return 0 $arSideItems[$i][0] = $hMenu $arSideItems[$i][1] = "" $arSideItems[$i][2] = -1 $arSideItems[$i][3] = -1 $arSideItems[$i][4] = -1 $arSideItems[$i][5] = FALSE $arSideItems[$i][6] = 0 $arSideItems[$i][7] = 0 $arSideItems[$i][8] = 0 $arSideItems[$i][9] = FALSE Return $i EndFunc ;******************************************************************** ; Check menu side index ;******************************************************************** Func _IsSideMenuIdx($nIdx) If $nIdx <= 0 Or $nIdx > $arSideItems[0][0] Then Return FALSE If $arSideItems[$nIdx][0] = 0 Then Return FALSE Return TRUE EndFunc ;******************************************************************** ; Delete menu side ;******************************************************************** Func _DeleteSideMenu($nIdx) If Not _IsSideMenuIdx($nIdx) Then Return FALSE $arSideItems[$nIdx][0] = 0 $arSideItems[$nIdx][1] = "" $arSideItems[$nIdx][2] = -1 $arSideItems[$nIdx][3] = -1 $arSideItems[$nIdx][4] = -1 If $arSideItems[$nIdx][5] And $arSideItems[$nIdx][6] <> 0 Then _ DeleteObject($arSideItems[$nIdx][6]) $arSideItems[$nIdx][5] = FALSE $arSideItems[$nIdx][6] = 0 $arSideItems[$nIdx][7] = 0 $arSideItems[$nIdx][8] = 0 $arSideItems[$nIdx][9] = FALSE If $nIdx = $arSideItems[0][0] Then $arSideItems[0][0] -= 1 Return TRUE EndFunc ;******************************************************************** ; Get a menu side index ;******************************************************************** Func _GetSideMenuIndex($hMenu) Local $i For $i = 1 To $arSideItems[0][0] If $arSideItems[$i][0] = $hMenu Then Return $i ExitLoop EndIf Next Return 0 EndFunc ;******************************************************************** ; Get a menu side text ;******************************************************************** Func _GetSideMenuText($nIdx) If Not _IsSideMenuIdx($nIdx) Then Return "" Return $arSideItems[$nIdx][1] EndFunc ;******************************************************************** ; Get a menu side image ;******************************************************************** Func _GetSideMenuImage($nIdx) If Not _IsSideMenuIdx($nIdx) Then Return 0 If Not $arSideItems[$nIdx][5] Then Return 0 Return $arSideItems[$nIdx][6] EndFunc ;******************************************************************** ; Get a menu side image dimensions ;******************************************************************** Func _GetSideMenuImageSize($nIdx, ByRef $nWidth, ByRef $nHeight, ByRef $bStretch) If Not _IsSideMenuIdx($nIdx) Then Return FALSE If Not $arSideItems[$nIdx][5] Then Return FALSE $nWidth = $arSideItems[$nIdx][7] $nHeight = $arSideItems[$nIdx][8] $bStretch = $arSideItems[$nIdx][9] Return TRUE EndFunc ;******************************************************************** ; Set menu side bitmap ;******************************************************************** Func _SetSideMenuImage($nIdx, $sFile, $sResName = "", $bStretch = FALSE) Return _SetSideMenuText($nIdx, $sFile, $sResName, TRUE, $bStretch) EndFunc ;******************************************************************** ; Set menu side text ;******************************************************************** Func _SetSideMenuText($nIdx, $sText, $sResName = "", $bIsBitmap = FALSE, $bStretch = FALSE) If Not _IsSideMenuIdx($nIdx) Then Return FALSE Local $hBitmap = 0 Local $nW = 0 Local $nH = 0 If $bIsBitmap Then Local $stFile = DllStructCreate("wchar[" & StringLen($sText) + 1 & "]") DllStructSetData($stFile, 1, $sText) If $sResName = "" Then $hBitmap = LoadImageW(0, DllStructGetPtr($stFile), 0, 0, 0, _ BitOr(0x0010, 0x0040, 0x2000, 0x0020)) Else Local $hLib = LoadLibraryExW(DllStructGetPtr($stFile), 0, 0x00000002) If $hLib <> 0 Then If IsNumber($sResName) Then $hBitmap = LoadImageW($hLib, $sResName, 0, 0, 0, _ BitOr(0x0040, 0x2000, 0x0020)) Else Local $stRes = DllStructCreate("wchar[" & StringLen($sResName) + 1 & "]") DllStructSetData($stRes, 1, $sResName) $hBitmap = LoadImageW($hLib, DllStructGetPtr($stRes), 0, 0, 0, _ BitOr(0x0040, 0x2000, 0x0020)) EndIf FreeLibrary($hLib) EndIf EndIf If $hBitmap = 0 Then Return FALSE Else Local $nSize = GetObjectW($hBitmap, 0, 0) Local $stBMP = DllStructCreate("long;long;long;long;ushort;ushort") If GetObjectW($hBitmap, $nSize, DllStructGetPtr($stBMP)) = 0 Then DeleteObject($hBitmap) Return FALSE Else $nW = DllStructGetData($stBMP, 2) $nH = DllStructGetData($stBMP, 3) EndIf EndIf EndIf $arSideItems[$nIdx][1] = $sText If $bIsBitmap Then If $arSideItems[$nIdx][5] <> 0 Then DeleteObject($arSideItems[$nIdx][5]) $arSideItems[$nIdx][5] = TRUE $arSideItems[$nIdx][6] = $hBitmap $arSideItems[$nIdx][7] = $nW $arSideItems[$nIdx][8] = $nH If $bStretch Then $arSideItems[$nIdx][9] = TRUE Else $arSideItems[$nIdx][9] = FALSE EndIf Else $arSideItems[$nIdx][5] = FALSE $arSideItems[$nIdx][6] = 0 EndIf Return TRUE EndFunc ;******************************************************************** ; Set menu side colors ;******************************************************************** Func _SetSideMenuColors($nIdx, $nColor = -1, $nBkColor = -1, $nBkGrdColor = -1) If Not _IsSideMenuIdx($nIdx) Then Return FALSE If $nColor <> -1 Then If $nColor = -2 Then $arSideItems[$nIdx][2] = $nMenuSideTxtClr Else $arSideItems[$nIdx][2] = $nColor EndIf EndIf If $nBkColor <> -1 Then If $nBkColor = -2 Then $arSideItems[$nIdx][3] = $nMenuSideBkClr Else $arSideItems[$nIdx][3] = $nBkColor EndIf EndIf If $nBkGrdColor <> -1 Then If $nBkGrdColor = -2 Then $arSideItems[$nIdx][4] = $nMenuSideBkClr2 Else $arSideItems[$nIdx][4] = $nBkGrdColor EndIf EndIf Return 1 EndFunc ;******************************************************************** ; Get menu side colors ;******************************************************************** Func _GetSideMenuColors($nIdx, ByRef $nColor, ByRef $nBkColor, ByRef $nBkGradColor) If $nIdx = 0 Then Return 0 $nColor = $arSideItems[$nIdx][2] $nBkColor = $arSideItems[$nIdx][3] $nBkGradColor = $arSideItems[$nIdx][4] Return 1 EndFunc ;******************************************************************** ; Get the maximum text width in a menu ;******************************************************************** Func _GetMenuMaxTextWidth($hDC, $hMenu, ByRef $nMaxWidth, ByRef $nMaxAccWidth) Local $i, $stSize, $stText, $nLen Local $nWidth = 0 Local $nAccWidth = 0 Local $arString For $i = 1 To $arMenuItems[0][0] If $arMenuItems[$i][3] = $hMenu Then $arString = StringSplit($arMenuItems[$i][1], @Tab) If Not IsArray($arString) Then ContinueLoop If $arString[0] > 1 Then $nLen = StringLen($arString[2]) $stSize = DllStructCreate("int;int") $stText = DllStructCreate("wchar[" & $nLen + 1 & "]") DllStructSetData($stText, 1, $arString[2]) GetTextExtentPoint32W($hDC, DllStructGetPtr($stText), $nLen, DllStructGetPtr($stSize)) $nAccWidth = DllStructGetData($stSize, 1) $stText = 0 $stSize = 0 If $nAccWidth > $nMaxAccWidth Then $nMaxAccWidth = $nAccWidth EndIf $nLen = StringLen($arString[1]) $stSize = DllStructCreate("int;int") $stText = DllStructCreate("wchar[" & $nLen + 1 & "]") DllStructSetData($stText, 1, $arString[1]) GetTextExtentPoint32W($hDC, DllStructGetPtr($stText), $nLen, DllStructGetPtr($stSize)) $nWidth = DllStructGetData($stSize, 1) $stText = 0 $stSize = 0 If $nWidth > $nMaxWidth Then $nMaxWidth = $nWidth EndIf Next EndFunc ;******************************************************************** ; Get the maximum side text width ;******************************************************************** Func _GetSideMenuTextWidth($hDC, $sText) If $sText = "" Then Return 0 Local $nLen = StringLen($sText) Local $stSize = DllStructCreate("int;int") Local $stText = DllStructCreate("wchar[" & $nLen + 1 & "]") DllStructSetData($stText, 1, $sText) GetTextExtentPoint32W($hDC, DllStructGetPtr($stText), $nLen, DllStructGetPtr($stSize)) Return DllStructGetData($stSize, 2) EndFunc ;******************************************************************** ; Get the index of an icon from our store ;******************************************************************** Func _GetMenuIsRadio($nMenuItemID) Local $i, $bRadio = 0 For $i = 1 To $arMenuItems[0][0] If $arMenuItems[$i][0] = $nMenuItemID Then $bRadio = $arMenuItems[$i][4] ExitLoop EndIf Next Return $bRadio EndFunc ;******************************************************************** ; Get the index of an icon from our store ;******************************************************************** Func _GetMenuIconIndex($nMenuItemID, ByRef $nIconIndex, ByRef $nSelIconIndex) Local $i For $i = 1 To $arMenuItems[0][0] If $arMenuItems[$i][0] = $nMenuItemID Then $nIconIndex = $arMenuItems[$i][2] $nSelIconIndex = $arMenuItems[$i][6] ExitLoop EndIf Next EndFunc ;******************************************************************** ; Check if the item is from a tray menu ;******************************************************************** Func _IsTrayItem($nMenuItemID) Local $i, $bTray = FALSE For $i = 1 To $arMenuItems[0][0] If $arMenuItems[$i][0] = $nMenuItemID Then $bTray = $arMenuItems[$i][5] ExitLoop EndIf Next Return $bTray EndFunc ;******************************************************************** ; Get some system menu constants ;******************************************************************** Func _GetMenuInfos(ByRef $nS, ByRef $nX) $nS = GetSystemMetrics(49) $nX = GetSystemMetrics(71) EndFunc ;******************************************************************** ; Convert a normal menu item to an ownerdrawn menu item ;******************************************************************** Func _SetOwnerDrawn($hMenu, $MenuItemID, $sText, $bOwnerDrawn = TRUE) Local $nType = 0 ; MF_STRING If StringLen($sText) = 0 Then $nType = 0x00000800 If $bOwnerDrawn Then $nType = BitOr($nType, 0x00000100) Local $stMII = DllStructCreate($sMENUITEMINFO) DllStructSetData($stMII, 1, DllStructGetSize($stMII)) DllStructSetData($stMII, 2, 0x00000010) ; MIIM_TYPE DllStructSetData($stMII, 3, $nType) Local $stTypeData = DllStructCreate("uint") DllStructSetData($stTypeData, 1, $MenuItemID) DllStructSetData($stMII, 10, DllStructGetPtr($stTypeData)) SetMenuItemInfo($hMenu, $MenuItemID, FALSE, DllStructGetPtr($stMII)) EndFunc ;******************************************************************** ; Get the default menu font ;******************************************************************** Func _CreateMenuFont(ByRef $hFont, $bBold = FALSE, $bSide = FALSE) Local $stNCM = DllStructCreate($sNONCLIENTMETRICS) DllStructSetData($stNCM, 1, DllStructGetSize($stNCM)) If SystemParametersInfo(0x0029, DllStructGetSize($stNCM), DllStructGetPtr($stNCM), 0) Then Local $stMenuLogFont = DllStructCreate($sLOGFONT) Local $i For $i = 1 To 14 DllStructSetData($stMenuLogFont, $i, DllStructGetData($stNCM, $i + 38)) Next If $bSide Then DllStructSetData($stMenuLogFont, 3, 900) DllStructSetData($stMenuLogFont, 4, 900) EndIf If $bBold Then DllStructSetData($stMenuLogFont, 5, 700) If $hFont > 0 Then DeleteObject($hFont) $hFont = CreateFontIndirect(DllStructGetPtr($stMenuLogFont)) If $hFont = 0 Then $hFont = _CreateMenuFontByName("MS Sans Serif") EndIf EndFunc Func _CreateMenuFontByName($sFontName, $nHeight = 8, $nWidth = 400) Local $stFontName = DllStructCreate("char[260]") DllStructSetData($stFontName, 1, $sFontName) Local $hDC = GetDC(0) ; Get the Desktops DC Local $nPixel = GetDeviceCaps($hDC, 90) $nHeight = 0 - MulDiv($nHeight, $nPixel, 72) ReleaseDC(0, $hDC) Local $hFont = CreateFont($nHeight, _ 0, _ 0, _ 0, _ $nWidth, _ 0, _ 0, _ 0, _ 0, _ 0, _ 0, _ 0, _ 0, _ DllStructGetPtr($stFontName)) $stFontName = 0 Return $hFont EndFunc ;******************************************************************** ; Create a blank icon for flash functionality ;******************************************************************** Func _CreateBlankIcon() If $hBlankIcon = 0 Then If @OSVersion <> "WIN_XP" And @OSVersion <> "WIN_XPe" And @OSVersion <> "WIN_2003" Then Local $stIcon = DllStructCreate("hwnd") If ExtractIconExW("shell32.dll", 50, 0, DllStructGetPtr($stIcon), 1) Then _ $hBlankIcon = DllStructGetData($stIcon, 1) Else Local $stAndMask = DllStructCreate("byte[64]") memset(DllStructGetPtr($stAndMask), 0xFF, 64) Local $stXorMask = DllStructCreate("byte[64]") memset(DllStructGetPtr($stXorMask), 0x0, 64) $hBlankIcon = CreateIcon(0, 16, 16, 1, 1, DllStructGetPtr($stAndMask), DllStructGetPtr($stXorMask)) EndIf EndIf Return $hBlankIcon EndFunc ;******************************************************************** ; CommCtrl.h - functions ;******************************************************************** Func ImageList_Create($nImageWidth, $nImageHeight, $nFlags, $nInitial, $nGrow) Local $hImageList = DllCall($hComctl32Dll, "hwnd", "ImageList_Create", _ "int", $nImageWidth, _ "int", $nImageHeight, _ "int", $nFlags, _ "int", $nInitial, _ "int", $nGrow) Return $hImageList[0] EndFunc Func ImageList_AddIcon($hIml, $hIcon) Local $nIndex = DllCall($hComctl32Dll, "int", "ImageList_AddIcon", _ "hwnd", $hIml, _ "hwnd", $hIcon) Return $nIndex[0] EndFunc Func ImageList_Destroy($hIml) Local $bResult = DllCall($hComctl32Dll, "int", "ImageList_Destroy", _ "hwnd", $hIml) Return $bResult[0] EndFunc Func ImageList_Draw($hIml, $nIndex, $hDC, $nX, $nY, $nStyle) Local $bResult = DllCall($hComctl32Dll, "int", "ImageList_Draw", _ "hwnd", $hIml, _ "int", $nIndex, _ "hwnd", $hDC, _ "int", $nX, _ "int", $nY, _ "int", $nStyle) Return $bResult[0] EndFunc Func ImageList_DrawEx($hIml, $nIndex, $hDC, $nX, $nY, $nDx, $nDy, $nBkClr, $nFgClr, $nStyle) Local $bResult = DllCall($hComctl32Dll, "int", "ImageList_DrawEx", _ "hwnd", $hIml, _ "int", $nIndex, _ "hwnd", $hDC, _ "int", $nX, _ "int", $nY, _ "int", $nDx, _ "int", $nDy, _ "int", $nBkClr, _ "int", $nFgClr, _ "int", $nStyle) Return $bResult[0] EndFunc Func ImageList_ReplaceIcon($hIml, $nIndex, $hIcon) Local $bResult = DllCall($hComctl32Dll, "int", "ImageList_ReplaceIcon", _ "hwnd", $hIml, _ "int", $nIndex, _ "hwnd", $hIcon) Return $bResult[0] EndFunc ;******************************************************************** ; ShellApi.h - functions ;******************************************************************** Func ExtractIconExW($sIconFile, $nIconID, $ptrIconLarge, $ptrIconSmall, $nIcons) Local $nCount = DllCall($hShell32Dll, "int", "ExtractIconExW", _ "wstr", $sIconFile, _ "int", $nIconID, _ "ptr", $ptrIconLarge, _ "ptr", $ptrIconSmall, _ "int", $nIcons) Return $nCount[0] EndFunc Func Shell_NotifyIcon($nMessage, $pNID) Local $nResult = DllCall($hShell32Dll, "int", "Shell_NotifyIconW", _ "int", $nMessage, _ "ptr", $pNID) Return $nResult[0] EndFunc ;******************************************************************** ; WinBase.h - functions ;******************************************************************** Func MulDiv($nInt1, $nInt2, $nInt3) Local $nResult = DllCall("kernel32.dll", "int", "MulDiv", _ "int", $nInt1, _ "int", $nInt2, _ "int", $nInt3) Return $nResult[0] EndFunc Func LoadLibraryExW($pFile, $hFile, $nFlags) Local $hResult = DllCall($hKernel32Dll, "hwnd", "LoadLibraryExW", _ "ptr", $pFile, _ "hwnd", $hFile, _ "dword", $nFlags) Return $hResult[0] EndFunc Func FreeLibrary($hLib) Local $nResult = DllCall($hKernel32Dll, "int", "FreeLibrary", _ "hwnd", $hLib) Return $nResult[0] EndFunc ;******************************************************************** ; WinGDI.h - functions ;******************************************************************** Func SelectObject($hDC, $hObj) Local $hOldObj = DllCall($hGdi32Dll, "int", "SelectObject", _ "hwnd", $hDC, _ "hwnd", $hObj) Return $hOldObj[0] EndFunc Func DeleteObject($hObj) Local $bResult = DllCall($hGdi32Dll, "int", "DeleteObject", _ "hwnd", $hObj) Return $bResult[0] EndFunc Func GetObjectW($hObj, $nSize, $pObj) Local $nResult = DllCall($hGdi32Dll, "int", "GetObjectW", _ "hwnd", $hObj, _ "int", $nSize, _ "ptr", $pObj) Return $nResult[0] EndFunc Func CreateFont($nHeight, $nWidth, $nEscape, $nOrientn, $fnWeight, $bItalic, $bUnderline, $bStrikeout, $nCharset, $nOutputPrec, $nClipPrec, $nQuality, $nPitch, $ptrFontName) Local $hFont = DllCall($hGdi32Dll, "hwnd", "CreateFont", _ "int", $nHeight, _ "int", $nWidth, _ "int", $nEscape, _ "int", $nOrientn, _ "int", $fnWeight, _ "long", $bItalic, _ "long", $bUnderline, _ "long", $bStrikeout, _ "long", $nCharset, _ "long", $nOutputPrec, _ "long", $nClipPrec, _ "long", $nQuality, _ "long", $nPitch, _ "ptr", $ptrFontName) Return $hFont[0] EndFunc Func CreateFontIndirect($pLogFont) Local $hFont = DllCall($hGdi32Dll, "hwnd", "CreateFontIndirectW", _ "ptr", $pLogFont) Return $hFont[0] EndFunc Func GetTextExtentPoint32W($hDC, $ptrText, $nTextLength, $ptrSize) Local $bResult = DllCall($hGdi32Dll, "int", "GetTextExtentPoint32W", _ "hwnd" ,$hDC, _ "ptr", $ptrText, _ "int", $nTextLength, _ "ptr", $ptrSize) Return $bResult[0] EndFunc Func SetBkColor($hDC, $nColor) Local $nOldColor = DllCall($hGdi32Dll, "int", "SetBkColor", _ "hwnd", $hDC, _ "int", $nColor) Return $nOldColor[0] EndFunc Func SetTextColor($hDC, $nColor) Local $nOldColor = DllCall($hGdi32Dll, "int", "SetTextColor", _ "hwnd", $hDC, _ "int", $nColor) Return $nOldColor[0] EndFunc Func CreateSolidBrush($nColor) Local $hBrush = DllCall($hGdi32Dll, "hwnd", "CreateSolidBrush", _ "int", $nColor) Return $hBrush[0] EndFunc Func GetDeviceCaps($hDC, $nIndex) Local $nResult = DllCall($hGdi32Dll, "int", "GetDeviceCaps", _ "hwnd", $hDC, _ "int", $nIndex) Return $nResult[0] EndFunc Func CreateCompatibleDC($hDC) Local $hCompDC = DllCall($hGdi32Dll, "hwnd", "CreateCompatibleDC", _ "hwnd", $hDC) Return $hCompDC[0] EndFunc Func DeleteDC($hDC) Local $bResult = DllCall($hGdi32Dll, "int", "DeleteDC", _ "hwnd", $hDC) Return $bResult[0] EndFunc Func CreateBitmap($nWidth, $nHeight, $nCPlanes, $nCBitsPerPixel, $ptrCData) Local $hBitmap = DllCall($hGdi32Dll, "hwnd", "CreateBitmap", _ "int", $nWidth, _ "int", $nHeight, _ "int", $nCPlanes, _ "int", $nCBitsPerPixel, _ "ptr", $ptrCData) Return $hBitmap[0] EndFunc Func BitBlt($hDCDest, $nXDest, $nYDest, $nWDest, $nHDest, $hDCSrc, $nXSrc, $nYSrc, $nOpCode) Local $bResult = DllCall($hGdi32Dll, "int", "BitBlt", _ "hwnd", $hDCDest, _ "int", $nXDest, _ "int", $nYDest, _ "int", $nWDest, _ "int", $nHDest, _ "hwnd", $hDCSrc, _ "int", $nXSrc, _ "int", $nYSrc, _ "long", $nOpCode) Return $bResult[0] EndFunc Func StretchBlt($hDCDest, $nXDest, $nYDest, $nWDest, $nHDest, $hDCSrc, $nXSrc, $nYSrc, $nWSrc, $nHSrc, $nOpCode) Local $bResult = DllCall($hGdi32Dll, "int", "StretchBlt", _ "hwnd", $hDCDest, _ "int", $nXDest, _ "int", $nYDest, _ "int", $nWDest, _ "int", $nHDest, _ "hwnd", $hDCSrc, _ "int", $nXSrc, _ "int", $nYSrc, _ "int", $nWSrc, _ "int", $nHSrc, _ "long", $nOpCode) Return $bResult[0] EndFunc Func SetBkMode($hDC, $nMode) Local $nResult = DllCall($hGdi32Dll, "int", "SetBkMode", _ "hwnd", $hDC, _ "int", $nMode) Return $nResult[0] EndFunc Func GradientFill($hDC, $pVert, $nNumVert, $pRect, $nNumRect, $nFillMode) Local $nResult = DllCall($hMsimg32Dll, "int", "GradientFill", _ "hwnd", $hDC, _ "ptr", $pVert, _ "ulong", $nNumVert, _ "ptr", $pRect, _ "ulong", $nNumRect, _ "ulong", $nFillMode) Return $nResult[0] EndFunc ;******************************************************************** ; WinUser.h - functions ;******************************************************************** Func GetDC($hWnd) Local $hDC = DllCall($hUser32Dll, "hwnd", "GetDC", _ "hwnd", $hWnd) Return $hDC[0] EndFunc Func ReleaseDC($hWnd, $hDC) Local $bResult = DllCall($hUser32Dll, "int", "ReleaseDC", _ "hwnd", $hWnd, _ "hwnd", $hDC) Return $bResult[0] EndFunc Func GetSysColor($nIndex) Local $nColor = DllCall($hUser32Dll, "int", "GetSysColor", _ "int", $nIndex) Return $nColor[0] EndFunc Func GetSysColorBrush($nIndex) Local $hBrush = DllCall($hUser32Dll, "hwnd", "GetSysColorBrush", _ "int", $nIndex) Return $hBrush[0] EndFunc Func LoadIcon($hInstance, $nIcon) Local $hIcon = DllCall($hUser32Dll, "hwnd", "LoadIcon", _ "hwnd", $hInstance, _ "int", $nIcon) Return $hIcon[0] EndFunc Func DestroyIcon($hIcon) Local $bResult = DllCall($hUser32Dll, "int", "DestroyIcon", _ "hwnd", $hIcon) Return $bResult[0] EndFunc Func CreateIcon($hInstance, $nWidth, $nHeight, $nPlanes, $nBitsPixel, $pAndBits, $pXorBits) Local $hResult = DllCall($hUser32Dll, "hwnd", "CreateIcon", _ "hwnd", $hInstance, _ "int", $nWidth, _ "int", $nHeight, _ "byte", $nPlanes, _ "byte", $nBitsPixel, _ "ptr", $pAndBits, _ "ptr", $pXorBits) Return $hResult[0] EndFunc Func GetSystemMetrics($nIndex) Local $nResult = DllCall($hUser32Dll, "int", "GetSystemMetrics", _ "int", $nIndex) Return $nResult[0] EndFunc Func DrawTextW($hDC, $ptrText, $nLenText, $ptrRect, $nFlags) Local $nHeight = DllCall($hUser32Dll, "int", "DrawTextW", _ "hwnd", $hDC, _ "ptr", $ptrText, _ "int", $nLenText, _ "ptr", $ptrRect, _ "int", $nFlags) Return $nHeight[0] EndFunc Func GetMenuItemCount($hMenu) Local $nCount = DllCall($hUser32Dll, "int", "GetMenuItemCount", _ "hwnd", $hMenu) Return $nCount[0] EndFunc Func GetMenuItemID($hMenu, $nPos) Local $nID = DllCall($hUser32Dll, "int", "GetMenuItemID", _ "hwnd", $hMenu, _ "int", $nPos) Return $nID[0] EndFunc Func GetMenuItemInfo($hMenu, $nID, $bPos, $pMII) Local $nResult = DllCall($hUser32Dll, "int", "GetMenuItemInfo", _ "hwnd", $hMenu, _ "uint", $nID, _ "int", $bPos, _ "ptr", $pMII) Return $nResult[0] EndFunc Func SetMenuItemInfo($hMenu, $nID, $bPos, $pMII) Local $nResult = DllCall($hUser32Dll, "int", "SetMenuItemInfo", _ "hwnd", $hMenu, _ "uint", $nID, _ "int", $bPos, _ "ptr", $pMII) Return $nResult[0] EndFunc Func GetMenuState($hMenu, $nID, $nFlags) Local $nState = DllCall($hUser32Dll, "int", "GetMenuState", _ "hwnd", $hMenu, _ "int", $nID, _ "int", $nFlags) Return $nState[0] EndFunc Func FillRect($hDC, $ptrRect, $hBrush) Local $bResult = DllCall($hUser32Dll, "int", "FillRect", _ "hwnd", $hDC, _ "ptr", $ptrRect, _ "hwnd", $hBrush) Return $bResult[0] EndFunc Func DrawEdge($hDC, $ptrRect, $nEdgeType, $nBorderFlag) Local $bResult = DllCall($hUser32Dll, "int", "DrawEdge", _ "hwnd", $hDC, _ "ptr", $ptrRect, _ "int", $nEdgeType, _ "int", $nBorderFlag) Return $bResult[0] EndFunc Func FrameRect($hDC, $ptrRect, $hBrush) Local $bResult = DllCall($hUser32Dll, "int", "FrameRect", _ "hwnd", $hDC, _ "ptr", $ptrRect, _ "hwnd", $hBrush) Return $bResult[0] EndFunc Func DrawFrameControl($hDC, $ptrRect, $nType, $nState) Local $bResult = DllCall($hUser32Dll, "int", "DrawFrameControl", _ "hwnd", $hDC, _ "ptr", $ptrRect, _ "int", $nType, _ "int", $nState) Return $bResult[0] EndFunc Func SystemParametersInfo($nAction, $nParam, $pParam, $nWinini) Local $nResult = DllCall($hUser32Dll, "int", "SystemParametersInfoW", _ "uint", $nAction, _ "uint", $nParam, _ "ptr", $pParam, _ "uint", $nWinini) Return $nResult[0] EndFunc Func GetCursorPos($pPoint) Local $nResult = DllCall($hUser32Dll, "int", "GetCursorPos", _ "ptr", $pPoint) Return $nResult[0] EndFunc Func SetForegroundWindow($hWnd) Local $nResult = DllCall($hUser32Dll, "int", "SetForegroundWindow", _ "hwnd", $hWnd) Return $nResult[0] EndFunc Func TrackPopupMenuEx($hMenu, $nFlags, $nX, $nY, $hWnd, $pParams) Local $nResult = DllCall($hUser32Dll, "int", "TrackPopupMenuEx", _ "hwnd", $hMenu, _ "uint", $nFlags, _ "int", $nX, _ "int", $nY, _ "hwnd", $hWnd, _ "ptr", $pParams) Return $nResult[0] EndFunc Func PostMessage($hWnd, $nMsg, $wParam, $lParam) Local $nResult = DllCall($hUser32Dll, "int", "PostMessage", _ "hwnd", $hWnd, _ "uint", $nMsg, _ "dword", $wParam, _ "dword", $lParam) Return $nResult[0] EndFunc Func ShowWindow($hWnd, $nState) DllCall($hUser32Dll, "int", "ShowWindow", _ "hwnd", $hWnd, _ "int", $nState) EndFunc Func SetTimer($hWnd, $nID, $nTimeOut, $pFunc) Local $nResult = DllCall($hUser32Dll, "uint", "SetTimer", _ "hwnd", $hWnd, _ "uint", $nID, _ "uint", $nTimeOut, _ "ptr", $pFunc) Return $nResult[0] EndFunc Func KillTimer($hWnd, $nID) Local $nResult = DllCall($hUser32Dll, "int", "KillTimer", _ "hwnd", $hWnd, _ "uint", $nID) Return $nResult[0] EndFunc Func LoadImageW($hInst, $pName, $nType, $nX, $nY, $nLoad) Local $hResult = DllCall($hUser32Dll, "hwnd", "LoadImageW", _ "hwnd", $hInst, _ "dword", $pName, _ "uint", $nType, _ "int", $nX, _ "int", $nY, _ "uint", $nLoad) Return $hResult[0] EndFunc Func memset($pDest, $nChr, $nCount) Local $pResult = DllCall("msvcrt.dll", "ptr:cdecl", "memset", _ "ptr", $pDest, _ "int", $nChr, _ "int", $nCount) Return $pResult[0] EndFunc Func MenuBarBKColor($hMenu, $nColor) Local $tInfo,$aResult Local $hBrush = DllCall('gdi32.dll', 'hwnd', 'CreateSolidBrush', 'int', $nColor) If @error Then Return ;$tInfo = DllStructCreate("int Size;int Mask;int Style;int YMax;int hBack;int ContextHelpID;ptr MenuData") $tInfo = DllStructCreate("int Size;int Mask;int Style;int YMax;handle hBack;int ContextHelpID;ptr MenuData") DllStructSetData($tInfo, "Mask", 2) DllStructSetData($tInfo, "hBack", $hBrush[0]) DllStructSetData($tInfo, "Size", DllStructGetSize($tInfo)) $aResult = DllCall("User32.dll", "int", "SetMenuInfo", "hwnd", $hMenu, "ptr", DllStructGetPtr($tInfo)) Return $aResult[0] <> 0 EndFunc ;==>_GUICtrlMenu_SetMenuBackground solves the problem. SOLVE-SMART 1 Link to comment Share on other sites More sharing options...
Recommended Posts
Create an account or sign in to comment
You need to be a member in order to leave a comment
Create an account
Sign up for a new account in our community. It's easy!
Register a new accountSign in
Already have an account? Sign in here.
Sign In Now