; Todo ; ; - Write toggle code for $OnOffWe controls ; - Make sure the _Metro_CreateInput_Wrapper is used when openning GUI, Importing, Saving, and Pasting ; - Import on Metro code cannot handle any extended params like colors and fonts ; - When importing via Metro code, the controls are not written to $GuiControl array in some cases ; - Create some way to display and change the Metro themes ; - Remove or finish SetStyleDialog ; - Insert pic should resize the control first before setting image ; - Add Redo system to Undo system, some tasks don't have Undos written ; - Menu builder for _Metro_DropDownMenu ; ; - Metro control buttons don't work but, they don't need to ; - Guides are not saved, they don't need to ; - Code import and maybe code save only preserve 1 tier of file menus, by design in order to save time LogToConsole(@CRLF & @CRLF & "> ======================================================== User Interface Builder ========================================================" & @CRLF) ;~ #NoTrayIcon Opt('TrayIconDebug', 1) #include #include #include ; _Tempfile #include #include #include ; _MouseTrap #include ; GUI Refresh #include ; Hook all window events #include #include #include ;#include ;======================================================================== ENABLE METRO ================================================================================ #Region #include "MetroGUI_UDF.au3" #include "MetroGUI_UDF_xpk.au3" #include "_GUIDisable.au3" ; For dim effects when msgbox is displayed Global $METRO_CLOSE_BUTTON = Default Global $METRO_MAXIMIZE_BUTTON = Default Global $METRO_RESTORE_BUTTON = Default Global $METRO_MINIMIZE_BUTTON = Default Global $METRO_FULLSCREEN_BUTTON = Default Global $METRO_FSRestore_BUTTON = Default Global $METRO_MENU_BUTTON = Default Global $METRO_ENABLED = False _SetTheme("DarkPurple") ;See MetroThemes.au3 for selectable themes or to add more OverrideThemeColors() LogToConsole("!>Script entry Set theme to DarkPurple") Global Const $MetroThemeNames[26] = [ _ 25, _ "LightTeal", _ "DarkTeal", _ "DarkTealV2", _ "DarkRuby", _ "DarkMidnightTeal", _ "DarkMidnightCyan", _ "DarkMidnightBlue", _ "DarkMidnight", _ "DarkBlue", _ "DarkBlueV2", _ "LightBlue", _ "LightCyan", _ "DarkCyan", _ "LightGray", _ "LightGreen", _ "DarkGreen", _ "DarkGreenV2", _ "LightRed", _ "DarkGray", _ "DarkAmber", _ "LightOrange", _ "DarkOrange", _ "LightPurple", _ "DarkPurple", _ "LightPink" ] #EndRegion ;====================================================================== THIS APP DPI SCALING =============================================================================== Local $result = RegRead("HKCU\Control Panel\Desktop\WindowMetrics", "AppliedDPI") If @error Or Not IsNumber($result) Then Global $DPI = 1 Else Global $DPI = $result / 96 EndIf LogToConsole("DPI is " & $DPI) If @DesktopWidth = 1920 And @DesktopHeight = 1080 Then Global $GuiSCALE = 1 ElseIf @DesktopWidth > 1920 Or @DesktopHeight > 1080 Then Global $GuiSCALE = 1.20 Else Global $GuiSCALE = 0.70 EndIf LogToConsole("Scaling factor is " & $GuiSCALE) Global $FileMenuHeight = RegRead("HKEY_CURRENT_USER\Control Panel\Desktop\WindowMetrics","MenuHeight") If @error Then $FileMenuHeight = 19 * $DPI Else $FileMenuHeight = Int($FileMenuHeight/-15) EndIf ;================================================================ RUN SPECIFIC FUNCTIONS FOR MULTI-THREADING ============================================================== If $cmdline[0] > 0 Then If StringInStr($cmdline[1],"/params") Then $cmdline[1] = StringTrimLeft($cmdline[1],1) Local $FuncCallFailed = 'Call failed: Function "' & $cmdline[1] & '" does not exist.' EndIf Global $WindowTitle, $Param, $hEventHook, $hEventProc, $GuiInFocus=0, $GuiWindow, $ToolBox, $ControlWindow SetGlobals() Switch $cmdline[0] Case 0 ;~ Persistent(Start('"_Main"')) Main() Case 1 Call($cmdline[1]) If @error = 0xDEAD And @extended = 0xBEEF Then MsgBox(4096, $WindowTitle, $FuncCallFailed) Case 2 Call($cmdline[1], $cmdline[2]) If @error = 0xDEAD And @extended = 0xBEEF Then MsgBox(4096, $WindowTitle, $FuncCallFailed) Case 3 Call($cmdline[1], $cmdline[2], $cmdline[3]) If @error = 0xDEAD And @extended = 0xBEEF Then MsgBox(4096, $WindowTitle, $FuncCallFailed) Case 4 Call($cmdline[1], $cmdline[2], $cmdline[3], $cmdline[4]) If @error = 0xDEAD And @extended = 0xBEEF Then MsgBox(4096, $WindowTitle, $FuncCallFailed) Case 5 Call($cmdline[1], $cmdline[2], $cmdline[3], $cmdline[4], $cmdline[5]) If @error = 0xDEAD And @extended = 0xBEEF Then MsgBox(4096, $WindowTitle, $FuncCallFailed) Case 6 Call($cmdline[1], $cmdline[2], $cmdline[3], $cmdline[4], $cmdline[5], $cmdline[6]) If @error = 0xDEAD And @extended = 0xBEEF Then MsgBox(4096, $WindowTitle, $FuncCallFailed) Case 7 Call($cmdline[1], $cmdline[2], $cmdline[3], $cmdline[4], $cmdline[5], $cmdline[6], $cmdline[7]) If @error = 0xDEAD And @extended = 0xBEEF Then MsgBox(4096, $WindowTitle, $FuncCallFailed) Case Else MsgBox(4096 + 64, "AutoItScript", "Too Many Args. Max is 6.") EndSwitch Exit ; ============================================================== Globals ============================================================== Func SetGlobals() OnAutoItExitRegister("NormalScriptExitCleanup") Opt("MouseCoordMode",2) ; MouseMove in Client Area Opt("GUICloseOnESC",0) Opt("GUIResizeMode",802) Opt("WinTitleMatchMode", 2) ; 1=start, 2=subStr, 3=exact, 4=advanced, -1 to -4=Nocase Opt("TrayAutoPause",0) ; Don't pause the script upon traymenu click ;Opt("TrayMenuMode",3) ; Don't automatically check traymenu items StylesListGlobals() $WindowTitle = "User Interface Builder" ; For CheckDoubleClick() Global $g_iLastClickTime = 0 Global $g_iLastControlID = -1 Global $MetroDelayHoldButton = 250 Global $IgnoreMouseDown = False Global $LastCanvasSize[2] EndFunc Func NormalScriptExitCleanup() $Param = 0 _WinAPI_UnhookWinEvent($hEventHook) DllCallbackFree($hEventProc) EndFunc ; ============================================================== Main ============================================================== Global $ToggleControl ; Prevent warnings ; This reduces the number of Global Controls and code to toggle menu checkmarks Func ToggleControl($nMsg) GUICtrlSendToDummy($ToggleControl,$nMsg) EndFunc Func Main() Settings("Startup") ; No settings are saved yet Global $FileDropArea ; Label on Canvas ; ============================================================== TOOL BOX ============================================================== Global Const $ToolBoxLength = 510;197 ;450 ;510 ;450 Global $ToolBox = GUICreate("ToolBox",168,$ToolBoxLength,-1,-1,BitOR($WS_SYSMENU,$WS_CAPTION),$WS_EX_TOOLWINDOW, WinGetHandle(AutoItWinGetTitle())) ; Global so others can set the recent menu Global $MenuFile = GUICtrlCreateMenu("&File");,$Menu) Global $Menu = GUICtrlCreateMenu("&Menu") Global $MenuEdit = GUICtrlCreateMenu("&Edit",$Menu) Global $MenuView = GUICtrlCreateMenu("&View",$Menu) Global $MenuDeveloper = GUICtrlCreateMenu("&Developer",$Menu) Global $MenuOptions = GUICtrlCreateMenu("&Options") Global $MenuItemNewMetroWindow = GUICtrlCreateMenuItem("New &Metro Window", $MenuFile) Global $MenuItemNewToolWindow = GUICtrlCreateMenuItem("New &Tool Window", $MenuFile) Global $MenuItemNewWindow = GUICtrlCreateMenuItem("&New Window", $MenuFile) Global $MenuItemSeperator = GUICtrlCreateMenuItem("", $MenuFile) Global $MenuItemOpen = GUICtrlCreateMenuItem("&Open", $MenuFile) Global $MenuRecent = GUICtrlCreateMenu("&Recent",$MenuFile) Global $MenuItemSeperator = GUICtrlCreateMenuItem("", $MenuFile) Global $MenuItemSave = GUICtrlCreateMenuItem("&Save", $MenuFile) Global $MenuItemSaveAs = GUICtrlCreateMenuItem("Save &As", $MenuFile) Global $MenuItemSeperator = GUICtrlCreateMenuItem("", $MenuFile) Global $MenuItemInsertPicture = GUICtrlCreateMenuItem("I&nsert Picture", $MenuFile) Global $MenuItemSeperator = GUICtrlCreateMenuItem("", $MenuFile) Global $MenuItemImportCode = GUICtrlCreateMenuItem("&Import Code", $MenuFile) Global $MenuItemExportHTML = GUICtrlCreateMenuItem("&Export HTML", $MenuFile) Global $MenuItemGenerateCode = GUICtrlCreateMenuItem("&Generate Code", $MenuFile) Global $MenuItemSeperator = GUICtrlCreateMenuItem("", $MenuFile) Global $MenuItemCopyControlsToFile = GUICtrlCreateMenuItem("&Copy Controls to File", $MenuFile) Global $MenuItemPasteFromFile = GUICtrlCreateMenuItem("&Paste From File", $MenuFile) Global $MenuItemControlorWindowColor = GUICtrlCreateMenuItem("Control or Window &Color", $MenuEdit) Global $MenuItemControlTextColor = GUICtrlCreateMenuItem("Control Text C&olor", $MenuEdit) Global $MenuItemSeperator = GUICtrlCreateMenuItem("", $MenuEdit) Global $MenuItemControlTextorWindowTitle = GUICtrlCreateMenuItem("Control &Text or Window Title", $MenuEdit) Global $MenuItemControlFont = GUICtrlCreateMenuItem("Control &Font", $MenuEdit) Global $MenuItemSeperator = GUICtrlCreateMenuItem("", $MenuEdit) Global $MenuItemSetStyle = GUICtrlCreateMenuItem("&Set Style", $MenuEdit) Global $MenuItemClearAllGuides = GUICtrlCreateMenuItem("C&lear All Guides", $MenuView) Global $MenuItemShowMemory = GUICtrlCreateMenuItem("Show All", $MenuDeveloper) Global $MenuItemSeperator = GUICtrlCreateMenuItem("", $MenuDeveloper) Global $MenuItemShowControls = GUICtrlCreateMenuItem("Controls", $MenuDeveloper) Global $MenuItemShowGuides = GUICtrlCreateMenuItem("Guides", $MenuDeveloper) Global $MenuItemShowUndos = GUICtrlCreateMenuItem("Undo", $MenuDeveloper) Global $MenuItemShowWindows = GUICtrlCreateMenuItem("Windows", $MenuDeveloper) Global $MenuItemToggleGuidesonControlDrag = GUICtrlCreateMenuItem("&Guides on Control Drag", $MenuOptions) GUICtrlSetState(-1,$GUI_CHECKED) Global $MenuItemToggleControlResizingMode = GUICtrlCreateMenuItem("Don't &Resize Controls with GUI", $MenuOptions) GUICtrlSetState(-1,$GUI_CHECKED) Global $MenuItemToggleGrabGuidesFromBorder = GUICtrlCreateMenuItem("Grab Guides From &Border", $MenuOptions) GUICtrlSetState(-1,$GUI_CHECKED) GUICtrlCreateMenuItem("", $MenuOptions) Global $MenuItemToggleInclude = GUICtrlCreateMenuItem("&Include, Generate code for", $MenuOptions) GUICtrlSetState(-1,$GUI_CHECKED) Global $MenuItemToggleMessageLoop = GUICtrlCreateMenuItem("&Message Loop, Generate code for", $MenuOptions) GUICtrlSetState(-1,$GUI_CHECKED) Global $MenuItemRecent1 = GUICtrlCreateMenuItem(" ", $MenuRecent) Global $MenuItemRecent2 = GUICtrlCreateMenuItem(" ", $MenuRecent) Global $MenuItemRecent3 = GUICtrlCreateMenuItem(" ", $MenuRecent) Global $MenuItemRecent4 = GUICtrlCreateMenuItem(" ", $MenuRecent) Global $MenuItemRecent5 = GUICtrlCreateMenuItem(" ", $MenuRecent) Global $MenuItemRecent6 = GUICtrlCreateMenuItem(" ", $MenuRecent) Global $MenuItemRecent7 = GUICtrlCreateMenuItem(" ", $MenuRecent) Global $MenuItemRecent8 = GUICtrlCreateMenuItem(" ", $MenuRecent) Global $MenuItemRecent9 = GUICtrlCreateMenuItem(" ", $MenuRecent) ; ============================================================== TOOL BOX BUTTONS ============================================================== Global $bNew = GUICtrlCreateButton(" New",4,4,77,25) Local $bButton = GUICtrlCreateButton(" Button",85,4,77,25) Local $bLabel = GUICtrlCreateButton("ℒ Label",85,32,77,25) Local $bEdit = GUICtrlCreateButton(" EditBox",4,32,77,25) Local $bInputBox = GUICtrlCreateButton(" InputBox",4,60,77,25) Local $bComboBox = GUICtrlCreateButton(" ComboBox",85,60,77,25) Local $bListView = GUICtrlCreateButton("▥ ListView",4,116,77,25) Local $bMenu = GUICtrlCreateButton(" Menu",4,88,77,25) Local $bMenuItem = GUICtrlCreateButton(" Menu Item",85,88,77,25) Local $bListBox = GUICtrlCreateButton("▤ ListBox",85,116,77,25) Local $bRadio = GUICtrlCreateButton(" Radio",4,145,77,25) Local $bCheckBox = GUICtrlCreateButton("☑ CheckBox",85,145,77,25) Local $bPic = GUICtrlCreateButton("⛄Picture",4,173,77,25) Local $bMetroButton = _Metro_CreateButtonEx2(" Button ►",85,173,77,25, $ButtonBKColor, $ButtonTextColor, "Arial", 8, 0) Local $bMetroCheckboxEx = _Metro_CreateButtonEx2("CheckboxEx",4,201,77,25, $ButtonBKColor, $ButtonTextColor, "Arial", 8, 0) Local $bMetroCheckboxEx2 = _Metro_CreateButtonEx2("CheckboxEx2",85,201,77,25, $ButtonBKColor, $ButtonTextColor, "Arial", 8, 0) Local $bMetroToggle = _Metro_CreateButtonEx2("Toggle",4,229,77,25, $ButtonBKColor, $ButtonTextColor, "Arial", 8, 0) Local $bMetroToggleEx = _Metro_CreateButtonEx2("ToggleEx",85,229,77,25, $ButtonBKColor, $ButtonTextColor, "Arial", 8, 0) Local $bMetroRadio = _Metro_CreateButtonEx2("Radio",4,257,77,25, $ButtonBKColor, $ButtonTextColor, "Arial", 8, 0) Local $bMetroRadioEx = _Metro_CreateButtonEx2("RadioEx",85,257,77,25, $ButtonBKColor, $ButtonTextColor, "Arial", 8, 0) Local $bMetroProgress = _Metro_CreateButtonEx2("Progress",4,285,77,25, $ButtonBKColor, $ButtonTextColor, "Arial", 8, 0) Local $bMetroCheckbox = _Metro_CreateButtonEx2("Checkbox",85,285,77,25, $ButtonBKColor, $ButtonTextColor, "Arial", 8, 0) Local $BackupTheme = $GUI_Theme_Name _SetTheme("LightCyan") ;Color overrides for Normal window OverrideThemeColors() LogToConsole("!>Draw Metro Toolbox Buttons Set theme to LightCyan") Local $bMetroButtonMultipartMenu = _Metro_CreateButtonEx2(" Multipart ►",4,314,77,25, $ButtonBKColor, $ButtonTextColor, "Arial", 8, 0) Local $bMetroWindows11OnOff = _Metro_CreateButtonEx2("On Off",85,314,77,25, $ButtonBKColor, $ButtonTextColor, "Arial", 8, 0) Local $bMetroButtonRainbowMenu = _Metro_CreateButtonEx2("MultipartEx ►",4,342,77,25, $ButtonBKColor, $ButtonTextColor, "Arial", 8, 0) Local $bMetroUnderlinedGroup = _Metro_CreateButtonEx2("Group",85,342,77,25, $ButtonBKColor, $ButtonTextColor, "Arial", 8, 0) Local $bMetroButtonWindows11 = _Metro_CreateButtonEx2("Wnd11 Btn",4,370,77,25, $ButtonBKColor, $ButtonTextColor, "Arial", 8, 0) Local $bMetroButtonStealthIconRound = _Metro_CreateButtonEx2("Sth Ico Rnd",85,370,77,25, $ButtonBKColor, $ButtonTextColor, "Arial", 8, 0) Local $bMetroButtonRound = _Metro_CreateButtonEx2("Round Btn",85,398,77,25, $ButtonBKColor, $ButtonTextColor, "Arial", 8, 0) Local $bMetroInputbox = _Metro_CreateButtonEx2("Inputbox",4,398,77,25, $ButtonBKColor, $ButtonTextColor, "Arial", 8, 0) Local $bMetroButtonStealth = _Metro_CreateButtonEx2("Stealth Btn",4,426,77,25, $ButtonBKColor, $ButtonTextColor, "Arial", 8, 0) Local $bMetroButtonMenuStripMenu = _Metro_CreateButtonEx2("MenuStrip ►",84,426,77,25, $ButtonBKColor, $ButtonTextColor, "Arial", 8, 0) Local $bMetroButtonAddHSeperator = _Metro_CreateButtonEx2("HSeperator",4,454,77,25, $ButtonBKColor, $ButtonTextColor, "Arial", 8, 0) Local $bMetroButtonAddVSeperator = _Metro_CreateButtonEx2("VSeperator",84,454,77,25, $ButtonBKColor, $ButtonTextColor, "Arial", 8, 0) _SetTheme($BackupTheme) ;See MetroThemes.au3 for selectable themes or to add more OverrideThemeColors() LogToConsole("!>Draw XPK Toolbox Buttons Set theme to " & $GUI_Theme_Name) GUISetState(@SW_SHOW) ; ============================================================== CONTROL WINDOW ============================================================== Global $ControlWindow = GUICreate("Control Window", 644, 36, 324, 124,BitOR($WS_SYSMENU,$WS_CAPTION),$WS_EX_TOOLWINDOW, WinGetHandle(AutoItWinGetTitle())) Global $LabelControlCount = GUICtrlCreateLabel("0",6,11,22,16,-1,-1) Global $ControlWindowInputBox = GUICtrlCreateInput("[Control Name]",28,9,479,20) Local $bSetControlColor = GUICtrlCreateButton("C", 510, 8, 20, 22) GUICtrlSetTip(-1,"Set control or window background color.") GUICtrlSetFont(-1, 8, 400, 0, "Palatino Linotype") Local $bSetControlText = GUICtrlCreateButton("T", 532, 8, 20, 22) GUICtrlSetTip(-1,"Set control or window text.") GUICtrlSetFont(-1, 8, 400, 0, "Palatino Linotype") Local $bBigger = GUICtrlCreateButton("+", 554, 8, 20, 22) Local $bSmaller = GUICtrlCreateButton("-", 576, 8, 20, 22) Local $bPlay = GUICtrlCreateButton("", 598, 8, 20, 22,$BS_ICON) GUICtrlSetImage(-1,"C:\windows\SysWOW64\shell32.dll","246",0) Local $bImport = GUICtrlCreateButton("", 620, 8, 20, 22,$BS_ICON) GUICtrlSetImage(-1,"C:\windows\SysWOW64\shell32.dll","255",0) GUISetState(@SW_SHOW) ;============================================================== GLOBALS ==================================================================================================== PopulateRecentsMenu($MenuFile) Global Const $MaxWindows = 1 Global $GuiWindow[$MaxWindows][21], $WindowCount = 0, $GuiInFocus = 0 For $i=0 to $MaxWindows-1 $GuiWindow[$i][4] = Default $GuiWindow[$i][4] = Default Next Global Const $MaxControls = 256, $MaxControlParameters = 7 ; DeleteAllControls() uses $MaxControlParameters Global $GuiControl[$MaxControls][$MaxControlParameters], $ControlCount = 0 For $i=0 to $MaxControls-1 $GuiControl[$i][0] = Default Next Global Const $MaxUndos = 256 Global $GuiUndo[$MaxUndos] Global Const $MaxGuides = 256 Global $GuiGuide[$MaxGuides], $GuideCount = 0 For $i=0 to $MaxGuides-1 $GuiGuide[$i] = Default Next Global Const $MaxMenus = 24,$MaxMenuParameters = 12 ; DeleteFileMenu() uses $MaxMenuParameters Global $GuiMenu[$MaxMenus][12], $MenuCount = 0 Global Const $MaxMenuItems = 96,$MaxMenuItemParameters = 12 ; DeleteFileMenu() uses $MaxMenuItemParameters Global $GuiMenuItem[$MaxMenuItems][$MaxMenuItemParameters], $MenuItemCount = 0 Global $SaveFile = "" Global $AutoSaveFile = _TempFile(@DesktopDir,"~",".gui") Global $GuiHasChanges = False Global $HasNoChangeIndicator = True Global $GuidesAreDisabled = False Global $BorderGuidesAreDisabled = False Global $ControlDockingIsDisabled = True Global $Selected = "" Global $MainMenu = 0 Global $DrawingShape = False Global Enum $HorizontalGuideMove, $VerticalGuideMove, $ControlMove Global $DoubleClickTimer = TimerInit() ;================================================================= MENUS ==================================================================================================== Global $MenuButton[] Local $Temp[] = ["Left rainbow button", "Center rainbow button", "Right rainbow button"] $MenuButton.RainbowMulti = $Temp Local $Temp[] = ["Left button", "Center button", "Right button"] $MenuButton.Multi = $Temp ;========================================================= SHORTCUT KEYS ==================================================================================================== Global $Cut = GUICtrlCreateDummy() Global $Copy = GUICtrlCreateDummy() Global $Paste = GUICtrlCreateDummy() Global $Undo = GUICtrlCreateDummy() Global $Debug = GUICtrlCreateDummy() Global $Refresh = GUICtrlCreateDummy() Global $SelectAll = GUICtrlCreateDummy() Global $KeyUp = GUICtrlCreateDummy() Global $KeyDown = GUICtrlCreateDummy() Global $KeyLeft = GUICtrlCreateDummy() Global $KeyRight = GUICtrlCreateDummy() Global $bAccelUp = GUICtrlCreateDummy() Global $bAccelDown = GUICtrlCreateDummy() Global $bAccelLeft = GUICtrlCreateDummy() Global $bAccelRight = GUICtrlCreateDummy() Global $ToogleGuides = GUICtrlCreateDummy() Global $DeleteControl = GUICtrlCreateDummy() Global $RemoveDeletedControls = GUICtrlCreateDummy() Global $ToogleControlResizing = GUICtrlCreateDummy() Global $DeselectControl = GUICtrlCreateDummy() Global $bSizeUp = GUICtrlCreateDummy() Global $bSizeDown = GUICtrlCreateDummy() Global $bSizeLeft = GUICtrlCreateDummy() Global $bSizeRight = GUICtrlCreateDummy() Global $CalculateDistanceApart = GUICtrlCreateDummy() Global $ToggleControl = GUICtrlCreateDummy() Global $SetFont = GUICtrlCreateDummy() Global $SaveGui = GUICtrlCreateDummy() Global $OpenGui = GUICtrlCreateDummy() Global $WakeToolbar = GUICtrlCreateDummy() Global $GuiDoubleClicked = GUICtrlCreateDummy() Local $LastPosM = "0,0", $CurrPosM = "", $Timer = TimerInit(), $AutoSaveTimer = TimerInit() ; Shortcut keys for the Canvas, assigned in NewWindow, and Toolbar (All Control below need to be Global) Global $Accel[][] = [["{SPACE}", $WakeToolbar], ["+{up}", $bAccelUp], ["+{down}", $bAccelDown], ["+{left}", $bAccelLeft], _ ["+{right}", $bAccelRight],["^z", $Undo],["^g", $ToogleGuides], _ ["{up}", $KeyUp], ["{down}", $KeyDown], ["{left}", $KeyLeft], _ ["{right}", $KeyRight], ["^a", $SelectAll], ["{DEL}", $DeleteControl], ["^{DEL}", _ $RemoveDeletedControls], ["{ESC}", $DeselectControl], ["^r", $ToogleControlResizing], _ ["^x", $Cut], ["^c", $Copy], ["^v", $Paste], ["^+d", $Debug], ["^n", $bNew], _ ["^s", $SaveGui], ["^o", $OpenGui], ["^w", $GUI_EVENT_CLOSE], _ ["^+{up}", $bSizeUp], ["^+{down}", $bSizeDown], ["^+{left}", $bSizeLeft], ["^+c", $CalculateDistanceApart], _ ["^+{right}", $bSizeRight], ["^f", $SetFont], ["{F5}", $Refresh]] ; Shortcut keys for the application Global $Accel2[][] = [["^g", $ToogleGuides], _ ["^{DEL}",$RemoveDeletedControls], _ ["{ESC}", $DeselectControl], ["^r", $ToogleControlResizing], _ ["^+d", $Debug], ["^n", $bNew], _ ["^s", $SaveGui], ["^o", $OpenGui], ["^w", $GUI_EVENT_CLOSE], _ ["^f", $SetFont],["{F5}", $Refresh]] GUISwitch($ToolBox) GUISetAccelerators($Accel2) GUISwitch($ControlWindow) GUISetAccelerators($Accel2) NewWindow() ; Listen to ALL window messages to detect if app has focus Global $hEventProc = DllCallbackRegister(_EventProc, "none", "ptr;dword;hwnd;long;long;dword;dword") Global $hEventHook = _WinAPI_SetWinEventHook(3, 11, DllCallbackGetPtr($hEventProc)) Local $FromCommandLine = DllStructGetData($Param,"FileName") If $FromCommandLine Then OpenUserInterfaceFile($FromCommandLine) EndIf Global $StylesList = "$WS_BORDER|$WS_POPUP|$WS_CAPTION|$WS_CLIPCHILDREN|$WS_CLIPSIBLINGS|$WS_DISABLED|$WS_DLGFRAME|$WS_HSCROLL|$WS_MAXIMIZE|$WS_MAXIMIZEBOX|$WS_MINIMIZE|$WS_MINIMIZEBOX|$WS_OVERLAPPED|$WS_OVERLAPPEDWINDOW|$WS_POPUPWINDOW|$WS_SIZEBOX|$WS_SYSMENU|$WS_THICKFRAME|$WS_VSCROLL|$WS_VISIBLE|$WS_CHILD|$WS_GROUP|$WS_TABSTOP|$DS_MODALFRAME|$DS_SETFOREGROUND|$DS_CONTEXTHELP|$WS_EX_ACCEPTFILES|$WS_EX_APPWINDOW|$WS_EX_COMPOSITED|$WS_EX_CLIENTEDGE|$WS_EX_CONTEXTHELP|$WS_EX_DLGMODALFRAME|$WS_EX_LAYOUTRTL|$WS_EX_MDICHILD|$WS_EX_OVERLAPPEDWINDOW|$WS_EX_STATICEDGE|$WS_EX_TOPMOST|$WS_EX_TRANSPARENT|$WS_EX_TOOLWINDOW|$WS_EX_WINDOWEDGE|$WS_EX_LAYERED|$GUI_WS_EX_PARENTDRAG|$BS_3STATE|$BS_AUTO3STATE|$BS_AUTOCHECKBOX|$BS_CHECKBOX|$BS_LEFT|$BS_PUSHLIKE|$BS_RIGHT|$BS_RIGHTBUTTON|$BS_GROUPBOX|$BS_AUTORADIOBUTTON|$BS_BOTTOM|$BS_CENTER|$BS_DEFPUSHBUTTON|$BS_MULTILINE|$BS_TOP|$BS_VCENTER|$BS_ICON|$BS_BITMAP|$BS_FLAT|$BS_NOTIFY|$CBS_AUTOHSCROLL|$CBS_DISABLENOSCROLL|$CBS_DROPDOWN|$CBS_DROPDOWNLIST|$CBS_LOWERCASE|$CBS_NOINTEGRALHEIGHT|$CBS_OEMCONVERT|$CBS_SIMPLE|$CBS_SORT|$CBS_UPPERCASE|$LBS_DISABLENOSCROLL|$LBS_NOINTEGRALHEIGHT|$LBS_NOSEL|$LBS_NOTIFY|$LBS_SORT|$LBS_STANDARD|$LBS_USETABSTOPS|$ES_AUTOHSCROLL|$ES_AUTOVSCROLL|$ES_CENTER|$ES_LOWERCASE|$ES_NOHIDESEL|$ES_NUMBER|$ES_OEMCONVERT|$ES_MULTILINE|$ES_PASSWORD|$ES_READONLY|$ES_RIGHT|$ES_UPPERCASE|$ES_WANTRETURN|$PBS_MARQUEE|$PBS_SMOOTH|$PBS_SMOOTHREVERSE|$PBS_VERTICAL|$UDS_ALIGNLEFT|$UDS_ALIGNRIGHT|$UDS_ARROWKEYS|$UDS_HORZ|$UDS_NOTHOUSANDS|$UDS_WRAP|$SS_BLACKFRAME|$SS_BLACKRECT|$SS_CENTER|$SS_CENTERIMAGE|$SS_ETCHEDFRAME|$SS_ETCHEDHORZ|$SS_ETCHEDVERT|$SS_GRAYFRAME|$SS_GRAYRECT|$SS_LEFT|$SS_LEFTNOWORDWRAP|$SS_NOPREFIX|$SS_NOTIFY|$SS_RIGHT|$SS_RIGHTJUST|$SS_SIMPLE|$SS_SUNKEN|$SS_WHITEFRAME|$SS_WHITERECT|$TCS_SCROLLOPPOSITE|$TCS_BOTTOM|$TCS_RIGHT|$TCS_MULTISELECT|$TCS_FLATBUTTONS|$TCS_FORCEICONLEFT|$TCS_FORCELABELLEFT|$TCS_HOTTRACK|$TCS_VERTICAL|$TCS_TABS|$TCS_BUTTONS|$TCS_SINGLELINE|$TCS_MULTILINE|$TCS_RIGHTJUSTIFY|$TCS_FIXEDWIDTH|$TCS_RAGGEDRIGHT|$TCS_FOCUSONBUTTONDOWN|$TCS_OWNERDRAWFIXED|$TCS_TOOLTIPS|$TCS_FOCUSNEVER|$DTS_UPDOWN|$DTS_SHOWNONE|$DTS_LONGDATEFORMAT|$DTS_TIMEFORMAT|$DTS_RIGHTALIGN|$DTS_SHORTDATEFORMAT|$MCS_NOTODAY|$MCS_NOTODAYCIRCLE|$MCS_WEEKNUMBERS|$TVS_HASBUTTONS|$TVS_HASLINES|$TVS_LINESATROOT|$TVS_DISABLEDRAGDROP|$TVS_SHOWSELALWAYS|$TVS_RTLREADING|$TVS_NOTOOLTIPS|$TVS_CHECKBOXES|$TVS_TRACKSELECT|$TVS_SINGLEEXPAND|$TVS_FULLROWSELECT|$TVS_NOSCROLL|$TVS_NONEVENHEIGHT|$TBS_AUTOTICKS|$TBS_BOTH|$TBS_BOTTOM|$TBS_HORZ|$TBS_VERT|$TBS_NOTHUMB|$TBS_NOTICKS|$TBS_LEFT|$TBS_RIGHT|$TBS_TOP|$LVS_ICON|$LVS_REPORT|$LVS_SMALLICON|$LVS_LIST|$LVS_EDITLABELS|$LVS_NOCOLUMNHEADER|$LVS_NOSORTHEADER|$LVS_SINGLESEL|$LVS_SHOWSELALWAYS|$LVS_SORTASCENDING|$LVS_SORTDESCENDING|$LVS_NOLABELWRAP|$LVS_EX_FULLROWSELECT|$LVS_EX_GRIDLINES|$LVS_EX_HEADERDRAGDROP|$LVS_EX_TRACKSELECT|$LVS_EX_CHECKBOXES|$LVS_EX_BORDERSELECT|$LVS_EX_DOUBLEBUFFER|$LVS_EX_FLATSB|$LVS_EX_MULTIWORKAREAS|$LVS_EX_SNAPTOGRID|$LVS_EX_SUBITEMIMAGES|$LVS_EX_INFOTIP" $StylesList = StringSplit($StylesList,"|") ; DrawGDIPlusCallout(GetCanvas(),100,100, "ne", 20, 50, "This is a test string") ;============================================================== MAIN LOOP ================================================================================================ ;=========================================================================================================================================================================== While 1 $hGui = WinActive("[ACTIVE]") If $hGui <> GetCanvas() Then ToolTip("") If TimerDiff($Timer) > 2000 Then If $GuiHasChanges And $HasNoChangeIndicator Then If $SaveFile <> "" Then WinSetTitle($ControlWindow,"",$SaveFile & "* - Control Window") $HasNoChangeIndicator = False ;w("!> Setting * indicator") EndIf EndIf $Timer = TimerInit() EndIf If TimerDiff($AutoSaveTimer) > 3000 Then If $GuiHasChanges Then GUISave("AutoSave") EndIf $AutoSaveTimer = TimerInit() EndIf $nMsg = GUIGetMsg() Switch $nMsg Case $GuiDoubleClicked LogToConsole("! gui duble click") Case $GUI_EVENT_RESIZED ConsoleWrite("+> Write Undo" & @CRLF) _ArrayPush($GuiUndo,"_WinAPI_SetWindowPos(" & GetCanvas() & ",0,0,0," & $LastCanvasSize[0] & "," & $LastCanvasSize[1] & "," & BitOR($SWP_FRAMECHANGED, $SWP_NOMOVE, $SWP_NOZORDER) & ")",1) Local $Pos = WinGetPos(GetCanvas()) $LastCanvasSize[0]=$Pos[2] $LastCanvasSize[1]=$Pos[3] $GuiHasChanges=True Case $WakeToolbar RefreshSelectionRectangle() Case $GuiWindow[$GuiInFocus][14] ; Align Left IgnoreMouseDownCanceled("Align Left Called") WinActivate(GetCanvas()) $hGUI = WinActive("[ACTIVE]") If $hGUI = $ControlWindow Or $hGUI = $ToolBox Then ContinueLoop $Control = StringSplit($Selected,"|") $Leader = ControlGetPos($hGUI, "", int($Control[1])) For $i=2 to $Control[0]-1 GUICtrlSetPos(int($Control[$i]), $Leader[0]) Next RefreshSelectionRectangle() If $Selected <> "" Then $GuiHasChanges = True Case $GuiWindow[$GuiInFocus][15] ; Center Align IgnoreMouseDownCanceled("Align Center Called") WinActivate(GetCanvas()) $hGUI = WinActive("[ACTIVE]") If $hGUI = $ControlWindow Or $hGUI = $ToolBox Then ContinueLoop $Control = StringSplit($Selected, "|") $Leader = ControlGetPos($hGUI, "", int($Control[1])) For $i = 2 To $Control[0] - 1 $cPos = ControlGetPos($hGUI, "", int($Control[$i])) ; Calculate the center position for each control relative to the leader $newX = $Leader[0] + ($Leader[2] / 2) - ($cPos[2] / 2) GUICtrlSetPos(int($Control[$i]), $newX, $cPos[1]) Next RefreshSelectionRectangle() If $Selected <> "" Then $GuiHasChanges = True Case $GuiWindow[$GuiInFocus][16] ; Align Right IgnoreMouseDownCanceled("Align Right Called") WinActivate(GetCanvas()) $hGUI = WinActive("[ACTIVE]") If $hGUI = $ControlWindow Or $hGUI = $ToolBox Then ContinueLoop $Control = StringSplit($Selected,"|") $Leader = ControlGetPos($hGUI, "", int($Control[1])) For $i=2 to $Control[0]-1 $cPos = ControlGetPos($hGUI,"",int($Control[$i])) GUICtrlSetPos(int($Control[$i]), $Leader[0] + $Leader[2] - $cPos[2]) Next RefreshSelectionRectangle() If $Selected <> "" Then $GuiHasChanges = True Case $GuiWindow[$GuiInFocus][17] ; Align Horizontally IgnoreMouseDownCanceled("Align Horizontally Called") WinActivate(GetCanvas()) $hGUI = WinActive("[ACTIVE]") If $hGUI = $ControlWindow Or $hGUI = $ToolBox Then ContinueLoop $Control = StringSplit($Selected,"|") $LastLeader = ControlGetPos($hGUI, "", int($Control[1])) $Leader_Y = $LastLeader[1] For $i=2 to $Control[0]-1 $cPos = ControlGetPos($hGUI,"",int($Control[$i])) GUICtrlSetPos(int($Control[$i]), $LastLeader[0] + $LastLeader[2] + 4, $Leader_Y) $cPos[0] = $LastLeader[0] + $LastLeader[2] + 4 $LastLeader = $cPos Next RefreshSelectionRectangle() If $Selected <> "" Then $GuiHasChanges = True Case $GuiWindow[$GuiInFocus][18] ; Align Vertically IgnoreMouseDownCanceled("Align Vertically Called") WinActivate(GetCanvas()) $hGUI = WinActive("[ACTIVE]") If $hGUI = $ControlWindow Or $hGUI = $ToolBox Then ContinueLoop $Control = StringSplit($Selected, "|") $LastLeader = ControlGetPos($hGUI, "", Int($Control[1])) $Leader_X = $LastLeader[0] ; Keep the X position constant For $i = 2 To $Control[0] - 1 $cPos = ControlGetPos($hGUI, "", Int($Control[$i])) GUICtrlSetPos(Int($Control[$i]), $Leader_X, $LastLeader[1] + $LastLeader[3] + 4) $cPos[1] = $LastLeader[1] + $LastLeader[3] + 4 ; Update the Y position for the next control $LastLeader = $cPos Next RefreshSelectionRectangle() If $Selected <> "" Then $GuiHasChanges = True Case $GuiWindow[$GuiInFocus][19] ; Nothing yet Case $GuiWindow[$GuiInFocus][20] IgnoreMouseDownCanceled("Exit Toolbar Called") RefreshSelectionRectangle(False,False) If $Selected <> "" Then $GuiHasChanges = True Case $CalculateDistanceApart $hGUI = WinActive("[ACTIVE]") If $hGUI = $ControlWindow Or $hGUI = $ToolBox Then ContinueLoop IgnoreMouseDownCanceled("$CalculateDistanceApart Dummy Control Called") $Control = StringSplit($Selected,"|") If $Control[0]-1 <> 2 Then MsgBox(4096+48,$WindowTitle,"Please select two controls for calculation.") ContinueLoop EndIf $c1 = ControlGetPos($hGUI, "", int($Control[1])) $c2 = ControlGetPos($hGUI, "", int($Control[2])) $result = GetClosestDistance($c1[0],$c1[1],$c1[2],$c1[3],$c2[0],$c2[1],$c2[2],$c2[3]) MsgBox(4096+64,$WindowTitle,'The two controls are ' & $result & ' pixels apart.') Case $ToggleControl $nMsg = GUICtrlRead($ToggleControl) Local $CurrentState = BitAND(GUICtrlRead($nMsg),$GUI_CHECKED) If $CurrentState = $GUI_CHECKED Then GUICtrlSetState($nMsg,$GUI_UNCHECKED) Else GUICtrlSetState($nMsg,$GUI_CHECKED) EndIf Case $MenuItemToggleGrabGuidesFromBorder ToggleControl($nMsg) $BorderGuidesAreDisabled = Not $BorderGuidesAreDisabled Case $MenuItemToggleGuidesonControlDrag ToggleControl($nMsg) $GuidesAreDisabled = Not $GuidesAreDisabled Case $MenuItemToggleInclude ToggleControl($nMsg) Case $MenuItemToggleMessageLoop ToggleControl($nMsg) Case $ToogleControlResizing,$MenuItemToggleControlResizingMode If $ControlCount = 0 Then SoundPlay(@WindowsDir & "\Media\Windows Ding.wav") ContinueLoop EndIf $ControlDockingIsDisabled = Not $ControlDockingIsDisabled If $ControlDockingIsDisabled Then For $i=0 to $ControlCount-1 GUICtrlSetResizing($GuiControl[$i][0],802) Next Else For $i=0 to $ControlCount-1 GUICtrlSetResizing($GuiControl[$i][0],1) Next EndIf ToggleControl($MenuItemToggleControlResizingMode) Case $MenuItemRecent1 OpenRecentItem($MenuItemRecent1) Case $MenuItemRecent2 OpenRecentItem($MenuItemRecent2) Case $MenuItemRecent3 OpenRecentItem($MenuItemRecent3) Case $MenuItemRecent4 OpenRecentItem($MenuItemRecent4) Case $MenuItemRecent5 OpenRecentItem($MenuItemRecent5) Case $MenuItemRecent6 OpenRecentItem($MenuItemRecent6) Case $MenuItemRecent7 OpenRecentItem($MenuItemRecent7) Case $MenuItemRecent8 OpenRecentItem($MenuItemRecent8) Case $MenuItemRecent9 OpenRecentItem($MenuItemRecent9) Case $MenuItemClearAllGuides DeleteAllGuides() Case $GUI_EVENT_DROPPED OpenUserInterfaceFile(@GUI_DragFile) Case $GUI_EVENT_CLOSE, $METRO_CLOSE_BUTTON Local $Saved If $GuiHasChanges Then Switch MsgBox(4096+32+$MB_YESNOCANCEL,$WindowTitle,"Do you want to save this User Interface?") Case $IDYES If $SaveFile <> "" Then $Saved = GUISave() Else $Saved = GUISave("SaveAs") EndIf If Not $Saved Then ContinueLoop Case $IDCANCEL ContinueLoop EndSwitch EndIf FileDelete($AutoSaveFile) Settings("Shutdown") ExitLoop Case $Debug,$MenuItemShowMemory _ArrayDisplay($GuiUndo,"Undo","10") _ArrayDisplay($GuiControl,"Controls","10") _ArrayDisplay($GuiWindow,"Windows") _ArrayDisplay($GuiMenu,"Menus") _ArrayDisplay($GuiMenuItem,"Menu Items",12) GUISwitch(GetCanvas()) Case $MenuItemShowControls _ArrayDisplay($GuiControl,"Controls 0-32",32) GUISwitch(GetCanvas()) Case $MenuItemShowGuides _ArrayDisplay($GuiGuide,"Guides 0-32",32) GUISwitch(GetCanvas()) Case $MenuItemShowUndos _ArrayDisplay($GuiUndo,"Undos 0-32",32) GUISwitch(GetCanvas()) Case $MenuItemShowWindows _ArrayDisplay($GuiWindow,"Windows 0-32",32) GUISwitch(GetCanvas()) Case $bImport,$MenuItemImportCode ParseGUICode() Case $DeleteControl DeleteSelectedControls() RefreshCanvas() GUISwitch(GetCanvas()) Case $Cut Case $MenuItemSaveAs GUISave("SaveAs") Case $MenuItemSave, $SaveGui If $SaveFile <> "" Then GUISave() Else GUISave("SaveAs") EndIf Case $MenuItemCopyControlsToFile Local $Code = PrepareDelimitedDataFromControls() If $Code = "" Then ContinueLoop Local $CopyFile = FileSaveDialog("Save Controls to file.",@DesktopDir,"GUI Controls Copy (*.ctrls)",BitOR(2,16),WinGetTitle(GetCanvas()),$ControlWindow) If $CopyFile = "" Then ContinueLoop If Not FileWrite($CopyFile,$Code) Then MsgBox(4096+16,$WindowTitle,"Could not write file.") Case $Copy Local $Code = PrepareDelimitedDataFromControls() If $Code = "" Then ContinueLoop ClipPut($Code) Case $MenuItemPasteFromFile PasteFromFile() Case $MenuItemOpen, $OpenGui OpenUserInterfaceFile() Case $Paste Local $Clip = ClipGet() If Not StringRegExp($Clip,"^UserInterfaceBuilder") Then ContinueLoop If $Selected <> "" Then ClearSelectionRectangle("> Prepare for Paste") ;~ Local $Code="UserInterfaceBuilder♦",$idx,$hGUI = GetCanvas() Local $Constructor="",$Name,$Text,$Left,$Top,$Width,$Height,$Style,$ExStyle,$cData $Control = StringSplit($Clip,@CRLF,1) Local $Properties="" For $i=1 To $Control[0]-1 $Pair = StringSplit($Control[$i],"♦") For $j=1 To $Pair[0] $Value = StringSplit($Pair[$j],"→") If $Value[0] = 1 Then ContinueLoop ; If the Pair is just the "UserInterfaceBuilder♦" Header If $Value[2] = "GUICreate" Then ContinueLoop If $Value[2] = "GUICtrlCreateMenu" Then ContinueLoop If $Value[2] = "GUICtrlCreateMenuItem" Then ContinueLoop Assign($Value[1],$Value[2],1) Next If $Constructor = "" Then ContinueLoop ; Skip GUI creation string in paste contents If $ControlCount = $MaxControls Then ExitLoop If StringInStr($Constructor,"Input_Wrapper") Then $Left+=6 $Top+=6 $Width-=12 $Height-=12 EndIf ; Replace GuiRadios and GuiCheckboxs with Metro equivalants If $METRO_ENABLED Then $Constructor = StringReplace($Constructor,'GUICtrlCreateCheckbox','_Metro_CreateCheckbox') If @extended Then $cData = CalculateControlWidth($Text,-1,26) $Width = $cData[0] EndIf $Constructor = StringReplace($Constructor,'GUICtrlCreateRadio','_Metro_CreateRadio_Wrapper') If @extended Then $cData = CalculateControlWidth($Text,-1,16) $Width = $cData[0] EndIf EndIf NewControl($Constructor,$Name,$Text,$Left,$Top,$Width,$Height,$Style,$ExStyle) If $METRO_ENABLED Then Local $FontColor = ColorIsLight($GUIThemeColor) ? $COLOR_BLACK : $COLOR_WHITE GUICtrlSetBkColor($GuiControl[$ControlCount][0],$FontColor) EndIf If $Properties <> "" Then ;~ w("Props Declared for " & $Name) $Property = StringSplit($Properties,"♫") For $k=1 To $Property[0]-1 ;~ w("Executing -> " & $Property[$k]) Execute($Property[$k]) $GuiControl[$ControlCount][5] &= $Property[$k] & '♫' Next EndIf ;~ w("Deleting Props for "& $Name& " = """ & Eval("Properties")&"""") $Properties="" $GuiControl[$ControlCount][2] = $Name & $GuiControl[$ControlCount][0] If StringInStr($Constructor,"_Metro_") Then $GuiControl[$ControlCount][6] = $Text EndIf $Selected &= $GuiControl[$ControlCount-1][0] & "|" ; $ControlCount+=1 Next ConsoleWrite("Control Count:" & $ControlCount & @CRLF) DrawSelectionRectangle() HoldSelectedControls() GUICtrlSetData($ControlWindowInputBox,$GuiControl[$ControlCount-1][2]) ConsoleWrite("+> Write Undo" & @CRLF) $GuiHasChanges = True Case $Undo If $GuiUndo[0] <> "" Then ClearSelectionRectangle("Prepare for Undo Operation") Execute($GuiUndo[0]) _ArrayPush($GuiUndo,"") EndIf Case $ControlWindowInputBox If Not StringRegExp(GUICtrlRead($ControlWindowInputBox),"(?i)^(?:Local|Global) \$\w+$") Then MsgBox(4096+48,$WindowTitle,"The combination of scope and variable is in correct. Please check the spelling and delete any extra spaces.") ControlFocus(GetCanvas(),"",$ControlWindowInputBox) ContinueLoop EndIf If $Selected <> "" Then $Control = StringSplit($Selected,"|") If $Control[0]-1 > 1 Then $GuiWindow[$GuiInFocus][9] = GUICtrlRead($ControlWindowInputBox) Else Local $idx = GetIndexForGUICtrl($Control[1]) If $idx = -1 Then ContinueLoop $GuiControl[$idx][2] = GUICtrlRead($ControlWindowInputBox) EndIf Else $GuiWindow[$GuiInFocus][9] = GUICtrlRead($ControlWindowInputBox) EndIf $GuiHasChanges = True Case $Refresh RefreshCanvas() Case $SelectAll ClearSelectionRectangle("Prepare for Select All") If $ControlCount = 1 Then ContinueLoop For $i=0 to $ControlCount-1 If GUICtrlGetState($GuiControl[$i][0]) = $GUI_HIDE + $GUI_ENABLE Then ContinueLoop ; SKIP SELECTION OF DELETED CONTROLS $Selected &= $GuiControl[$i][0] & "|" Next DrawSelectionRectangle() Case $ToogleGuides,$MenuItemToggleGuidesonControlDrag $GuidesAreDisabled = Not $GuidesAreDisabled Case $MenuItemToggleGrabGuidesFromBorder $BorderGuidesAreDisabled = Not $BorderGuidesAreDisabled Case $MenuItemControlFont,$SetFont If $Selected <> "" Then $Control = StringSplit($Selected,"|") For $i=1 to $Control[0]-1 $idx = GetIndexForGUICtrl($Control[$i]) If $idx = -1 Then ContinueLoop 2 MsgBox(4096+48,$WindowTitle,"Abort: Could not find control in $GuiControl array. Ln.: " & @ScriptLineNumber) EndIf ExitLoop Next $TextColorParameterBlob = StringRegExp($GuiControl[$idx][5],"(?Ui)GUICtrlSetColor\(-1,(.*)\)♫",1) If @error Then $Color = 0 Else $Color = $TextColorParameterBlob[0] EndIf $FontParameterBlob = StringRegExp($GuiControl[$idx][5],"(?Ui)GUICtrlSetFont\((.*)\)♫",1) If @error Then Start('"TransformFontDialog"') Local $Font = GetDefaultGUIFont() $Font = _ChooseFont($Font[0],$Font[1]*$DPI) If @error Then ContinueLoop Else $FontParameterBlob = StringReplace($FontParameterBlob[0],'"','') $Parameter = StringSplit($FontParameterBlob,",") Start('"TransformFontDialog"') $Font = _ChooseFont($Parameter[5],$Parameter[2],$Color,$Parameter[3]) If @error Then ContinueLoop EndIf For $i=1 to $Control[0]-1 GUICtrlSetFont($Control[$i],$Font[3],$Font[4],$Font[1],$Font[2]) $idx = GetIndexForGUICtrl($Control[$i]) If $idx = -1 Then ContinueLoop 2 MsgBox(4096+48,$WindowTitle,"Abort: Could not find control in $GuiControl array. Ln.: " & @ScriptLineNumber) EndIf $GuiControl[$idx][5] = StringRegExpReplace($GuiControl[$idx][5],"(?Ui)GUICtrlSetFont.*♫","") ; Remove previous color setting $GuiControl[$idx][5] &= 'GUICtrlSetFont(-1,' & $Font[3] & ',' & $Font[4] & ',' & $Font[1] & ',' & '"' & $Font[2] & '"' & ')' & '♫' GUICtrlSetColor($Control[$i],$Font[7]) $GuiControl[$idx][5] = StringRegExpReplace($GuiControl[$idx][5],"(?Ui)GUICtrlSetColor.*♫","") ; Remove previous color setting $GuiControl[$idx][5] &= 'GUICtrlSetColor(-1,' & $Font[7] & ')' & '♫' Next $GuiHasChanges = True Else MsgBox(4096+64,$WindowTitle,"Please select a Control and try again.") EndIf Case $MenuItemSetStyle SetStyleDialog() Case $MenuItemInsertPicture If $Selected = "" Then MsgBox(4096+16,$WindowTitle,"Please select a Control and try again.") ContinueLoop EndIf Local $Filename = FileOpenDialog("Choose Icon",@DesktopDir & "\One to Many\Icons","JPG (*.jpg)|GIF (*.gif)|Icon (*.ico)",1,"",$ControlWindow) If @error Then ContinueLoop $Control = StringSplit($Selected,"|") For $i=1 to $Control[0]-1 GUICtrlSetImage(int($Control[$i]),$Filename) $idx = GetIndexForGUICtrl($Control[$i]) If $idx = -1 Then Return MsgBox(4096+48,$WindowTitle,"Could not find control in $GuiControl array. Icon change will not be saved.") $GuiControl[$idx][5] = StringRegExpReplace($GuiControl[$idx][5],"(?Ui)GUICtrlSetImage.*♫","") ; Remove previous Icon setting $GuiControl[$idx][5] &= 'GUICtrlSetImage(-1,"' & $Filename & '")' & '♫' Next $GuiHasChanges = True Case $bSetControlColor,$MenuItemControlorWindowColor $Color = _ChooseColor(2,0,0,GetCanvas()) If $Color = -1 Then $Color = InputBox($WindowTitle,"Set Color in HEX","","",360,150,Default,Default,0,$ControlWindow) If $Color = "" Then ContinueLoop EndIf If $Selected <> "" Then $Control = StringSplit($Selected,"|") For $i=1 to $Control[0]-1 GUICtrlSetBkColor($Control[$i],$Color) $idx = GetIndexForGUICtrl($Control[$i]) If $idx = -1 Then Return MsgBox(4096+48,$WindowTitle,"Could not find control in $GuiControl array. Color change will not be saved.") $GuiControl[$idx][5] = StringRegExpReplace($GuiControl[$idx][5],"(?Ui)GuiCtrlSetBkColor.*♫","") ; Remove previous color setting $GuiControl[$idx][5] &= 'GuiCtrlSetBkColor(-1,' & $Color & ')' & '♫' Next Else GUISetBkColor($Color,GetCanvas()) $GuiWindow[$GuiInFocus][10] = StringRegExpReplace($GuiWindow[$GuiInFocus][10],"(?Ui)GUISetBkColor.*♫","") ; Remove previous color $GuiWindow[$GuiInFocus][10] &= 'GUISetBkColor(' & $Color & ')' & '♫' EndIf $GuiHasChanges = True Case $MenuItemControlTextColor If $Selected <> "" Then $Color = _ChooseColor(2,0,0,GetCanvas()) If $Color = -1 Then $Color = InputBox($WindowTitle,"Set Color in HEX","","",360,150,Default,Default,0,$ControlWindow) If $Color = "" Then ContinueLoop EndIf $Control = StringSplit($Selected,"|") For $i=1 to $Control[0]-1 GUICtrlSetColor($Control[$i],$Color) $idx = GetIndexForGUICtrl($Control[$i]) If $idx = -1 Then Return MsgBox(4096+48,$WindowTitle,"Could not find control in $GuiControl array. Color change will not be saved.") $GuiControl[$idx][5] = StringRegExpReplace($GuiControl[$idx][5],"(?Ui)GuiCtrlSetColor.*♫","") ; Remove previous color setting $GuiControl[$idx][5] &= 'GuiCtrlSetColor(-1,' & $Color & ')' & '♫' Next $GuiHasChanges = True Else MsgBox(4096+16,$WindowTitle,"Please select a Control.") EndIf Case $bSetControlText,$MenuItemControlTextorWindowTitle $hGUI = GetCanvas() If $Selected <> "" Then $Text = InputBox("Set Control text"," ","","",360,150,Default,Default,0,$ControlWindow) If $Text = "" Then ContinueLoop $Control = StringSplit($Selected,"|") For $i=1 to $Control[0]-1 GUICtrlSetData($Control[$i],$Text) Next Else $Text = InputBox("Set Window Title"," ","","",360,150,Default,Default,0,$ControlWindow) If $Text = "" Then ContinueLoop WinSetTitle($hGUI,"",$Text) EndIf $GuiHasChanges = True Case $bBigger $hGUI = GetCanvas() $WinPos = WinGetPos($hGUI) If $Selected <> "" Then $Control = StringSplit($Selected,"|") For $i=1 to $Control[0]-1 $cPos = ControlGetPos($hGUI,"",int($Control[$i])) GUICtrlSetPos(int($Control[$i]),$cPos[0]-10,$cPos[1]-10,$cPos[2]+20,$cPos[3]+20) Next Else WinMove($hGUI,"",$WinPos[0],$WinPos[1],$WinPos[2]+32,$WinPos[3]+32) EndIf $GuiHasChanges = True Case $bSmaller $hGUI = GetCanvas() $WinPos = WinGetPos($hGUI) If $Selected <> "" Then $Control = StringSplit($Selected,"|") For $i=1 to $Control[0]-1 $cPos = ControlGetPos($hGUI,"",int($Control[$i])) GUICtrlSetPos(int($Control[$i]),$cPos[0]+10,$cPos[1]+10,$cPos[2]-20,$cPos[3]-20) Next Else WinMove(GetCanvas(),"",$WinPos[0],$WinPos[1],$WinPos[2]-32,$WinPos[3]-32) EndIf $GuiHasChanges = True Case $MenuItemExportHTML ExportHtmlDialog() Case $bPlay,$MenuItemGenerateCode ; RefreshCanvas() GenerateCode() Case $bAccelUp $hGUI = WinActive("[ACTIVE]") If $hGUI = $ControlWindow Or $hGUI = $ToolBox Then ContinueLoop $Control = StringSplit($Selected,"|") For $i=1 to $Control[0]-1 $SelectedControl = ControlGetPos($hGUI, "", int($Control[$i])) GUICtrlSetPos(int($Control[$i]), $SelectedControl[0], $SelectedControl[1]-10) RefreshSelectionRectangle(False) ConsoleWrite("+> Write Undo" & @CRLF) _ArrayPush($GuiUndo,"GUICtrlSetPos(" & int($Control[$i]) & "," & $SelectedControl[0] & "," & $SelectedControl[1] & ")",1) Next If $Selected <> "" Then $GuiHasChanges = True Case $bAccelDown $hGUI = WinActive("[ACTIVE]") If $hGUI = $ControlWindow Or $hGUI = $ToolBox Then ContinueLoop $Control = StringSplit($Selected,"|") For $i=1 to $Control[0]-1 $SelectedControl = ControlGetPos($hGUI, "", int($Control[$i])) GUICtrlSetPos(int($Control[$i]), $SelectedControl[0], $SelectedControl[1]+10) RefreshSelectionRectangle(False) ConsoleWrite("+> Write Undo" & @CRLF) _ArrayPush($GuiUndo,"GUICtrlSetPos(" & int($Control[$i]) & "," & $SelectedControl[0] & "," & $SelectedControl[1] & ")",1) Next If $Selected <> "" Then $GuiHasChanges = True Case $bAccelLeft $hGUI = WinActive("[ACTIVE]") If $hGUI = $ControlWindow Or $hGUI = $ToolBox Then ContinueLoop $Control = StringSplit($Selected,"|") For $i=1 to $Control[0]-1 $SelectedControl = ControlGetPos($hGUI, "", int($Control[$i])) GUICtrlSetPos(int($Control[$i]), $SelectedControl[0]-10, $SelectedControl[1]) RefreshSelectionRectangle(False) ConsoleWrite("+> Write Undo" & @CRLF) _ArrayPush($GuiUndo,"GUICtrlSetPos(" & int($Control[$i]) & "," & $SelectedControl[0] & "," & $SelectedControl[1] & ")",1) Next If $Selected <> "" Then $GuiHasChanges = True Case $bAccelRight $hGUI = WinActive("[ACTIVE]") If $hGUI = $ControlWindow Or $hGUI = $ToolBox Then ContinueLoop $Control = StringSplit($Selected,"|") For $i=1 to $Control[0]-1 $SelectedControl = ControlGetPos($hGUI, "", int($Control[$i])) GUICtrlSetPos(int($Control[$i]), $SelectedControl[0]+10, $SelectedControl[1]) RefreshSelectionRectangle(False) ConsoleWrite("+> Write Undo" & @CRLF) _ArrayPush($GuiUndo,"GUICtrlSetPos(" & int($Control[$i]) & "," & $SelectedControl[0] & "," & $SelectedControl[1] & ")",1) Next If $Selected <> "" Then $GuiHasChanges = True Case $KeyUp $hGUI = WinActive("[ACTIVE]") If $hGUI = $ControlWindow Or $hGUI = $ToolBox Then ContinueLoop $Control = StringSplit($Selected,"|") For $i=1 to $Control[0]-1 $SelectedControl = ControlGetPos($hGUI, "", int($Control[$i])) GUICtrlSetPos(int($Control[$i]), $SelectedControl[0], $SelectedControl[1]-1) RefreshSelectionRectangle(False) ConsoleWrite("+> Write Undo" & @CRLF) _ArrayPush($GuiUndo,"GUICtrlSetPos(" & int($Control[$i]) & "," & $SelectedControl[0] & "," & $SelectedControl[1] & ")",1) Next If $Selected <> "" Then $GuiHasChanges = True Case $KeyDown $hGUI = WinActive("[ACTIVE]") If $hGUI = $ControlWindow Or $hGUI = $ToolBox Then ContinueLoop $Control = StringSplit($Selected,"|") For $i=1 to $Control[0]-1 $SelectedControl = ControlGetPos($hGUI, "", int($Control[$i])) GUICtrlSetPos(int($Control[$i]), $SelectedControl[0], $SelectedControl[1]+1) RefreshSelectionRectangle(False) ConsoleWrite("+> Write Undo" & @CRLF) _ArrayPush($GuiUndo,"GUICtrlSetPos(" & int($Control[$i]) & "," & $SelectedControl[0] & "," & $SelectedControl[1] & ")",1) Next If $Selected <> "" Then $GuiHasChanges = True Case $KeyLeft $hGUI = WinActive("[ACTIVE]") If $hGUI = $ControlWindow Or $hGUI = $ToolBox Then ContinueLoop $Control = StringSplit($Selected,"|") For $i=1 to $Control[0]-1 $SelectedControl = ControlGetPos($hGUI, "", int($Control[$i])) GUICtrlSetPos(int($Control[$i]), $SelectedControl[0]-1, $SelectedControl[1]) RefreshSelectionRectangle(False) ConsoleWrite("+> Write Undo" & @CRLF) _ArrayPush($GuiUndo,"GUICtrlSetPos(" & int($Control[$i]) & "," & $SelectedControl[0] & "," & $SelectedControl[1] & ")",1) Next If $Selected <> "" Then $GuiHasChanges = True Case $KeyRight $hGUI = WinActive("[ACTIVE]") If $hGUI = $ControlWindow Or $hGUI = $ToolBox Then ContinueLoop $Control = StringSplit($Selected,"|") For $i=1 to $Control[0]-1 $SelectedControl = ControlGetPos($hGUI, "", int($Control[$i])) GUICtrlSetPos(int($Control[$i]), $SelectedControl[0]+1, $SelectedControl[1]) RefreshSelectionRectangle(False) ConsoleWrite("+> Write Undo" & @CRLF) _ArrayPush($GuiUndo,"GUICtrlSetPos(" & int($Control[$i]) & "," & $SelectedControl[0] & "," & $SelectedControl[1] & ")",1) Next If $Selected <> "" Then $GuiHasChanges = True Case $bSizeUp ResizeControlsWithArrowKey("Up") Case $bSizeDown ResizeControlsWithArrowKey("Down") Case $bSizeLeft ResizeControlsWithArrowKey("Left") Case $bSizeRight ResizeControlsWithArrowKey("Right") Case $RemoveDeletedControls RemoveDeletedControls() Case $DeselectControl ClearSelectionRectangle("Esc pressed") ; /////////////////////////////////////////////////////////// GUI CREATION ///////////////////////////////////////////////////////////////////////////////////////////////////// Case $MenuItemNewToolWindow _SetTheme($GUI_Theme_Name) ;See MetroThemes.au3 for selectable themes or to add more ;Color overrides for Normal window OverrideThemeColors() LogToConsole("!>$MenuItemNewWindow Set theme to " & $GUI_Theme_Name) Local $Saved If $GuiHasChanges Then Switch MsgBox(4096+32+$MB_YESNOCANCEL,$WindowTitle,"Do you want to save this User Interface?") Case $IDYES If $SaveFile <> "" Then $Saved = GUISave() Else $Saved = GUISave("SaveAs") EndIf If Not $Saved Then ContinueLoop ;Case $IDNO Case $IDCANCEL ContinueLoop EndSwitch EndIf If $METRO_ENABLED Then _Metro_GUIDelete($GuiWindow[$WindowCount-1][4]) Else GUIDelete($GuiWindow[$WindowCount-1][4]) EndIf $METRO_ENABLED = False LogToConsole("This should always return False: " & HasMetroControls("New Tool Window Called",False)) GUICtrlSetData($LabelControlCount,"0") Local $WindowDefinition = [11,"Global","$hWnd","GUICreate",'"Tool Window"',480,320,-1,-1,BitOR($WS_SYSMENU,$WS_CAPTION),$WS_EX_TOOLWINDOW,"$ToolBox"] NewWindow($WindowDefinition) Case $bNew,$MenuItemNewWindow _SetTheme($GUI_Theme_Name) ;See MetroThemes.au3 for selectable themes or to add more OverrideThemeColors() LogToConsole("!>$MenuItemNewWindow Set theme to " & $GUI_Theme_Name) Local $Saved If $GuiHasChanges Then Switch MsgBox(4096+32+$MB_YESNOCANCEL,$WindowTitle,"Do you want to save this User Interface?") Case $IDYES If $SaveFile <> "" Then $Saved = GUISave() Else $Saved = GUISave("SaveAs") EndIf If Not $Saved Then ContinueLoop Case $IDNO If $METRO_ENABLED Then _Metro_GUIDelete($GuiWindow[$WindowCount-1][4]) Else GUIDelete($GuiWindow[$WindowCount-1][4]) EndIf $METRO_ENABLED = False GUICtrlSetData($LabelControlCount,"0") Local $WindowDefinition = [11,"Global","$hWnd","GUICreate",'"Untitled Window"',640,470,-1,-1,BitOR($WS_CAPTION, $WS_SYSMENU,$WS_MINIMIZEBOX,$WS_SIZEBOX, $WS_THICKFRAME),$WS_EX_ACCEPTFILES,"$ToolBox"] NewWindow($WindowDefinition) Case $IDCANCEL ContinueLoop EndSwitch Else If $METRO_ENABLED Then _Metro_GUIDelete($GuiWindow[$WindowCount-1][4]) Else GUIDelete($GuiWindow[$WindowCount-1][4]) EndIf $METRO_ENABLED = False GUICtrlSetData($LabelControlCount,"0") Local $WindowDefinition = [11,"Global","$hWnd","GUICreate",'"Untitled Window"',640,470,-1,-1,BitOR($WS_CAPTION, $WS_SYSMENU,$WS_MINIMIZEBOX,$WS_SIZEBOX, $WS_THICKFRAME),$WS_EX_ACCEPTFILES,"$ToolBox"] NewWindow($WindowDefinition) EndIf Case $MenuItemNewMetroWindow Local $Saved If $GuiHasChanges Then Switch MsgBox(4096+32+$MB_YESNOCANCEL,$WindowTitle,"Do you want to save this User Interface?") Case $IDYES If $SaveFile <> "" Then $Saved = GUISave() Else $Saved = GUISave("SaveAs") EndIf If Not $Saved Then ContinueLoop ;Case $IDNO Case $IDCANCEL ContinueLoop EndSwitch EndIf If $METRO_ENABLED Then _Metro_GUIDelete($GuiWindow[$WindowCount-1][4]) Else GUIDelete($GuiWindow[$WindowCount-1][4]) EndIf GUICtrlSetData($LabelControlCount,"0") Local $WindowDefinition = [11,"Global","$hWnd","_Metro_CreateGUI_Wrapper",'"Metro Window"',640,470,-1,-1,True,"DarkBlueV2","$ToolBox"] NewWindow($WindowDefinition) _Metro_AddWindows11StyleCorners(GetCanvas()) ;Add/create caption buttons to the GUI ;CloseBtn = True, MaximizeBtn = True, MinimizeBtn = True, FullscreenBtn = True, MenuBtn = True $Control_Buttons = _Metro_AddControlButtons(True, True, True, False, False) ;Set variables for the handles of the GUI-Control buttons. (Above function always returns an array this size and in this order, no matter which buttons are selected.) $METRO_CLOSE_BUTTON = $Control_Buttons[0] $METRO_MAXIMIZE_BUTTON = $Control_Buttons[1] $METRO_RESTORE_BUTTON = $Control_Buttons[2] $METRO_MINIMIZE_BUTTON = $Control_Buttons[3] $METRO_FULLSCREEN_BUTTON = $Control_Buttons[4] $METRO_FSRestore_BUTTON = $Control_Buttons[5] $METRO_MENU_BUTTON = $Control_Buttons[6] GUISetState(@SW_SHOW) ; ///////////////////////////////////////////////////////// CONTROL CREATION ///////////////////////////////////////////////////////////////////////////////////////////////// Case $bMenu If $MenuCount = $MaxMenus Then ContinueLoop Local $MenuName = InputBox("Name","Menu"," ","",360,150,Default,Default,0,$ControlWindow) If $MenuName = "" Then ContinueLoop $GuiMenu[$MenuCount][0] = GUICtrlCreateMenu($MenuName) $GuiMenu[$MenuCount][1] = $MenuName $MenuCount+=1 $GuiHasChanges = True Case $bMenuItem If $GuiMenu[0][1] = "" Then ContinueLoop If $MenuItemCount = $MaxMenuItems Then ContinueLoop Local $MenuItemName = InputBox("Name","Menu Item"," ","",360,150,Default,Default,0,$ControlWindow) If $MenuItemName = "" Then ContinueLoop Local $ParentMenu = MenuPicker() If $ParentMenu = 0 Then ContinueLoop $GuiMenuItem[$MenuItemCount][0] = GUICtrlCreateMenuItem($MenuItemName,$ParentMenu[0]) $GuiMenuItem[$MenuItemCount][1] = $MenuItemName ; "&Open" $GuiMenuItem[$MenuItemCount][2] = $ParentMenu[0] ; Parent ControlID "68" $GuiMenuItem[$MenuItemCount][3] = $ParentMenu[1] ; "$MenuFile" GUISwitch(GetCanvas()) ; This is very important for creating new controls on the client area $MenuItemCount+=1 $GuiHasChanges = True Case $bListView If $ControlCount = $MaxControls Then ContinueLoop $WinPos = WinGetPos(GetCanvas()) NewControl("GUICtrlCreateListView","Local $ListView","text",int($WinPos[2]/2)-40,int($WinPos[3]/2)-13,87*5,29*12) GUICtrlSetBkColor(-1,0xE4EEF7) $GuiControl[$ControlCount-1][5] &= 'GuiCtrlSetBkColor(-1,0xE4EEF7)' & '♫' GUICtrlSetData(-1,"Control " & $GuiControl[$ControlCount-1][0]) HoldControl($GuiControl[$ControlCount][0]) ; $ControlCount+=1 Case $bButton If $ControlCount = $MaxControls Then ContinueLoop $WinPos = WinGetPos(GetCanvas()) NewControl("GUICtrlCreateButton","Local $Button","text",int($WinPos[2]/2)-40,int($WinPos[3]/2)-13,87,29,$BS_ICON) GUICtrlSetData(-1,"Control " & $GuiControl[$ControlCount-1][0]) HoldControl($GuiControl[$ControlCount][0]) ; $ControlCount+=1 Case $bRadio If $ControlCount = $MaxControls Then ContinueLoop $WinPos = WinGetPos(GetCanvas()) NewControl("GUICtrlCreateRadio","Local $Radio","text",int($WinPos[2]/2)-40,int($WinPos[3]/2)-13,87,29,$BS_ICON) GUICtrlSetData(-1,"Control " & $GuiControl[$ControlCount-1][0]) HoldControl($GuiControl[$ControlCount][0]) ; $ControlCount+=1 Case $bCheckBox If $ControlCount = $MaxControls Then ContinueLoop $WinPos = WinGetPos(GetCanvas()) NewControl("GUICtrlCreateCheckBox","Local $CheckBox","text",int($WinPos[2]/2)-40,int($WinPos[3]/2)-13,87,29,$BS_ICON) GUICtrlSetData(-1,"Control " & $GuiControl[$ControlCount-1][0]) HoldControl($GuiControl[$ControlCount][0]) ; $ControlCount+=1 Case $bLabel If $ControlCount = $MaxControls Then ContinueLoop $WinPos = WinGetPos(GetCanvas()) NewControl("GUICtrlCreateLabel","Local $Label","text",int($WinPos[2]/2)-40,int($WinPos[3]/2)-13,87,13) If $METRO_ENABLED Then Local $FontColor = ColorIsLight($GUIThemeColor) ? "0x000000" : "0xFFFFFF" ChangeFontColor($GuiControl[$ControlCount][0], $FontColor,$GUIThemeColor) EndIf GUICtrlSetData(-1,"Control " & $GuiControl[$ControlCount-1][0]) HoldControl($GuiControl[$ControlCount][0]) ; $ControlCount+=1 Case $bListBox If $ControlCount = $MaxControls Then ContinueLoop $WinPos = WinGetPos(GetCanvas()) NewControl("GUICtrlCreateList","Local $List","",int($WinPos[2]/2)-40,int($WinPos[3]/2)-13,87*3,29*6,$SS_SIMPLE) GUICtrlSetBkColor(-1,0xE4EEF7) $GuiControl[$ControlCount-1][5] &= 'GuiCtrlSetBkColor(-1,0xE4EEF7)' & '♫' GUICtrlSetData(-1,"Control " & $GuiControl[$ControlCount-1][0]) HoldControl($GuiControl[$ControlCount][0]) ; $ControlCount+=1 Case $bEdit If $ControlCount = $MaxControls Then ContinueLoop $WinPos = WinGetPos(GetCanvas()) NewControl("GUICtrlCreateEdit","Local $Edit","text",int($WinPos[2]/2)-40,int($WinPos[3]/2)-13,87*3,29*6) GUICtrlSetBkColor(-1,0xE4EEF7) $GuiControl[$ControlCount-1][5] &= 'GuiCtrlSetBkColor(-1,0xE4EEF7)' & '♫' GUICtrlSetData(-1,"Control " & $GuiControl[$ControlCount-1][0]) HoldControl($GuiControl[$ControlCount][0]) ; $ControlCount+=1 ;~ $GuiControl[$ControlCount][0] = GUICtrlCreateEdit("",int($WinPos[2]/2)-40,int($WinPos[3]/2)-13,87*3,29*6,$SS_SIMPLE) Case $bInputBox If $ControlCount = $MaxControls Then ContinueLoop $WinPos = WinGetPos(GetCanvas()) NewControl("GUICtrlCreateInput","Local $Input","text",int($WinPos[2]/2)-40,int($WinPos[3]/2)-13,87*2,29) GUICtrlSetBkColor(-1,0xE4EEF7) $GuiControl[$ControlCount-1][5] &= 'GuiCtrlSetBkColor(-1,0xE4EEF7)' & '♫' GUICtrlSetData(-1,"Control " & $GuiControl[$ControlCount-1][0]) HoldControl($GuiControl[$ControlCount][0]) ; $ControlCount+=1 ;~ $GuiControl[$ControlCount][0] = GUICtrlCreateInput("",int($WinPos[2]/2)-40,int($WinPos[3]/2)-13,87*2,29) Case $bComboBox If $ControlCount = $MaxControls Then ContinueLoop $WinPos = WinGetPos(GetCanvas()) NewControl("GUICtrlCreateCombo","Local $Combo","text",int($WinPos[2]/2)-40,int($WinPos[3]/2)-13,87*2,29) GUICtrlSetBkColor(-1,0xE4EEF7) $GuiControl[$ControlCount-1][5] &= 'GuiCtrlSetBkColor(-1,0xE4EEF7)' & '♫' GUICtrlSetData(-1,"|Control " & $GuiControl[$ControlCount][0],"Control " & $GuiControl[$ControlCount][0]) HoldControl($GuiControl[$ControlCount][0]) ; $ControlCount+=1 ;~ $GuiControl[$ControlCount][0] = GUICtrlCreateCombo("Destroy Me" & $GuiControl[$ControlCount][0],int($WinPos[2]/2)-40,int($WinPos[3]/2)-13,87*2,29) Case $bPic If $ControlCount = $MaxControls Then ContinueLoop $WinPos = WinGetPos(GetCanvas()) NewControl("GUICtrlCreatePic","Local $Pic","C:\Windows\web\Wallpaper\Spotlight\img50.jpg",int($WinPos[2]/2)-40,int($WinPos[3]/2)-13,280,175,-1) GUICtrlSetData(-1,"Control " & $GuiControl[$ControlCount-1][0]) HoldControl($GuiControl[$ControlCount][0]) ; $ControlCount+=1 ; METRO CONTROLS Case $bMetroButton If $ControlCount = $MaxControls Then ContinueLoop $WinPos = WinGetPos(GetCanvas()) Local $Pick = DisplayButtons("MetroButtons", $Toolbox,$bMetroButton,True) If @error Then GUISwitch(GetCanvas()) ContinueLoop EndIf Local $Data = AskForControlText() If @error Then ContinueLoop Switch $Pick Case "Config1" NewControl("_Metro_CreateButton","Local $ButtonMe",$Data[1],int($WinPos[2]/2)-40,int($WinPos[3]/2)-13,$Data[0],29) Case "Config2" NewControl("_Metro_CreateButtonEx","Local $ButtonEx",$Data[1],int($WinPos[2]/2)-40,int($WinPos[3]/2)-13,$Data[0],29) Case "Config3" NewControl("_Metro_CreateButtonEx2","Local $ButtonEx2",$Data[1],int($WinPos[2]/2)-40,int($WinPos[3]/2)-13,$Data[0],29) EndSwitch Sleep($MetroDelayHoldButton) HoldControl($GuiControl[$ControlCount][0]) ; $ControlCount+=1 Case $bMetroToggle If $ControlCount = $MaxControls Then ContinueLoop $WinPos = WinGetPos(GetCanvas()) Local $Data = AskForControlText(-1,-1,-1, 46) If @error Then ContinueLoop NewControl("_Metro_CreateToggle","Local $ToggleMe",$Data[1],int($WinPos[2]/2)-40,int($WinPos[3]/2)-13,$Data[0],28) Sleep($MetroDelayHoldButton) HoldControl($GuiControl[$ControlCount][0]) ; $ControlCount+=1 Case $bMetroToggleEx If $ControlCount = $MaxControls Then ContinueLoop $WinPos = WinGetPos(GetCanvas()) Local $Data = AskForControlText(-1,-1,-1, 46) If @error Then ContinueLoop NewControl("_Metro_CreateToggleEx","Local $ToggleEx",$Data[1],int($WinPos[2]/2)-40,int($WinPos[3]/2)-13,$Data[0],28) Sleep($MetroDelayHoldButton) HoldControl($GuiControl[$ControlCount][0]) ; $ControlCount+=1 Case $bMetroRadio If $ControlCount = $MaxControls Then ContinueLoop $WinPos = WinGetPos(GetCanvas()) Local $Data = AskForControlText(-1,-1,-1, 20) If @error Then ContinueLoop NewControl("_Metro_CreateRadio_Wrapper","Local $RadioMe",$Data[1],int($WinPos[2]/2)-40,int($WinPos[3]/2)-13,$Data[0],29) Sleep($MetroDelayHoldButton) HoldControl($GuiControl[$ControlCount][0]) ; $ControlCount+=1 Case $bMetroRadioEx If $ControlCount = $MaxControls Then ContinueLoop $WinPos = WinGetPos(GetCanvas()) Local $Data = AskForControlText(-1,-1,-1, 20) If @error Then ContinueLoop NewControl("_Metro_CreateRadioEx_Wrapper","Local $RadioEx",$Data[1],int($WinPos[2]/2)-40,int($WinPos[3]/2)-13,$Data[0],29) Sleep($MetroDelayHoldButton) HoldControl($GuiControl[$ControlCount][0]) ; $ControlCount+=1 Case $bMetroCheckbox If $ControlCount = $MaxControls Then ContinueLoop $WinPos = WinGetPos(GetCanvas()) Local $Data = AskForControlText(-1,-1,-1, 20) If @error Then ContinueLoop NewControl("_Metro_CreateCheckbox","Local $CheckboxMe",$Data[1],int($WinPos[2]/2)-40,int($WinPos[3]/2)-13,$Data[0],29) Sleep($MetroDelayHoldButton) HoldControl($GuiControl[$ControlCount][0]) ; $ControlCount+=1 Case $bMetroCheckboxEx If $ControlCount = $MaxControls Then ContinueLoop $WinPos = WinGetPos(GetCanvas()) Local $Data = AskForControlText(-1,-1,-1, 26) If @error Then ContinueLoop NewControl("_Metro_CreateCheckboxEx","Local $CheckboxEx",$Data[1],int($WinPos[2]/2)-40,int($WinPos[3]/2)-13,$Data[0],29) Sleep($MetroDelayHoldButton) HoldControl($GuiControl[$ControlCount][0]) ; $ControlCount+=1 Case $bMetroCheckboxEx2 If $ControlCount = $MaxControls Then ContinueLoop $WinPos = WinGetPos(GetCanvas()) Local $Data = AskForControlText(-1,-1,-1, 26) If @error Then ContinueLoop NewControl("_Metro_CreateCheckboxEx2","Local $CheckboxEx2",$Data[1],int($WinPos[2]/2)-40,int($WinPos[3]/2)-13,$Data[0],29) Sleep($MetroDelayHoldButton) HoldControl($GuiControl[$ControlCount][0]) ; $ControlCount+=1 Case $bMetroProgress If $ControlCount = $MaxControls Then ContinueLoop $WinPos = WinGetPos(GetCanvas()) NewControl("_Metro_CreateProgress_Wrapper","Local $ProgressMe","Dummy",int($WinPos[2]/2)-40,int($WinPos[3]/2)-13,87*2,29) GUICtrlSetBkColor($GuiControl[$ControlCount][0],$CB_Radio_Color) Sleep($MetroDelayHoldButton) HoldControl($GuiControl[$ControlCount][0]) ; $ControlCount+=1 ; XPK CONTROLS Case $bMetroButtonRainbowMenu If $ControlCount = $MaxControls Then ContinueLoop $WinPos = WinGetPos(GetCanvas()) Local $Pick = DisplayButtons("Rainbow", $Toolbox,$bMetroButtonRainbowMenu,True) If @error Then GUISwitch(GetCanvas()) ContinueLoop EndIf Local $Data = AskForControlText('Pick an icon from the font "Segoe MDL2 Assets" on "Character Map UWP.',-1,87,0) If @error Then ContinueLoop Switch $Pick Case "Config1" NewControl("_Metro_CreateRainbowButtonLeft","Local $ButtonLr",$Data[1],20,20,$Data[0],29) $Selected = $GuiControl[$ControlCount-1][0] & "|" ; $ControlCount+=1 NewControl("_Metro_CreateRainbowButtonRight","Local $ButtonRr","",20+$Data[0],20,29,29) $Selected &= $GuiControl[$ControlCount-1][0] & "|" ; $ControlCount+=1 Sleep($MetroDelayHoldButton) HoldSelectedControls() Case "Config2" NewControl("_Metro_CreateRainbowButtonLeft","Local $ButtonEx",$Data[1],20,20,$Data[0],29) $Selected = $GuiControl[$ControlCount-1][0] & "|" ; $ControlCount+=1 NewControl("_Metro_CreateRainbowButtonCenter","Local $ButtonEx","",20+$Data[0],20,29,29) $Selected &= $GuiControl[$ControlCount-1][0] & "|" ; $ControlCount+=1 NewControl("_Metro_CreateRainbowButtonRight","Local $ButtonEx","",20+$Data[0]+29,20,29,29) $Selected &= $GuiControl[$ControlCount-1][0] & "|" ; $ControlCount+=1 Sleep($MetroDelayHoldButton) HoldSelectedControls() Case "Config3" Local $Width = $Data[0]<87 ? 87 : $Data[0] NewControl("_Metro_CreateRainbowButtonWindow11","Local $ButtonEx2",$Data[1],int($WinPos[2]/2)-40,int($WinPos[3]/2)-13,$Width,29) Sleep($MetroDelayHoldButton) HoldControl($GuiControl[$ControlCount][0]) ; $ControlCount+=1 EndSwitch ;~ Case $bMetroButtonRainbowCenter ;~ If $ControlCount = $MaxControls Then ContinueLoop ;~ $WinPos = WinGetPos(GetCanvas()) ;~ Local $Data = AskForControlText('Pick an icon from the font "Segoe MDL2 Assets" on "Character Map UWP.') ;~ If @error Then ContinueLoop ;~ NewControl("_Metro_CreateRainbowButtonCenter","Local $ButtonRbCn",$Data[1],int($WinPos[2]/2)-40,int($WinPos[3]/2)-13,29,29) ;~ Sleep($MetroDelayHoldButton) ;~ HoldControl($GuiControl[$ControlCount][0]) ;~ $ControlCount+=1 Case $bMetroButtonMenuStripMenu If $ControlCount = $MaxControls Then ContinueLoop $WinPos = WinGetPos(GetCanvas()) Local $Pick = DisplayButtons("MenuStrip",$Toolbox,$bMetroButtonMenuStripMenu,True) If @error Then GUISwitch(GetCanvas()) ContinueLoop EndIf Switch $Pick Case "Config0" NewControl("_Metro_CreateMenuStrip","Local $MenuStrip","",20,20,600,31) $Selected = $GuiControl[$ControlCount-1][0] & "|" ; $ControlCount+=1 Sleep($MetroDelayHoldButton) HoldSelectedControls() Case "Config1" Local $Data = AskForControlText() If @error Then ContinueLoop NewControl("_Metro_CreateMenuButton","Local $MenuButton",$Data[1],20,20,$Data[0],28) $Selected = $GuiControl[$ControlCount-1][0] & "|" ; $ControlCount+=1 Sleep($MetroDelayHoldButton) HoldSelectedControls() Case "Config2" NewControl("_Metro_CreateMenuButtonIcon","Local $MenuButtonIcon","",20,20,28,28) $Selected = $GuiControl[$ControlCount-1][0] & "|" ; $ControlCount+=1 Sleep($MetroDelayHoldButton) HoldSelectedControls() Case "Config3" ; NewControl("_Metro_CreateMenuButtonIcon","Local $MenuButtonIcon","",20,20,28,28) $Selected = $GuiControl[$ControlCount-1][0] & "|" ; $ControlCount+=1 Sleep($MetroDelayHoldButton) HoldSelectedControls() Case "Config4" NewControl("_Metro_CreateMenuButtonIcon","Local $MenuButtonIcon","",20,20,28,28) $Selected = $GuiControl[$ControlCount-1][0] & "|" ; $ControlCount+=1 Sleep($MetroDelayHoldButton) HoldSelectedControls() Case "Config5" NewControl("_Metro_CreateMenuButtonIcon","Local $MenuButtonIcon","",20,20,28,28) $Selected = $GuiControl[$ControlCount-1][0] & "|" ; $ControlCount+=1 Sleep($MetroDelayHoldButton) HoldSelectedControls() Case "Config6" NewControl("_Metro_CreateMenuButtonIcon","Local $MenuButtonIcon","",20,20,28,28) $Selected = $GuiControl[$ControlCount-1][0] & "|" ; $ControlCount+=1 Sleep($MetroDelayHoldButton) HoldSelectedControls() Case "Config7" NewControl("_Metro_CreateMenuButtonIcon","Local $MenuButtonIcon","",20,20,28,28) $Selected = $GuiControl[$ControlCount-1][0] & "|" ; $ControlCount+=1 Sleep($MetroDelayHoldButton) HoldSelectedControls() Case "Config8" NewControl("_Metro_CreateMenuButtonIcon","Local $MenuButtonIcon","",20,20,28,28) $Selected = $GuiControl[$ControlCount-1][0] & "|" ; $ControlCount+=1 Sleep($MetroDelayHoldButton) HoldSelectedControls() Case "Config9" NewControl("_Metro_CreateMenuButtonIcon","Local $MenuButtonIcon","",20,20,28,28) $Selected = $GuiControl[$ControlCount-1][0] & "|" ; $ControlCount+=1 Sleep($MetroDelayHoldButton) HoldSelectedControls() Case "Config10" NewControl("_Metro_CreateMenuButtonIcon","Local $MenuButtonIcon","",20,20,28,28) $Selected = $GuiControl[$ControlCount-1][0] & "|" ; $ControlCount+=1 Sleep($MetroDelayHoldButton) HoldSelectedControls() Case "Config11" NewControl("_Metro_CreateMenuButtonIcon","Local $MenuButtonIcon","",20,20,28,28) $Selected = $GuiControl[$ControlCount-1][0] & "|" ; $ControlCount+=1 Sleep($MetroDelayHoldButton) HoldSelectedControls() EndSwitch ;~ Case $bMetroButtonCenter ;~ If $ControlCount = $MaxControls Then ContinueLoop ;~ $WinPos = WinGetPos(GetCanvas()) ;~ Local $Data = AskForControlText('Pick an icon from the font "Segoe MDL2 Assets" on "Character Map UWP.') ;~ If @error Then ContinueLoop ;~ NewControl("_Metro_CreateButtonCenter","Local $ButtonCn",$Data[1],int($WinPos[2]/2)-40,int($WinPos[3]/2)-13,29,29) ;~ Sleep($MetroDelayHoldButton) ;~ HoldControl($GuiControl[$ControlCount][0]) ;~ $ControlCount+=1 ;~ Case $bMetroButtonRight ;~ If $ControlCount = $MaxControls Then ContinueLoop ;~ $WinPos = WinGetPos(GetCanvas()) ;~ Local $Data = AskForControlText('Pick an icon from the font "Segoe MDL2 Assets" on "Character Map UWP.') ;~ If @error Then ContinueLoop ;~ NewControl("_Metro_CreateButtonRight","Local $ButtonRt",$Data[1],int($WinPos[2]/2)-40,int($WinPos[3]/2)-13,29,29) ;~ Sleep($MetroDelayHoldButton) ;~ HoldControl($GuiControl[$ControlCount][0]) ;~ $ControlCount+=1 Case $bMetroButtonMultipartMenu If $ControlCount = $MaxControls Then ContinueLoop $WinPos = WinGetPos(GetCanvas()) Local $Pick = DisplayButtons("Multipart", $Toolbox,$bMetroButtonMultipartMenu,True) If @error Then GUISwitch(GetCanvas()) ContinueLoop EndIf Local $Data = AskForControlText(-1,-1,87,0) If @error Then ContinueLoop Switch $Pick Case "Config1" NewControl("_Metro_CreateButtonLeft","Local $ButtonLr",$Data[1],20,20,$Data[0],29) $Selected = $GuiControl[$ControlCount-1][0] & "|" ; $ControlCount+=1 NewControl("_Metro_CreateButtonRight","Local $ButtonRr","",20+$Data[0],20,29,29) $Selected &= $GuiControl[$ControlCount-1][0] & "|" ; $ControlCount+=1 Sleep($MetroDelayHoldButton) HoldSelectedControls() Case "Config2" NewControl("_Metro_CreateButtonLeft","Local $ButtonLr",$Data[1],20,20,$Data[0],29) $Selected = $GuiControl[$ControlCount-1][0] & "|" ; $ControlCount+=1 NewControl("_Metro_CreateButtonCenter","Local $ButtonLc","",20+$Data[0],20,29,29) $Selected &= $GuiControl[$ControlCount-1][0] & "|" ; $ControlCount+=1 NewControl("_Metro_CreateButtonRight","Local $ButtonLr","",20+$Data[0]+29,20,29,29) $Selected &= $GuiControl[$ControlCount-1][0] & "|" ; $ControlCount+=1 Sleep($MetroDelayHoldButton) HoldSelectedControls() Case "Config3" Local $Width = $Data[0]<87 ? 87 : $Data[0] NewControl("_Metro_CreateButtonFlat","Local $ButtonFl",$Data[1],int($WinPos[2]/2)-40,int($WinPos[3]/2)-13,$Width,29) Sleep($MetroDelayHoldButton) HoldControl($GuiControl[$ControlCount][0]) ; $ControlCount+=1 EndSwitch Case $bMetroButtonStealth If $ControlCount = $MaxControls Then ContinueLoop $WinPos = WinGetPos(GetCanvas()) Local $Data = AskForControlText() If @error Then ContinueLoop NewControl("_Metro_CreateButtonStealth","Local $ButtonSe",$Data[1],int($WinPos[2]/2)-40,int($WinPos[3]/2)-13,$Data[0],29) Sleep($MetroDelayHoldButton) HoldControl($GuiControl[$ControlCount][0]) ; $ControlCount+=1 Case $bMetroButtonWindows11 If $ControlCount = $MaxControls Then ContinueLoop $WinPos = WinGetPos(GetCanvas()) Local $Data = AskForControlText() If @error Then ContinueLoop NewControl("_Metro_CreateButtonWindow11","Local $ButtonWe",$Data[1],int($WinPos[2]/2)-40,int($WinPos[3]/2)-13,$Data[0],29) Sleep($MetroDelayHoldButton) HoldControl($GuiControl[$ControlCount][0]) ; $ControlCount+=1 Case $bMetroButtonStealthIconRound If $ControlCount = $MaxControls Then ContinueLoop $WinPos = WinGetPos(GetCanvas()) Local $Data = AskForControlText('Pick an icon from the font "Segoe MDL2 Assets" on "Character Map UWP.') If @error Then ContinueLoop NewControl("_Metro_CreateButtonIconStealth","Local $ButtonRs",$Data[1],int($WinPos[2]/2)-40,int($WinPos[3]/2)-13,32,32) Sleep($MetroDelayHoldButton) HoldControl($GuiControl[$ControlCount][0]) ; $ControlCount+=1 Case $bMetroButtonRound If $ControlCount = $MaxControls Then ContinueLoop $WinPos = WinGetPos(GetCanvas()) Local $Data = AskForControlText('Pick an icon from the font "Segoe MDL2 Assets" on "Character Map UWP.') If @error Then ContinueLoop NewControl("_Metro_CreateButtonIconRound","Local $ButtonRn",$Data[1],int($WinPos[2]/2)-40,int($WinPos[3]/2)-13,32,32) Sleep($MetroDelayHoldButton) HoldControl($GuiControl[$ControlCount][0]) ; $ControlCount+=1 Case $bMetroInputbox If $ControlCount = $MaxControls Then ContinueLoop $WinPos = WinGetPos(GetCanvas()) Local $Data = AskForControlText("Enter text to size the Inputbox to the correct input size.") If @error Then ContinueLoop NewControl("_Metro_CreateInput_Wrapper","Local $InputEx",$Data[1],int($WinPos[2]/2)-40,int($WinPos[3]/2)-13,$Data[0],29) Sleep($MetroDelayHoldButton) HoldControl($GuiControl[$ControlCount][0]) ; $ControlCount+=1 ;~ Case $bMetroMenuStrip ;~ If $ControlCount = $MaxControls Then ContinueLoop ;~ $WinPos = WinGetPos(GetCanvas()) ;~ NewControl("_Metro_CreateMenuStrip","Local $MenuStrip","",int($WinPos[2]/2)-40,int($WinPos[3]/2)-13,$WinPos[2]-8,32) ;~ Sleep($MetroDelayHoldButton) ;~ HoldControl($GuiControl[$ControlCount][0]) ;~ $ControlCount+=1 ;~ Case $bMetroMenuButton ;~ If $ControlCount = $MaxControls Then ContinueLoop ;~ $WinPos = WinGetPos(GetCanvas()) ;~ Local $Data = AskForControlText() ;~ If @error Then ContinueLoop ;~ NewControl("_Metro_CreateMenuButton","Local $MenuButton",$Data[1],int($WinPos[2]/2)-40,int($WinPos[3]/2)-13,$Data[0],28) ;~ Sleep($MetroDelayHoldButton) ;~ HoldControl($GuiControl[$ControlCount][0]) ;~ $ControlCount+=1 ;~ Case $bMetroMenuIcon ;~ If $ControlCount = $MaxControls Then ContinueLoop ;~ $WinPos = WinGetPos(GetCanvas()) ;~ Local $Data = AskForControlText('Pick an icon from the font "Segoe MDL2 Assets" on "Character Map UWP.') ;~ If @error Then ContinueLoop ;~ NewControl("_Metro_CreateMenuButtonIcon","Local $MenuIcon",$Data[1],int($WinPos[2]/2)-40,int($WinPos[3]/2)-13,28,28) ;~ Sleep($MetroDelayHoldButton) ;~ HoldControl($GuiControl[$ControlCount][0]) ;~ $ControlCount+=1 Case $bMetroWindows11OnOff If $ControlCount = $MaxControls Then ContinueLoop $WinPos = WinGetPos(GetCanvas()) Local $Data = AskForControlText('Enter the text, the pipe is required.',"On|Off",-1,46) If @error Then ContinueLoop NewControl("_Metro_CreateWindows11OnOff","Local $OnOffWe",$Data[1],int($WinPos[2]/2)-40,int($WinPos[3]/2)-13,$Data[0],28) Sleep($MetroDelayHoldButton) HoldControl($GuiControl[$ControlCount][0]) ; $ControlCount+=1 Case $bMetroUnderlinedGroup If $ControlCount = $MaxControls Then ContinueLoop $WinPos = WinGetPos(GetCanvas()) NewControl("_Metro_CreateUnderlinedRoundedRectangle","Local $GroupEx2","",int($WinPos[2]/2)-40,int($WinPos[3]/2)-13,240,120) Sleep($MetroDelayHoldButton) HoldControl($GuiControl[$ControlCount][0]) ; $ControlCount+=1 Case $bMetroButtonAddHSeperator If $ControlCount = $MaxControls Then ContinueLoop $WinPos = WinGetPos(GetCanvas()) NewControl("_Metro_AddHSeperator_Wrapper","Local $HSeperator","Dummy",int($WinPos[2]/2)-40,int($WinPos[3]/2)-13,200,2) Sleep($MetroDelayHoldButton) HoldControl($GuiControl[$ControlCount][0]) ; $ControlCount+=1 Case $bMetroButtonAddVSeperator If $ControlCount = $MaxControls Then ContinueLoop $WinPos = WinGetPos(GetCanvas()) NewControl("_Metro_AddVSeperator_Wrapper","Local $VSeperator","Dummy",int($WinPos[2]/2)-40,int($WinPos[3]/2)-13,24,2) Sleep($MetroDelayHoldButton) HoldControl($GuiControl[$ControlCount][0]) ; $ControlCount+=1 Case $METRO_FULLSCREEN_BUTTON, $METRO_FSRestore_BUTTON Case $METRO_MENU_BUTTON ;Create an Array containing menu button names Local $MenuButtonsArray[5] = ["Themes Demo", "Settings", "About", "Contact", "Exit"] ; Open the metro Menu. See decleration of $MenuButtonsArray above. Local $MenuSelect = _Metro_MenuStart(GetCanvas(), 150, $MenuButtonsArray) Switch $MenuSelect ;Above function returns the index number of the selected button from the provided buttons array. Case "0" ConsoleWrite("Returned 0 = Starting themes demo. Please note that the window border colors are not updated during this demo." & @CRLF) Case "1" ConsoleWrite("Returned 1 = Settings button clicked." & @CRLF) Case "2" ConsoleWrite("Returned 2 = About button clicked." & @CRLF) Case "3" ConsoleWrite("Returned 3 = Contact button clicked." & @CRLF) Case "4" ConsoleWrite("Returned 4 = Exit button clicked." & @CRLF) _Metro_GUIDelete(GetCanvas()) Exit EndSwitch Case $METRO_MAXIMIZE_BUTTON GUISetState(@SW_MAXIMIZE,GetCanvas()) Case $GUI_EVENT_MINIMIZE, $METRO_MINIMIZE_BUTTON GUISetState(@SW_MINIMIZE,$ToolBox) GUISetState(@SW_MINIMIZE,$ControlWindow) GUISetState(@SW_MINIMIZE,GetCanvas()) Case $GUI_EVENT_RESTORE, $METRO_RESTORE_BUTTON GUISetState(@SW_RESTORE,$ToolBox) GUISetState(@SW_RESTORE,$ControlWindow) GUISetState(@SW_RESTORE, GetCanvas()) ; //////////////////////////////////////////////////////////////////////////// NEW GUIDES //////////////////////////////////////////////////////////////////////////// Case $GUI_EVENT_SECONDARYDOWN ; Right click remove Guideline GUISetCursor(2,1) ; Blindly set cursor to Arrow. Cursor is sometimes not returned to Arrow after Guide drop. $hGUI = WinActive("[ACTIVE]") If $hGUI = $ControlWindow Or $hGUI = $ToolBox Then ContinueLoop $cInfo = GUIGetCursorInfo($hGUI) If Not IsArray($cInfo) Then ContinueLoop $Control = int($cInfo[4]) For $i=0 To $GuideCount-1 If $GuiGuide[$i] = $Control Then GUICtrlSetState($Control,$GUI_HIDE) ConsoleWrite("+> Write Undo" & @CRLF) _ArrayPush($GuiUndo,"GUICtrlSetState(" & $Control & ",$GUI_SHOW)",1) ExitLoop ; Run code one time EndIf Next Case $GUI_EVENT_PRIMARYDOWN If $IgnoreMouseDown Then ContinueLoop $hGUI = WinActive("[ACTIVE]") If $hGUI = $ControlWindow Or $hGUI = $ToolBox Then ContinueLoop $cInfo = GUIGetCursorInfo($hGUI) If Not IsArray($cInfo) Then ContinueLoop If CheckDoubleClick($hGUI, $cInfo[4]) Then Local $idx = GetIndexForGUICtrl($cInfo[4]) If $idx=-1 Then ContinueLoop EndIf ControlPropertiesDialog($GuiControl[$idx][0], $GuiControl[$idx][1]) RefreshSelectionRectangle() ContinueLoop EndIf If Not $BorderGuidesAreDisabled And $cInfo[4] <> $GuiWindow[$GuiInFocus][1] And $cInfo[4] <> $GuiWindow[$GuiInFocus][2] And $cInfo[4] <> $GuiWindow[$GuiInFocus][3] Then ;And $cInfo[4] <> $GuiWindow[$GuiInFocus][5] And $cInfo[4] <> $GuiWindow[$GuiInFocus][6] And $cInfo[4] <> $GuiWindow[$GuiInFocus][7] And $cInfo[4] <> $GuiWindow[$GuiInFocus][8] Then $Threshold = 5 Select Case $cInfo[0] >= 2 And $cInfo[0] < $Threshold And $cInfo[1] > $Threshold If $GuideCount = $MaxGuides Then ContinueLoop ; Vertical Guide $GuiGuide[$GuideCount] = GUICtrlCreateLabel("",$Threshold,0,2,@DesktopHeight) GUICtrlSetBkColor(-1, $COLOR_AQUA) GUICtrlSetTip(-1, "Click or drag to edit Guide.") HoldGuide($GuiGuide[$GuideCount],0) ConsoleWrite("+> Write Undo" & @CRLF) _ArrayPush($GuiUndo,"GUICtrlSetState(" & int($GuiGuide[$GuideCount]) & ",$GUI_HIDE)",1) $GuideCount+=1 ConsoleWrite("New Vertical Guide" & @CRLF) ContinueLoop Case $cInfo[1] >= 2 And $cInfo[1] < $Threshold And $cInfo[0] > $Threshold And $cInfo[1] > 0 If $GuideCount = $MaxGuides Then ContinueLoop ; Horizontal Guide $GuiGuide[$GuideCount] = GUICtrlCreateLabel("",0,$Threshold,@DesktopWidth,2) GUICtrlSetBkColor(-1, $COLOR_AQUA) GUICtrlSetTip(-1, "Click or drag to edit Guide.") HoldGuide($GuiGuide[$GuideCount],1) ConsoleWrite("+> Write Undo" & @CRLF) _ArrayPush($GuiUndo,"GUICtrlSetState(" & int($GuiGuide[$GuideCount]) & ",$GUI_HIDE)",1) $GuideCount+=1 ConsoleWrite("New Horizontal Guide" & @CRLF) ContinueLoop Case $cInfo[0] >= 2 And $cInfo[1] >= 2 And $cInfo[0] < $Threshold And $cInfo[1] < $Threshold ConsoleWrite(">Corner click" & @CRLF) EndSelect EndIf ;~ If InRectangleBounds($cInfo[0],$cInfo[1],11,11,@DesktopWidth,32) Then ; Drag GUI if in bounds ;~ dllcall("user32.dll","int","SendMessage","hWnd", $hGui,"int",$WM_NCLBUTTONDOWN,"int", $HTCAPTION,"int", 0) ;~ EndIf $iControl = $cInfo[4] If $iControl = $FileDropArea Then $Selected = "" EndIf $Control = StringSplit($Selected,"|") ; ///////////////////////////////////////////////////// IF A SELECTION BOX IS DRAWN ////////////////////////////////////////////////////////////////////////////////////////// If $iControl = $GuiWindow[$GuiInFocus][1] And $Control[0]-1 = 1 Then $Backup = $Selected ClearSelectionRectangle("-> Start upper left anchor drag") GUISetCursor(12,1) Local $idx = GetIndexForGUICtrl($Control[1]) If $idx = -1 Then ContinueLoop Local $cPos = ControlGetPos($hGUI,"",$GuiControl[$idx][0]) Local $MouseDown = 0 Do $cInfo = GUIGetCursorInfo(WinActive("[ACTIVE]")) If @error Then ; LogToConsole("!>GUIGetCursorInfo Error Ln.: " & @ScriptLineNumber) ContinueLoop EndIf ;~ $mPos = GUIGetCursorInfo(WinActive("[ACTIVE]")) ;~ If Not @error Then ; $mPos -> $CurrPosM = $cInfo[0] & "" & $cInfo[1] If $CurrPosM <> $LastPosM And TimerDiff($Timer) > 10 Then ToolTip($cInfo[0] & "," & $cInfo[1]) ;DrawGuideLines($iControl) GUICtrlSetPos($GuiControl[$idx][0],$cInfo[0],$cInfo[1],$cPos[0]+$cPos[2]-$cInfo[0],$cPos[1]+$cPos[3]-$cInfo[1]) $Timer = TimerInit() EndIf $LastPosM = $CurrPosM ;~ EndIf $MouseDown = $cInfo[2] Until Not $MouseDown GUISetCursor(2,1) ToolTip("") ConsoleWrite("+> Write Undo" & @CRLF) _ArrayPush($GuiUndo,"GUICtrlSetPos(" & $GuiControl[$idx][0] & "," & $cPos[0] & "," & $cPos[1] & "," & $cPos[2] & "," & $cPos[3] & ")",1) _WinAPI_RedrawWindow($hGUI) $Selected = $Backup DrawSelectionRectangle() $GuiHasChanges = True ElseIf $iControl = $GuiWindow[$GuiInFocus][2] And $Control[0]-1 = 1 Then $Backup = $Selected ClearSelectionRectangle("-> Start lower right anchor drag") GUISetCursor(12,1) Local $idx = GetIndexForGUICtrl($Control[1]) If $idx = -1 Then ContinueLoop Local $cPos = ControlGetPos($hGUI,"",$GuiControl[$idx][0]) Local $MouseDown = 0 Do $cInfo = GUIGetCursorInfo(WinActive("[ACTIVE]")) If @error Then ; LogToConsole("!>GUIGetCursorInfo Error Ln.: " & @ScriptLineNumber) ContinueLoop EndIf $mPos = GUIGetCursorInfo(WinActive("[ACTIVE]")) ; Double call to GUIGetCursorInfo If Not @error Then $CurrPosM = $mPos[0] & "," & $mPos[1] If $CurrPosM <> $LastPosM And TimerDiff($Timer) > 10 Then ToolTip($mPos[0] & "," & $mPos[1]) ;DrawGuideLines($iControl) GUICtrlSetPos($GuiControl[$idx][0],$cPos[0],$cPos[1],$mPos[0]-$cPos[0],$mPos[1]-$cPos[1]) $Timer = TimerInit() EndIf $LastPosM = $CurrPosM EndIf $MouseDown = $cInfo[2] Until Not $MouseDown GUISetCursor(2,1) ConsoleWrite("+> Write Undo" & @CRLF) _ArrayPush($GuiUndo,"GUICtrlSetPos(" & $GuiControl[$idx][0] & "," & $cPos[0] & "," & $cPos[1] & "," & $cPos[2] & "," & $cPos[3] & ")",1) ToolTip("") _WinAPI_RedrawWindow($hGUI) $Selected = $Backup DrawSelectionRectangle() $GuiHasChanges = True ElseIf $iControl = $GuiWindow[$GuiInFocus][5] And $Control[0]-1 = 1 Then $Backup = $Selected ClearSelectionRectangle("-> Start Right Horizontal anchor drag") GUISetCursor(13,1) Local $idx = GetIndexForGUICtrl($Control[1]) If $idx = -1 Then ContinueLoop Local $cPos = ControlGetPos($hGUI,"",$GuiControl[$idx][0]) Local $MouseDown = 0 Do $cInfo = GUIGetCursorInfo(WinActive("[ACTIVE]")) If @error Then ; LogToConsole("!>GUIGetCursorInfo Error Ln.: " & @ScriptLineNumber) ContinueLoop EndIf $mPos = GUIGetCursorInfo(WinActive("[ACTIVE]")) If Not @error Then $CurrPosM = $mPos[0] & "," & $mPos[1] If $CurrPosM <> $LastPosM And TimerDiff($Timer) > 10 Then ToolTip($mPos[0] & "," & $mPos[1]) GUICtrlSetPos($GuiControl[$idx][0],$cPos[0],$cPos[1],$mPos[0]-$cPos[0],$cPos[3]) $Timer = TimerInit() EndIf $LastPosM = $CurrPosM EndIf $MouseDown = $cInfo[2] Until Not $MouseDown ToolTip("") GUISetCursor(2,1) ConsoleWrite("+> Write Undo" & @CRLF) _ArrayPush($GuiUndo,"GUICtrlSetPos(" & $GuiControl[$idx][0] & "," & $cPos[0] & "," & $cPos[1] & "," & $cPos[2] & "," & $cPos[3] & ")",1) _WinAPI_RedrawWindow($hGUI) $Selected = $Backup DrawSelectionRectangle() $GuiHasChanges = True ElseIf $iControl = $GuiWindow[$GuiInFocus][6] And $Control[0]-1 = 1 Then $Backup = $Selected ClearSelectionRectangle("-> Start Right Horizontal anchor drag") GUISetCursor(11,1) Local $idx = GetIndexForGUICtrl($Control[1]) If $idx = -1 Then ContinueLoop Local $cPos = ControlGetPos($hGUI,"",$GuiControl[$idx][0]) Local $MouseDown = 0 Do $cInfo = GUIGetCursorInfo(WinActive("[ACTIVE]")) If @error Then ; LogToConsole("!>GUIGetCursorInfo Error Ln.: " & @ScriptLineNumber) ContinueLoop EndIf $mPos = GUIGetCursorInfo(WinActive("[ACTIVE]")) If Not @error Then $CurrPosM = $mPos[0] & "," & $mPos[1] If $CurrPosM <> $LastPosM And TimerDiff($Timer) > 10 Then ToolTip($mPos[0] & "," & $mPos[1]) GUICtrlSetPos($GuiControl[$idx][0],$cPos[0],$cPos[1],$cPos[2],$mPos[1]-$cPos[1]) $Timer = TimerInit() EndIf $LastPosM = $CurrPosM EndIf $MouseDown = $cInfo[2] Until Not $MouseDown ToolTip("") GUISetCursor(2,1) ConsoleWrite("+> Write Undo" & @CRLF) _ArrayPush($GuiUndo,"GUICtrlSetPos(" & $GuiControl[$idx][0] & "," & $cPos[0] & "," & $cPos[1] & "," & $cPos[2] & "," & $cPos[3] & ")",1) _WinAPI_RedrawWindow($hGUI) $Selected = $Backup DrawSelectionRectangle() $GuiHasChanges = True ElseIf $iControl = $GuiWindow[$GuiInFocus][7] And $Control[0]-1 = 1 Then $Backup = $Selected ClearSelectionRectangle("-> Start Top Vertical anchor drag") GUISetCursor(0,1) Local $idx = GetIndexForGUICtrl($Control[1]) If $idx = -1 Then ContinueLoop Local $cPos = ControlGetPos($hGUI,"",$GuiControl[$idx][0]) Local $MouseDown = 0 Do $cInfo = GUIGetCursorInfo(WinActive("[ACTIVE]")) If @error Then ; LogToConsole("!>GUIGetCursorInfo Error Ln.: " & @ScriptLineNumber) ContinueLoop EndIf $mPos = GUIGetCursorInfo(WinActive("[ACTIVE]")) If Not @error Then $CurrPosM = $mPos[0] & "," & $mPos[1] If $CurrPosM <> $LastPosM And TimerDiff($Timer) > 10 Then ToolTip($mPos[0] & "," & $mPos[1]) GUICtrlSetPos($GuiControl[$idx][0],$cPos[0],$mPos[1],$cPos[2],$cPos[3]) $Timer = TimerInit() EndIf $LastPosM = $CurrPosM EndIf $MouseDown = $cInfo[2] Until Not $MouseDown ToolTip("") GUISetCursor(2,1) ConsoleWrite("+> Write Undo" & @CRLF) _ArrayPush($GuiUndo,"GUICtrlSetPos(" & $GuiControl[$idx][0] & "," & $cPos[0] & "," & $cPos[1] & "," & $cPos[2] & "," & $cPos[3] & ")",1) _WinAPI_RedrawWindow($hGUI) $Selected = $Backup DrawSelectionRectangle() $GuiHasChanges = True ElseIf $iControl = $GuiWindow[$GuiInFocus][8] And $Control[0]-1 = 1 Then $Backup = $Selected ClearSelectionRectangle("-> Start Left Horizontal anchor drag") GUISetCursor(0,1) Local $idx = GetIndexForGUICtrl($Control[1]) If $idx = -1 Then ContinueLoop Local $cPos = ControlGetPos($hGUI,"",$GuiControl[$idx][0]) Local $MouseDown = 0 Do $cInfo = GUIGetCursorInfo(WinActive("[ACTIVE]")) If @error Then ; LogToConsole("!>GUIGetCursorInfo Error Ln.: " & @ScriptLineNumber) ContinueLoop EndIf $mPos = GUIGetCursorInfo(WinActive("[ACTIVE]")) If Not @error Then $CurrPosM = $mPos[0] & "," & $mPos[1] If $CurrPosM <> $LastPosM And TimerDiff($Timer) > 10 Then ToolTip($mPos[0] & "," & $mPos[1]) GUICtrlSetPos($GuiControl[$idx][0],$mPos[0],$cPos[1],$cPos[2],$cPos[3]) $Timer = TimerInit() EndIf $LastPosM = $CurrPosM EndIf $MouseDown = $cInfo[2] Until Not $MouseDown ToolTip("") GUISetCursor(2,1) ConsoleWrite("+> Write Undo" & @CRLF) _ArrayPush($GuiUndo,"GUICtrlSetPos(" & $GuiControl[$idx][0] & "," & $cPos[0] & "," & $cPos[1] & "," & $cPos[2] & "," & $cPos[3] & ")",1) _WinAPI_RedrawWindow($hGUI) $Selected = $Backup DrawSelectionRectangle() $GuiHasChanges = True ElseIf $iControl <> 0 And $Control[0]-1 > 1 And _ $iControl <> $METRO_MAXIMIZE_BUTTON And $iControl <> $METRO_RESTORE_BUTTON And _ $iControl <> $METRO_MINIMIZE_BUTTON And $iControl <> $METRO_FULLSCREEN_BUTTON And _ $iControl <> $METRO_FSRestore_BUTTON And $iControl <> $METRO_MENU_BUTTON And _ $iControl <> $METRO_CLOSE_BUTTON And _ $iControl <> $GuiWindow[$GuiInFocus][0] And $iControl <> $GuiWindow[$GuiInFocus][1] And _ $iControl <> $GuiWindow[$GuiInFocus][2] And $iControl <> $GuiWindow[$GuiInFocus][3] And _ $iControl <> $GuiWindow[$GuiInFocus][5] And $iControl <> $GuiWindow[$GuiInFocus][6] And _ $iControl <> $GuiWindow[$GuiInFocus][7] And $iControl <> $GuiWindow[$GuiInFocus][8] And _ $iControl <> $GuiWindow[$GuiInFocus][13] And $iControl <> $GuiWindow[$GuiInFocus][14] And _ $iControl <> $GuiWindow[$GuiInFocus][15] And $iControl <> $GuiWindow[$GuiInFocus][16] And _ $iControl <> $GuiWindow[$GuiInFocus][17] Then ; ================================ Select Additional Control or Start-Drag ================================ #cs If $iControl And $iControl <> $FileDropArea And $iControl <> $METRO_CLOSE_BUTTON And _ $iControl <> $METRO_MAXIMIZE_BUTTON And $iControl <> $METRO_RESTORE_BUTTON And _ $iControl <> $METRO_MINIMIZE_BUTTON And $iControl <> $METRO_FULLSCREEN_BUTTON And _ $iControl <> $METRO_FSRestore_BUTTON And $iControl <> $METRO_MENU_BUTTON And _ $iControl <> $GuiWindow[$GuiInFocus][0] And $iControl <> $GuiWindow[$GuiInFocus][1] And _ $iControl <> $GuiWindow[$GuiInFocus][2] And $iControl <> $GuiWindow[$GuiInFocus][3] And _ $iControl <> $GuiWindow[$GuiInFocus][5] And $iControl <> $GuiWindow[$GuiInFocus][6] And _ $iControl <> $GuiWindow[$GuiInFocus][7] And $iControl <> $GuiWindow[$GuiInFocus][8] Then LogToConsole("->Abort New Selection because application control button pressed.") ContinueLoop EndIf #ce ; Select another control and prevent a control drag-n-drop If _IsPressed("11") Then $Selected &= $iControl & "|" DrawSelectionRectangle() ContinueLoop EndIf ; Prevent moving a group of controls with a control outside of the group $Control = StringSplit($Selected, "|") Local $FoundClickedControlInSelectedControls=False For $i = 1 To $Control[0]-1 If $iControl = $Control[$i] Then $FoundClickedControlInSelectedControls=True ExitLoop EndIf Next If Not $FoundClickedControlInSelectedControls Then ClearSelectionRectangle("Abort selection for another control") $Selected = $iControl & "|" RefreshSelectionRectangle() ContinueLoop EndIf $Backup = $Selected ClearSelectionRectangle("-> Start drag") GUISetCursor(9,1) ; Calculate Distance Apart from Leader Control $LeaderControl = ControlGetPos($hGUI, "", $iControl) Local $DistanceApart[$Control[0]][3] For $i=1 to $Control[0]-1 If int($Control[$i]) <> $iControl Then $FollowerControl = ControlGetPos($hGUI, "", int($Control[$i])) $DistanceApart[$i][0] = $FollowerControl[0] - $LeaderControl[0] $DistanceApart[$i][1] = $FollowerControl[1] - $LeaderControl[1] $DistanceApart[$i][2] = int($Control[$i]) Else $DistanceApart[$i][0] = 0 $DistanceApart[$i][1] = 0 $DistanceApart[$i][2] = $iControl ;& "*" EndIf Next For $i=1 to $Control[0]-1 If int($Control[$i]) <> $iControl Then ConsoleWrite("+> Write Undo" & @CRLF) _ArrayPush($GuiUndo,"GUICtrlSetPos(" & $DistanceApart[$i][2] & "," & $DistanceApart[$i][0] + $LeaderControl[0] & "," & $DistanceApart[$i][1] + $LeaderControl[1] & ")",1) Else ConsoleWrite("+> Write Undo" & @CRLF) _ArrayPush($GuiUndo,"GUICtrlSetPos(" & $DistanceApart[$i][2] & "," & $LeaderControl[0] & "," & $LeaderControl[1] & ")",1) EndIf Next $PointerCentered = True Do $CurrentControlPos = ControlGetPos($hGUI, "", $iControl) If $PointerCentered Then MouseMove($CurrentControlPos[0],$CurrentControlPos[1],0) $PointerCentered = False EndIf GUICtrlSetPos($iControl, $cInfo[0], $cInfo[1]) $mPos = GUIGetCursorInfo(WinActive("[ACTIVE]")) If Not @error Then $CurrPosM = $mPos[0] & "," & $mPos[1] If $CurrPosM <> $LastPosM And TimerDiff($Timer) > 250 Then ToolTip($mPos[0] & "," & $mPos[1]) If $Control[0] < 2 Then DrawGuideLines($iControl) $Timer = TimerInit() EndIf $LastPosM = $CurrPosM EndIf ; Move Follower Control with Leader Control For $i=1 to $Control[0]-1 If int($Control[$i]) <> $iControl Then $cInfo = GUIGetCursorInfo($hGUI) $FollowerControlPosX = $cInfo[0] + $DistanceApart[$i][0] $FollowerControlPosY = $cInfo[1] + $DistanceApart[$i][1] $CurrentControlPos = ControlGetPos($hGUI, "", int($Control[$i])) GUICtrlSetPos(int($Control[$i]), $FollowerControlPosX, $FollowerControlPosY) EndIf Next Until Not $cInfo[2] ToolTip("") _WinAPI_RedrawWindow($hGUI) $Selected = $Backup ClearGuides() GUISetCursor(2,1) ; Arrow DrawSelectionRectangle() $GuiHasChanges = True Else ; //////////////////////////////////////////////// IF NEW SINGLE CONTROL CLICK //////////////////////////////////////////////// If $iControl And $iControl <> $FileDropArea And $iControl <> $METRO_CLOSE_BUTTON And _ $iControl <> $METRO_MAXIMIZE_BUTTON And $iControl <> $METRO_RESTORE_BUTTON And _ $iControl <> $METRO_MINIMIZE_BUTTON And $iControl <> $METRO_FULLSCREEN_BUTTON And _ $iControl <> $METRO_FSRestore_BUTTON And $iControl <> $METRO_MENU_BUTTON And _ $iControl <> $GuiWindow[$GuiInFocus][0] And $iControl <> $GuiWindow[$GuiInFocus][1] And _ $iControl <> $GuiWindow[$GuiInFocus][2] And $iControl <> $GuiWindow[$GuiInFocus][3] And _ $iControl <> $GuiWindow[$GuiInFocus][5] And $iControl <> $GuiWindow[$GuiInFocus][6] Then ; Allow Metro Titlebar to move the GUI If $iControl = $GuiWindow[$GuiInFocus][13] Then DllCall("user32.dll", "int", "ReleaseCapture") DllCall("user32.dll", "long", "SendMessage", "hwnd", GetCanvas(), "int", 0x00A1, "int", 2, "int", 0) ContinueLoop EndIf If $iControl = $GuiWindow[$GuiInFocus][7] Then HoldSelectedControls("Vertical","MouseUp") LogToConsole("->Vertical control group Move") ContinueLoop ElseIf $iControl = $GuiWindow[$GuiInFocus][8] Then HoldSelectedControls("Horizontal","MouseUp") LogToConsole("->Horizontal control group move") ContinueLoop Else ; Select Ctrl or Guide movement EndIf ; If Control is a Guide lock the movement Local $TypeOfControlMovement = $ControlMove For $i=0 To $GuideCount-1 If $GuiGuide[$i] = $iControl Then Local $GuiPos = WinGetPos($hGUI) Local $CtrlSize = ControlGetPos($hGui,"",$iControl) If $CtrlSize[2] > $CtrlSize[3] Then LogToConsole("Horizontal Guide Move") $TypeOfControlMovement = $HorizontalGuideMove GUISetCursor(11,1) Else LogToConsole("Vertical Guide Move") $TypeOfControlMovement = $VerticalGuideMove GUISetCursor(13,1) EndIf $Timer = TimerInit() Do ; If quick GUIDE click $cInfo = GUIGetCursorInfo($hGUI) If Not $cInfo[2] Then GUISetCursor(2,1) ; Arrow ModifyGuideDialog($iControl,$TypeOfControlMovement) RefreshSelectionRectangle() ContinueLoop 3 ; Else Mouse is down, start Guide Drag EndIf Until TimerDiff($Timer) > 600 ExitLoop EndIf Next $Backup = $Selected ClearSelectionRectangle("Prepare for Control move or Click") If $TypeOfControlMovement = $ControlMove Then $Selected = $iControl & "|" Local $idx = GetIndexForGUICtrl($iControl) If $idx = -1 Then MsgBox(4096+16,$WindowTitle,"GetIndexForGUICtrl cannot find control. Ln.:" & @ScriptLineNumber) ContinueLoop EndIf Local $cPos = ControlGetPos($hGUI,"",$GuiControl[$idx][0]) $Timer = TimerInit() Do $cInfo = GUIGetCursorInfo($hGUI) If Not $cInfo[2] Then ConsoleWrite("Clicked on Control quickly" & @CRLF) If $idx <> -1 Then GUICtrlSetData($ControlWindowInputBox,$GuiControl[$idx][2]) If _IsPressed("11") Then ; Multiple control selection with CTRL key $Selected = $Backup & $iControl & "|" EndIf ; Faster exit for better double clicks, no Toolbar DrawSelectionRectangle(False) ContinueLoop 2 EndIf Until TimerDiff($Timer) > 600 ConsoleWrite("+> Write Undo" & @CRLF) _ArrayPush($GuiUndo,"GUICtrlSetPos(" & $GuiControl[$idx][0] & "," & $cPos[0] & "," & $cPos[1] & "," & $cPos[2] & "," & $cPos[3] & ")",1) GUISetCursor(3,1) ; Cross $GuiHasChanges = True EndIf $PointerCentered = True Local $Start[2] = [$cInfo[0],$cInfo[1]] Do $cInfo = GUIGetCursorInfo($hGUI) $CurrentControlPos = ControlGetPos($hGUI, "", $iControl) If $PointerCentered Then MouseMove($CurrentControlPos[0],$CurrentControlPos[1],0) $PointerCentered = False EndIf Switch $TypeOfControlMovement Case $VerticalGuideMove GUICtrlSetPos($iControl, $cInfo[0], 0) Case $HorizontalGuideMove GUICtrlSetPos($iControl, 0, $cInfo[1]) Case $ControlMove GUICtrlSetPos($iControl, $cInfo[0], $cInfo[1]) Case Else w("$TypeOfControlMovement Error: unknown movement type. Ln: " & @ScriptLineNumber) EndSwitch $CurrPosM = $cInfo[0] & "," & $cInfo[1] If $CurrPosM <> $LastPosM And TimerDiff($Timer) > 10 Then DrawGuideLines($iControl) $Timer = TimerInit() EndIf $LastPosM = $CurrPosM Until Not $cInfo[2] Local $Stop[2] = [$cInfo[0],$cInfo[1]] GUISetCursor(2,1) ; Arrow ToolTip("") ClearGuides() RefreshSelectionRectangle() $GuiHasChanges = True Else ; //////////////////////////////////////////////// CREATE NEW SELECTION //////////////////////////////////////////////// $GuiPos = WinGetPos($hGUI) $GuiClientSize = WinGetClientSize($hGUI) Local $ClientArea[4] = [$GuiPos[0]+$GuiPos[2]-$GuiClientSize[0],$GuiPos[1]+$GuiPos[3]-$GuiClientSize[1],$GuiClientSize[0],$GuiClientSize[1]] If Not InRectangleBounds($cInfo[0],$cInfo[1],0,0,$ClientArea[2],$ClientArea[3]) Then ContinueLoop ;ClearSelectionRectangle("Prepare for New Selection") GUICtrlSetState($GuiWindow[$GuiInFocus][0],BitOR($GUI_SHOW,$GUI_ONTOP)) ; Show Selection Rectangle Local $Start[2] = [$cInfo[0],$cInfo[1]] Do $cInfo = GUIGetCursorInfo($hGUI) $CurrPosM = $cInfo[0] & "," & $cInfo[1] If $CurrPosM <> $LastPosM And TimerDiff($Timer) > 10 Then Select Case $Start[0] > $cInfo[0] And $cInfo[1] > $Start[1] ; Right Top to Bottom GUICtrlSetPos($GuiWindow[$GuiInFocus][0],$cInfo[0],$Start[1],$Start[0]-$cInfo[0],$cInfo[1]-$Start[1]) Case $Start[0] < $cInfo[0] And $cInfo[1] < $Start[1] ; Left Bottom to Top GUICtrlSetPos($GuiWindow[$GuiInFocus][0],$Start[0],$cInfo[1],$cInfo[0]-$Start[0],$Start[1]-$cInfo[1]) Case $cInfo[0] < $Start[0] And $cInfo[1] < $Start[1] ; Right Bottom to Top GUICtrlSetPos($GuiWindow[$GuiInFocus][0],$cInfo[0],$cInfo[1],$Start[0]-$cInfo[0],$Start[1]-$cInfo[1]) Case Else ; Left Top to Bottom GUICtrlSetPos($GuiWindow[$GuiInFocus][0],$Start[0],$Start[1],$cInfo[0]-$Start[0],$cInfo[1]-$Start[1]) EndSelect _WinAPI_RedrawWindow($hGUI) $Timer = TimerInit() EndIf $LastPosM = $CurrPosM Until Not $cInfo[2] Local $Stop[2] = [$cInfo[0],$cInfo[1]] If $Start[0] <> $Stop[0] and _ $Start[1] <> $Stop[1] Then Select Case $Start[0] > $Stop[0] And $Stop[1] > $Start[1] $StartX = $Start[0] $Start[0] = $Stop[0] $Stop[0] = $StartX Case $Start[0] < $Stop[0] And $Stop[1] < $Start[1] $StartY = $Start[1] $Start[1] = $Stop[1] $Stop[1] = $StartY Case $Stop[0] < $Start[0] And $Stop[1] < $Start[1] $Coords = $Start $Start = $Stop $Stop = $Coords EndSelect $NothingInSelectionRectangle=True $Selected = "" For $i=0 to $ControlCount-1 If ControlIsDeleted($GuiControl[$i][0]) Then ContinueLoop ; SKIP DELETED CONTROLS $aPos = ControlGetPos($hGUI, "", $GuiControl[$i][0]) If @error Then ConsoleWrite("!> New selection error -> Failed to get position for Control: " & $GuiControl[$i][0] & ". Ln#: " & @ScriptLineNumber & @CRLF) ContinueLoop EndIf If $aPos[0] > $Start[0] And $aPos[0] + $aPos[2] < $Stop[0] And _ $aPos[1] > $Start[1] And $aPos[1] + $aPos[3] < $Stop[1] Then $Selected = $Selected & $GuiControl[$i][0] & "|" $NothingInSelectionRectangle=False EndIf Next RefreshSelectionRectangle() Else ClearSelectionRectangle("No selection made") EndIf EndIf EndIf ;~ ConsoleWrite("!> GUISetCursor to Arrow" & @CRLF) ;~ GUISetCursor(2,1) EndSwitch WEnd ; Delete possible Metrobuttons or window _Metro_GUIDelete(GetCanvas()) _Metro_GUIDelete($ToolBox) GUIDelete($ControlWindow) ; If multiple windows at one time was ever implemented For $i=0 to $WindowCount-1 GUIDelete($GuiWindow[$i][4]) Next EndFunc ; MAIN ; //////////////////////////////////////////////////////////////////////////// FUNCTIONS //////////////////////////////////////////////////////////////////////////// Func ControlGetState($hWnd, $ControlId) Dim $lControlState[2],$lState $lState = ControlCommand($hWnd, "", $ControlId, "IsVisible", "") If @error Then Return SetError(1,0,False) $lControlState[0] = $lState $lState = ControlCommand($hWnd, "", $ControlId, "IsEnabled", "") If @error Then Return SetError(2,0,False) $lControlState[1] = $lState Return $lControlState EndFunc ;==>ControlGetState Func ControlIsDeleted($ControlID) Local $hWnd=GetCanvas() Local $aState = ControlGetState($hWnd, $ControlId) If @error Then Return SetError(@error,0,False) Return (Not $aState[0]) ? True : False EndFunc ;==>ControlIsDeleted Func CheckDoubleClick($hGUI, $iControlID) Local $cInfo = GUIGetCursorInfo($hGUI) If Not $cInfo[2] Then Return False Local Static $LastXY = "" Local $CurrXY = $cInfo[0] & "," & $cInfo[1] Local $iNow = TimerInit() Local $iElapsed = TimerDiff($g_iLastClickTime) If $iElapsed < 400 And $g_iLastControlID = $iControlID Then $g_iLastClickTime = 0 $g_iLastControlID = -1 Return True ElseIf $LastXY=$CurrXY Then GUICtrlSendToDummy($GuiDoubleClicked) EndIf $LastXY = $CurrXY $g_iLastClickTime = $iNow $g_iLastControlID = $iControlID Return False EndFunc Func GetDefaultGUIFont() Local $hWnd = GUICreate("", 1, 1) Local $idCtrl = GUICtrlCreateLabel("", 0, 0, 1, 1) Local $hCtrl = GUICtrlGetHandle($idCtrl) Local $hFont = _SendMessage($hCtrl, 0x31) ; WM_GETFONT If Not $hFont Then Return SetError(1, 0, "") Local $tagLOGFONT = "struct;long lfHeight;long lfWidth;long lfEscapement;long lfOrientation;" & _ "long lfWeight;byte lfItalic;byte lfUnderline;byte lfStrikeOut;" & _ "byte lfCharSet;byte lfOutPrecision;byte lfClipPrecision;byte lfQuality;" & _ "byte lfPitchAndFamily;wchar lfFaceName[32];endstruct" Local $tFont = DllStructCreate($tagLOGFONT) DllCall("gdi32.dll", "int", "GetObjectW", "handle", $hFont, "int", DllStructGetSize($tFont), "ptr", DllStructGetPtr($tFont)) GUIDelete($hWnd) Local $aRet[] = [DllStructGetData($tFont, "lfFaceName"),Abs(DllStructGetData($tFont, "lfHeight"))] Return $aRet EndFunc Func ChangeFontColor($ControlID,$ForgroundColor=-1,$BackgroundColor=-1) Local $idx = $ControlCount If $GuiControl[$idx][0] <> $ControlID Then MsgBox(4096+48, $WindowTitle, "This function is only to be used immediately after control creation.") Return SetError(1,0,False) EndIf If $ForgroundColor=-1 And $BackgroundColor=-1 Then Return SetError(2,0,False) EndIf If $ForgroundColor <> -1 Then GUICtrlSetColor($ControlID,$ForgroundColor) $GuiControl[$idx][5] = StringRegExpReplace($GuiControl[$idx][5],"(?Ui)GUICtrlSetColor.*♫","") ; Remove previous color setting $GuiControl[$idx][5] &= 'GUICtrlSetColor(-1,' & $ForgroundColor & ')' & '♫' EndIf If $BackgroundColor <> -1 Then GUICtrlSetBkColor($ControlID,$BackgroundColor) $GuiControl[$idx][5] = StringRegExpReplace($GuiControl[$idx][5],"(?Ui)GUICtrlSetBkColor*♫","") ; Remove previous color setting $GuiControl[$idx][5] &= 'GUICtrlSetBkColor(-1,' & $BackgroundColor & ')' & '♫' EndIf $GuiHasChanges = True EndFunc Func AskForControlText($Prompt = -1, $Default = -1, $MinimumWidth = -1, $GraphicWidth = -1, $NoPrompt=False) If $Prompt = -1 Then $Prompt = "Enter the control's text." If $Default = -1 Then $Default = "" If $MinimumWidth = -1 Then $MinimumWidth = 87 If $GraphicWidth = -1 Then $GraphicWidth = 0 If $NoPrompt Then $Text = $Default Else WinSetTrans(GetCanvas(), "", 230) ; For better visibility of the MsgBox on top of the GUI. Local $Text = _Metro_Inputbox($Prompt, 11, $Default, False, True, GetCanvas()) If @error Then WinSetTrans(GetCanvas(), "", 255) Return SetError(1, 0, False) EndIf WinSetTrans(GetCanvas(), "", 255) EndIf Local $FRect = _StringSize($Text, 10, 400, 0, "Arial") If @error Then Return SetError(2, 0, False) Local $ErrorCorrection=40 Local $BaseWidth = $FRect[2] + $ErrorCorrection If $BaseWidth < $MinimumWidth Then $BaseWidth = $MinimumWidth If $GraphicWidth > 0 Then $BaseWidth += $GraphicWidth If Not $NoPrompt Then GUISetState(@SW_SHOWNORMAL, GetCanvas()) $GuiControl[$ControlCount][6] = $Text ; Save text for GenerateCode() EndIf Local $aRet[] = [$BaseWidth, $Text] Return $aRet EndFunc Func CalculateControlWidth($Text, $MinimumWidth = -1, $GraphicWidth = -1) Local $aRet = AskForControlText(-1,$Text,$MinimumWidth,$GraphicWidth,True) If @error Then Return SetError(@error,0,False) Return $aRet EndFunc Func GetCanvas() Return $GuiWindow[$GuiInFocus][4] EndFunc Func GetClosestDistance($ctrl1X, $ctrl1Y, $ctrl1Width, $ctrl1Height, $ctrl2X, $ctrl2Y, $ctrl2Width, $ctrl2Height) ; Calculate the edges of the first control Local $ctrl1Left = $ctrl1X Local $ctrl1Right = $ctrl1X + $ctrl1Width Local $ctrl1Top = $ctrl1Y Local $ctrl1Bottom = $ctrl1Y + $ctrl1Height ; Calculate the edges of the second control Local $ctrl2Left = $ctrl2X Local $ctrl2Right = $ctrl2X + $ctrl2Width Local $ctrl2Top = $ctrl2Y Local $ctrl2Bottom = $ctrl2Y + $ctrl2Height ; Calculate the horizontal distance Local $hDistance If $ctrl1Right < $ctrl2Left Then $hDistance = $ctrl2Left - $ctrl1Right ElseIf $ctrl2Right < $ctrl1Left Then $hDistance = $ctrl1Left - $ctrl2Right Else $hDistance = 0 EndIf ; Calculate the vertical distance Local $vDistance If $ctrl1Bottom < $ctrl2Top Then $vDistance = $ctrl2Top - $ctrl1Bottom ElseIf $ctrl2Bottom < $ctrl1Top Then $vDistance = $ctrl1Top - $ctrl2Bottom Else $vDistance = 0 EndIf ; Return the distance using the Pythagorean theorem Return Sqrt(($hDistance * $hDistance) + ($vDistance * $vDistance)) EndFunc ; <== GetClosestDistance Func Settings($Task,$ValueName="",$Value=Default,$UseRegistry=False) Local Static $Setting[], $RegRead Local $KeyName = "HKEY_CURRENT_USER\SOFTWARE\AutoIt Program Data\" & $WindowTitle Switch $Task Case "Read" If $UseRegistry Then $RegRead = RegRead($KeyName,$ValueName) If @error Then Return $Value Else Return $RegRead EndIf Else If MapExists($Setting,$ValueName) Then Return $Setting[$ValueName] Else Return $Value EndIf EndIf Case "Write" $Setting[$ValueName] = $Value If $UseRegistry Then RegWrite($KeyName,$ValueName,"REG_SZ",$Value) Case "Startup" For $i = 1 To 99999 $ValueName = RegEnumVal($KeyName,$i) If @error <> 0 Then Return SetError(2,0,"") $Value = RegRead($KeyName,$ValueName) If @error <> 0 Then Return SetError(3,0,"") $Setting[$ValueName] = $Value Next Case "Shutdown" For $ValueName In MapKeys($Setting) RegWrite($KeyName,$ValueName,"REG_SZ",$Setting[$ValueName]) Next Case Else MsgBox(4906+16,$WindowTitle,"Invalid Task. Ln.:" & @ScriptLineNumber) Return SetError(4,0,"") EndSwitch EndFunc Func ModifyGuideDialog($ControlID,$TypeOfGuide) Local $Font = GetDefaultGUIFont() Global $ResizeControlPopupSubjectControlID = $ControlID,$ResizeControlPopupAdvancedRead = False Local $Pos = ControlGetPos(GetCanvas(),"",$ControlID) Local $Backup = $Pos Local $Text = GUICtrlRead($ControlID) Local $ModifyGuideDialog = GUICreate("Modify Guide",279*$GuiScale,115*$GuiScale,-1,-1,0x14CC0000,0x00000108) If $GuiScale = 1 Then ; Nothing ElseIf $GuiScale < 1 Then GUISetFont($Font[1]*.6,400,0,$Font[0],$ModifyGuideDialog) ElseIf $GuiScale > 1 Then GUISetFont($Font[1],400,0,$Font[0],$ModifyGuideDialog,5) EndIf Local $LabelWidth = GUICtrlCreateLabel("Width",13*$GuiScale,16*$GuiScale,31*$GuiScale,12*$GuiScale) GUICtrlSetResizing(-1,$GUI_DOCKAUTO) Local $LabelPosition = GUICtrlCreateLabel("Position",8*$GuiScale,48*$GuiScale,41*$GuiScale,16*$GuiScale) GUICtrlSetResizing(-1,$GUI_DOCKAUTO) Switch $TypeOfGuide Case $HorizontalGuideMove Local $InputWidth = GUICtrlCreateInput($Pos[3],52*$GuiScale,12*$GuiScale,50*$GuiScale,23*$GuiScale) GUICtrlSetResizing(-1,$GUI_DOCKAUTO) Case $VerticalGuideMove Local $InputWidth = GUICtrlCreateInput($Pos[2],52*$GuiScale,12*$GuiScale,50*$GuiScale,23*$GuiScale) GUICtrlSetResizing(-1,$GUI_DOCKAUTO) Case Else MsgBox(4096+16,$WindowTitle,"Error: Unknown Guide type. Ln: " & @ScriptLineNumber) EndSwitch GuiCtrlSetBkColor(-1,0xE4EEF7) GUICtrlCreateUpdown(-1,0x80) ; Don't insert commas Switch $TypeOfGuide Case $HorizontalGuideMove Local $InputPosition = GUICtrlCreateInput($Pos[1],52*$GuiScale,45*$GuiScale,50*$GuiScale,23*$GuiScale) GUICtrlSetResizing(-1,$GUI_DOCKAUTO) Case $VerticalGuideMove Local $InputPosition = GUICtrlCreateInput($Pos[0],52*$GuiScale,45*$GuiScale,50*$GuiScale,23*$GuiScale) GUICtrlSetResizing(-1,$GUI_DOCKAUTO) Case Else MsgBox(4096+16,$WindowTitle,"Error: Unknown Guide type. Ln: " & @ScriptLineNumber) EndSwitch GuiCtrlSetBkColor(-1,0xE4EEF7) GUICtrlCreateUpdown(-1,0x80) ; Don't insert commas GUICtrlSetResizing(-1,$GUI_DOCKAUTO) Local $ButtonOK = GUICtrlCreateButton("OK",17*$GuiScale,75*$GuiScale,87*$GuiScale,29*$GuiScale,$BS_DEFPUSHBUTTON) GUICtrlSetResizing(-1,$GUI_DOCKAUTO) Global $ResizeControlPopupEdit = GUICtrlCreateEdit($Text,123*$GuiScale,2*$GuiScale,155*$GuiScale,111*$GuiScale,$WS_VSCROLL + $ES_AUTOVSCROLL) GUICtrlSetResizing(-1,$GUI_DOCKAUTO) GUICtrlSetState(-1,$GUI_FOCUS) GUISetState() GUIRegisterMsg($WM_COMMAND, "WM_COMMAND") Local $Width,$Height,$DLL=DllOpen("user32.dll"),$Msg While 1 $Msg = GUIGetMsg() Switch $Msg Case $GUI_EVENT_CLOSE GUICtrlSetPos($ControlID,$Backup[0],$Backup[1],$Backup[2],$Backup[3]) GUICtrlSetData($ControlID,$Text) ExitLoop Case $InputWidth $Pos = ControlGetPos(GetCanvas(),"",$ControlID) If _IsPressed("10",$DLL) Then ; Shift Key $Width = GUICtrlRead($InputWidth) GUICtrlSetPos($ControlID,Default,Default,$Width-5) GUICtrlSetData($InputWidth,$Width-5) Else Switch $TypeOfGuide Case $HorizontalGuideMove GUICtrlSetPos($ControlID,Default,Default,Default,GUICtrlRead($InputWidth)) Case $VerticalGuideMove GUICtrlSetPos($ControlID,Default,Default,GUICtrlRead($InputWidth)) Case Else MsgBox(4096+16,$WindowTitle,"Error: Unknown Guide type. Ln: " & @ScriptLineNumber) EndSwitch EndIf Case $InputWidth+1 LogToConsole("Width updown clicked") Case $InputPosition $Pos = ControlGetPos(GetCanvas(),"",$ControlID) If _IsPressed("10",$DLL) Then ; Shift Key $Height = GUICtrlRead($InputPosition) GUICtrlSetPos($ControlID,Default,Default,Default,$Height-5) GUICtrlSetData($InputPosition,$Height-5) Else Switch $TypeOfGuide Case $HorizontalGuideMove GUICtrlSetPos($ControlID,Default,GUICtrlRead($InputPosition)) Case $VerticalGuideMove GUICtrlSetPos($ControlID,GUICtrlRead($InputPosition)) Case Else MsgBox(4096+16,$WindowTitle,"Error: Unknown Guide type. Ln: " & @ScriptLineNumber) EndSwitch EndIf Case $InputPosition+1 LogToConsole("Position updown clicked") Case $ButtonOK GUICtrlSetTip($ControlID,GUICtrlRead($ControlID)) ExitLoop EndSwitch WEnd DllClose($DLL) GUIDelete($ModifyGuideDialog) EndFunc Func ResizeControlsWithArrowKey($Key) Local $Control = StringSplit($Selected,"|") ;w("$Control[0]=" & $Control[0]) If $Control[0] <= 1 Then Return Local $hGUI = GetCanvas() Local $Backup = $Selected ClearSelectionRectangle("-> Start Resize") ; Calculate Distance Apart from Leader Control $LeaderControl = ControlGetPos($hGUI, "", Int($Control[1])) Local $DistanceApart[$Control[0]][3] For $i=2 to $Control[0]-1 $FollowerControl = ControlGetPos($hGUI, "", int($Control[$i])) $DistanceApart[$i][0] = $FollowerControl[0] - $LeaderControl[0] $DistanceApart[$i][1] = $FollowerControl[1] - $LeaderControl[1] $DistanceApart[$i][2] = $FollowerControl[2] - $LeaderControl[2] Next Switch $Key Case "Up" GUICtrlSetPos(Int($Control[1]),$LeaderControl[0],$LeaderControl[1],$LeaderControl[2],$LeaderControl[3]-1) ; Resize Follower Control with Leader Control For $i=2 to $Control[0]-1 $DAx = $DistanceApart[$i][0] $DAy = $DistanceApart[$i][1] - 1 $CtrlPos = ControlGetPos($hGUI, "", int($Control[$i])) ;~ GUICtrlSetPos(int($Control[$i]),$CtrlPos[0],$LeaderControl[1]+$DAy,$CtrlPos[2],$CtrlPos[3]-1) If $CtrlPos[0] >= $LeaderControl[0] + $DAx And $CtrlPos[1] < $LeaderControl[1] + $LeaderControl[3] Then GUICtrlSetPos(int($Control[$i]),$CtrlPos[0],$LeaderControl[1],$CtrlPos[2],$CtrlPos[3]-1) Else GUICtrlSetPos(int($Control[$i]),$CtrlPos[0],$LeaderControl[1]+$DAy,$CtrlPos[2],$CtrlPos[3]-1) EndIf Next Case "Down" GUICtrlSetPos(Int($Control[1]),$LeaderControl[0],$LeaderControl[1],$LeaderControl[2],$LeaderControl[3]+1) ; Resize Follower Control with Leader Control For $i=2 to $Control[0]-1 $DAx = $DistanceApart[$i][0] $DAy = $DistanceApart[$i][1] $CtrlPos = ControlGetPos($hGUI, "", int($Control[$i])) If $CtrlPos[0] >= $LeaderControl[0]+1 And $CtrlPos[1] >= $LeaderControl[1] Then GUICtrlSetPos(int($Control[$i]),$CtrlPos[0],$LeaderControl[1],$CtrlPos[2],$CtrlPos[3]+1) Else GUICtrlSetPos(int($Control[$i]),$CtrlPos[0],$LeaderControl[1]+$DAy+1,$CtrlPos[2],$CtrlPos[3]+1) EndIf Next Case "Left" If $Control[0] = 2 Then GUICtrlSetPos(Int($Control[1]),$LeaderControl[0]-1,$LeaderControl[1],$LeaderControl[2]+1,$LeaderControl[3]) EndIf ; Resize Follower Control with Leader Control For $i=2 to $Control[0]-1 $DAx = $DistanceApart[$i][0] $DAy = $DistanceApart[$i][1] $CtrlPos = ControlGetPos($hGUI, "", int($Control[$i])) If $CtrlPos[0] >= $LeaderControl[0] + $DAx And $CtrlPos[1]+1 < $LeaderControl[1]+$LeaderControl[3] Then GUICtrlSetPos(int($Control[$i]),$CtrlPos[0]-1,$CtrlPos[1],$CtrlPos[2]+1,$CtrlPos[3]) ; For side by side GUICtrlSetPos(int($Control[1]),$CtrlPos[0]-$DAx-2,$CtrlPos[1],$CtrlPos[2]+1,$CtrlPos[3]) ; For side by side Else GUICtrlSetPos(int($Control[1]),$CtrlPos[0]-1,$CtrlPos[1]-$DAy,$CtrlPos[2]+1,$CtrlPos[3]) ; For Stacked GUICtrlSetPos(int($Control[$i]),$CtrlPos[0]-1,$CtrlPos[1],$CtrlPos[2]+1,$CtrlPos[3]) ; For Stacked EndIf Next Case "Right" GUICtrlSetPos(Int($Control[1]),$LeaderControl[0],$LeaderControl[1],$LeaderControl[2]+1,$LeaderControl[3]) ; Resize Follower Control with Leader Control For $i=2 to $Control[0]-1 $DAx = $DistanceApart[$i][0] $DAy = $DistanceApart[$i][1] $CtrlPos = ControlGetPos($hGUI, "", int($Control[$i])) If $CtrlPos[0] >= $LeaderControl[0] + $DAx And $CtrlPos[1]+1 < $LeaderControl[1]+$LeaderControl[3] Then GUICtrlSetPos(int($Control[$i]),$LeaderControl[0]+$DAx+1,$CtrlPos[1],$CtrlPos[2]+1,$CtrlPos[3]) Else GUICtrlSetPos(int($Control[$i]),$CtrlPos[0],$LeaderControl[1]+$DAy,$CtrlPos[2]+1,$CtrlPos[3]) ; For Stacked EndIf Next Case Else MsgBox(4096+16,$WindowTitle,"ResizeControlsWithArrowKey Error: Unknown key passed as argument. Ln:" & @ScriptLineNumber) EndSwitch ;~ ToolTip("") _WinAPI_RedrawWindow($hGUI) $Selected = $Backup DrawSelectionRectangle(False) ; Todo write Undo $GuiHasChanges = True EndFunc ; ResizeControlsWithArrowKey Func ControlPropertiesDialog($ControlID,$Constructor="") Local $Font = GetDefaultGUIFont() Global $ResizeControlPopupSubjectControlID = $ControlID,$ResizeControlPopupAdvancedRead = False Local $Pos = ControlGetPos(GetCanvas(),"",$ControlID) Local $Backup = $Pos Switch $Constructor Case "GUICtrlCreateRadio","GUICtrlCreateCheckbox" Local $Text = GUICtrlRead($ControlID,1) $ResizeControlPopupAdvancedRead = True Case Else Local $Text = GUICtrlRead($ControlID) EndSwitch Local $hWndResizePopup = GUICreate("Resize",279*$GuiScale,115*$GuiScale,-1,-1,0x14CC0000,0x00000108,GetCanvas()) If $GuiScale = 1 Then ; Nothing ElseIf $GuiScale < 1 Then GUISetFont($Font[1]*.6,400,0,$Font[0],$hWndResizePopup) ElseIf $GuiScale > 1 Then GUISetFont($Font[1],400,0,$Font[0],$hWndResizePopup,5) EndIf Local $LabelWidth = GUICtrlCreateLabel("Width",17*$GuiScale,16*$GuiScale,37*$GuiScale,22*$GuiScale) GUICtrlSetResizing(-1,$GUI_DOCKAUTO) Local $LabelHeight = GUICtrlCreateLabel("Height",17*$GuiScale,48*$GuiScale,41*$GuiScale,26*$GuiScale) GUICtrlSetResizing(-1,$GUI_DOCKAUTO) Local $InputWidth = GUICtrlCreateInput($Pos[2],62*$GuiScale,12*$GuiScale,50*$GuiScale,23*$GuiScale) GUICtrlSetResizing(-1,$GUI_DOCKAUTO) GuiCtrlSetBkColor(-1,0xE4EEF7) GUICtrlCreateUpdown(-1,0x80) ; Don't insert commas GUICtrlSetTip(-1,"Hold Shift to make adjustments faster") Local $InputHeight = GUICtrlCreateInput($Pos[3],62*$GuiScale,45*$GuiScale,50*$GuiScale,23*$GuiScale) GUICtrlSetResizing(-1,$GUI_DOCKAUTO) GuiCtrlSetBkColor(-1,0xE4EEF7) GUICtrlCreateUpdown(-1,0x80) ; Don't insert commas GUICtrlSetTip(-1,"Hold Shift to make adjustments faster") Local $ButtonOK = GUICtrlCreateButton("OK",17*$GuiScale,75*$GuiScale,87*$GuiScale,29*$GuiScale,$BS_DEFPUSHBUTTON) GUICtrlSetResizing(-1,$GUI_DOCKAUTO) Global $ResizeControlPopupEdit = GUICtrlCreateEdit($Text,123*$GuiScale,2*$GuiScale,155*$GuiScale,111*$GuiScale,$WS_VSCROLL + $ES_AUTOVSCROLL) GUICtrlSetResizing(-1,$GUI_DOCKAUTO) GUICtrlSetState(-1,$GUI_FOCUS) Global $UpClicked = GUICtrlCreateDummy() Global $DownClicked = GUICtrlCreateDummy() Global $InsertNewline = GUICtrlCreateDummy() Local $Accel[][] = [[$InsertNewline,"^{ENTER}"]] GUISetAccelerators($Accel) GUISetState() GUIRegisterMsg($WM_COMMAND, "WM_COMMAND") GUIRegisterMsg($WM_NOTIFY, "WM_NOTIFY_ControlPropertiesDialog") Local $Value,$DLL=DllOpen("user32.dll"), $ControlIdFromInput, $Msg While 1 $Msg = GUIGetMsg() Switch $Msg Case $InsertNewline Local $cRead = GUICtrlRead($ResizeControlPopupEdit) $cRead&=@CRLF GUICtrlSetData($ResizeControlPopupEdit,$cRead) Case $GUI_EVENT_CLOSE GUICtrlSetPos($ControlID,$Backup[0],$Backup[1],$Backup[2],$Backup[3]) GUICtrlSetData($ControlID,$Text) ExitLoop Case $UpClicked ; Get the Id of the Input receiving clicks GUICtrlRead($Msg) ; First click is trash $ControlIdFromInput = GUICtrlRead($Msg)-1 Local $sFrom = $ControlIdFromInput=$InputWidth ? "$InputWidth" : "InputHeight" LogToConsole("Up clicked from " & $sFrom) ; Get Cavas Control position $Pos = ControlGetPos(GetCanvas(),"",$ControlID) ; Get the value of the Input receiving clicks $Value = GUICtrlRead($ControlIdFromInput) ; If holding Shift Key If _IsPressed("10",$DLL) Then ; If changing the width If $ControlIdFromInput = $InputWidth Then GUICtrlSetPos($ControlID,Default,Default,$Value+4) GUICtrlSetData($ControlIdFromInput,$Value+4) Else ; If changing the Height GUICtrlSetPos($ControlID,Default,Default,Default,$Value+4) GUICtrlSetData($ControlIdFromInput,$Value+4) EndIf Else ; If changing the width If $ControlIdFromInput = $InputWidth Then GUICtrlSetPos($ControlID,Default,Default,GUICtrlRead($ControlIdFromInput)) Else ; If changing the Height GUICtrlSetPos($ControlID,Default,Default,Default,GUICtrlRead($ControlIdFromInput)) EndIf EndIf RefreshSelectionRectangle() Case $DownClicked ; Get the Id of the Input receiving clicks GUICtrlRead($Msg) ; First click is trash $ControlIdFromInput = GUICtrlRead($Msg)-1 Local $sFrom = $ControlIdFromInput=$InputWidth ? "$InputWidth" : "InputHeight" LogToConsole("Up clicked from " & $sFrom) ; Get Cavas Control position $Pos = ControlGetPos(GetCanvas(),"",$ControlID) ; Get the value of the Input receiving clicks $Value = GUICtrlRead($ControlIdFromInput) ; If holding Shift Key If _IsPressed("10",$DLL) Then ; If changing the width If $ControlIdFromInput = $InputWidth Then GUICtrlSetPos($ControlID,Default,Default,$Value-4) GUICtrlSetData($ControlIdFromInput,$Value-4) Else ; If changing the Height GUICtrlSetPos($ControlID,Default,Default,Default,$Value-4) GUICtrlSetData($ControlIdFromInput,$Value-4) EndIf Else ; If changing the width If $ControlIdFromInput = $InputWidth Then GUICtrlSetPos($ControlID,Default,Default,GUICtrlRead($ControlIdFromInput)) Else ; If changing the Height GUICtrlSetPos($ControlID,Default,Default,Default,GUICtrlRead($ControlIdFromInput)) EndIf EndIf RefreshSelectionRectangle() Case $ButtonOK Local $HeightValue = GUICtrlRead($InputHeight) Local $WidthValue = GUICtrlRead($InputWidth) GUICtrlSetPos($ControlID,$Backup[0],$Backup[1],$WidthValue,$HeightValue) ConsoleWrite("+> Write Undo" & @CRLF) _ArrayPush($GuiUndo,'GUICtrlSetData(' & $ControlID & ',"' & $Text & '")',1) _ArrayPush($GuiUndo,"GUICtrlSetPos(" & $ControlID & "," & $Backup[0] & "," & $Backup[1] & "," & $Backup[2] & "," & $Backup[3] & ")",1) ExitLoop EndSwitch WEnd DllClose($DLL) GUIDelete($hWndResizePopup) EndFunc Func WM_NOTIFY_ControlPropertiesDialog($hWnd, $iMsg, $wParam, $lParam) Local $tNMHDR = DllStructCreate($tagNMHDR, $lParam) If DllStructGetData($tNMHDR, "code") = -722 Then ; UDN_DELTAPOS Local $idFrom = DllStructGetData($tNMHDR, "idFrom") Local $tNMUPDOWN = DllStructCreate("hwnd hWndFrom;uint idFrom;int code;int iPos;int iDelta", $lParam) Local $iDelta = DllStructGetData($tNMUPDOWN, "iDelta") If $iDelta = 1 Then GUICtrlSendToDummy($UpClicked, $idFrom) Else GUICtrlSendToDummy($DownClicked, $idFrom) EndIf EndIf Return $GUI_RUNDEFMSG EndFunc Func WM_COMMAND($hWnd, $iMsg, $wParam, $lParam) Local $hdlWindowFrom, _ $intMessageCode, _ $intControlID_From $intControlID_From = BitAND($wParam, 0xFFFF) $intMessageCode = BitShift($wParam, 16) Switch $intControlID_From Case $ResizeControlPopupEdit Switch $intMessageCode Case $EN_CHANGE If $ResizeControlPopupAdvancedRead Then GUICtrlSetData($ResizeControlPopupSubjectControlID,GUICtrlRead($ResizeControlPopupEdit,1)) Else GUICtrlSetData($ResizeControlPopupSubjectControlID,GUICtrlRead($ResizeControlPopupEdit)) EndIf EndSwitch EndSwitch Return $GUI_RUNDEFMSG EndFunc Func PrepareDelimitedDataFromControls() If $Selected <> "" Then Local $Code="UserInterfaceBuilder♦",$idx,$hGUI = GetCanvas() Local $Properties $Control = StringSplit($Selected,"|") Local $Text, $ControlPos For $i=1 To $Control[0]-1 $idx = GetIndexForGUICtrl($Control[$i]) If $idx = -1 Then ContinueLoop ; Select Gui Control read mode If StringInStr($GuiControl[$idx][1], "GUICtrlCreateCheckbox") Or StringInStr($GuiControl[$idx][1], "GUICtrlCreateRadio") Then $Text = GUICtrlRead($GuiControl[$idx][0],1) ElseIf StringInStr($GuiControl[$idx][1], "_Metro_") Then $Text = $GuiControl[$idx][6] Else $Text = GUICtrlRead($GuiControl[$idx][0]) EndIf $ControlPos = ControlGetPos($hGUI,"",$GuiControl[$idx][0]) $Properties = $GuiControl[$idx][5] If $Properties <> "" Then $Code &= "Constructor→" & $GuiControl[$idx][1] & "♦Name→" & $GuiControl[$idx][2] & "♦Text→" & $Text & "♦Left→" & $ControlPos[0] & "♦Top→" & $ControlPos[1] & "♦Width→" & $ControlPos[2] & "♦Height→" & $ControlPos[3] & _ "♦Style→" & $GuiControl[$idx][3] & "♦ExStyle→" & $GuiControl[$idx][4] & "♦Properties→" & $Properties & @CRLF Else $Code &= "Constructor→" & $GuiControl[$idx][1] & "♦Name→" & $GuiControl[$idx][2] & "♦Text→" & $Text & "♦Left→" & $ControlPos[0] & "♦Top→" & $ControlPos[1] & "♦Width→" & $ControlPos[2] & "♦Height→" & $ControlPos[3] & _ "♦Style→" & $GuiControl[$idx][3] & "♦ExStyle→" & $GuiControl[$idx][4] & @CRLF EndIf Next Return $Code Else SoundPlay("C:\Windows\Media\Windows Ding.wav") Return "" EndIf EndFunc Func MenuPicker() Local $Choices = "",$ControlText,$Ret=0 Local Static $Selection For $i=0 To $MenuCount-1 If $MenuCount-1 = 0 Then $Selection = $GuiMenu[0][1] ; Menu Text $Choices = $GuiMenu[0][1] & "|" Else $Choices &= $GuiMenu[$i][1] & "|" EndIf Next $Choices = StringTrimRight($Choices,1) Local $MenuPicker = GUICreate("Choose Menu...",297,57,-1,-1,-1,-1,$ControlWindow) Local $Combo = GUICtrlCreateCombo($Selection,15,16,174,21,-1,-1) GUICtrlSetData(-1,$Choices) Local $ButtonOK = GUICtrlCreateButton("OK",194,12,87,29,$BS_DEFPUSHBUTTON,-1) GUISetState() While 1 Switch GUIGetMsg() Case $ButtonOK $ControlText = GUICtrlRead($Combo) ;& @CRLF ; IDK what this is for $Selection = $ControlText ExitLoop Case $GUI_EVENT_CLOSE GUIDelete($MenuPicker) Return $Ret EndSwitch WEnd GUIDelete($MenuPicker) For $i=0 To $MenuCount-1 ; Possible issue with spaces in $GuiMenu[$i][1] ;ConsoleWrite('@@ Debug(' & @ScriptLineNumber & ') : $GuiMenu[$i][1] = $ControlText = "' & $GuiMenu[$i][1] &'" = "'& $ControlText &'"'& @CRLF & '>Error code: ' & @error & @CRLF) ;### Debug Console If $GuiMenu[$i][1] = $ControlText Then Local $Ret[2] = [$GuiMenu[$i][0], "$Menu" & StringRegExpReplace($ControlText,"[^_0-9A-Za-z]","")] ExitLoop EndIf Next Return $Ret EndFunc Func HexToStyleString($HexAppliedStyles,$Type="$WS",$ReturnAsArray=False) If $HexAppliedStyles=-1 Then Return -1 Local $FoundStyle = False, $sStyle, $sAppliedStyles="",$nStyles=0 ;LogToConsole() ;LogToConsole("$HexAppliedStyles: " & $HexAppliedStyles) For $sStyle In $StylesList If StringInStr($sStyle,$Type) Then ;ConsoleWrite("Looking for '" & $sStyle) ;LogToConsole("' in AppliedStyles") $HexStyle = Execute($sStyle) $HexStyle = Hex($HexStyle) ;LogToConsole("$HexStyle: 0x" & $HexStyle) If $HexStyle = BitAND($HexAppliedStyles,$HexStyle) Then $sAppliedStyles &= $sStyle & "," $nStyles+=1 EndIf $FoundStyle = True Else If $FoundStyle = True Then ExitLoop Else ContinueLoop EndIf EndIf Next $sAppliedStyles = StringTrimRight($sAppliedStyles,1) If $nStyles = 1 Then Return $sAppliedStyles If $ReturnAsArray Then Local $Ret = StringSplit($sAppliedStyles,",") Else Local $Ret = $sAppliedStyles='' ? -1 : 'BitOR(' & $sAppliedStyles & ')' EndIf Return $Ret EndFunc Func GenerateCode() If $ControlCount = 0 Then Return MsgBox(4096+48,$WindowTitle,"Please add Controls to the GUI and try again.") Local $Code="", $hGUI = GetCanvas() Local $Title = WinGetTitle($hGUI) Local $GuiPos = WinGetClientSize($hGUI) Local $Style = GUIGetStyle($hGUI) Local $Properties,$Property Local $GuiHasNoMetroCtrls = True For $i=0 To $ControlCount-1 If $GuiHasNoMetroCtrls Then If StringInStr($GuiControl[$i][1], "_Metro_") Then $GuiHasNoMetroCtrls = False ExitLoop EndIf EndIf Next If IsChecked($MenuItemToggleInclude) Then $Code &= "; #include " & @CRLF $Code &= "; #include ; _Tempfile" & @CRLF $Code &= "; #include ; _MouseTrap _IsPressed _ChooseColor _ChooseFont _ClipPutFile" & @CRLF EndIf If $METRO_ENABLED = True And IsChecked($MenuItemToggleInclude) Then $Code &= '#include ' & @CRLF $Code &= '#include "C:\Include\MetroGUI-UDF\MetroGUI_UDF.au3"' & @CRLF $Code &= '#include "C:\Include\MetroGUI-UDF\MetroGUI_UDF_xpk.au3"' & @CRLF $Code &= '#include "C:\Include\MetroGUI-UDF\_GUIDisable.au3"' & @CRLF EndIf $Code &= @CRLF If $METRO_ENABLED = True Then $Code &= '; Set Theme' & @CRLF $Code &= '_SetTheme("' & $GUI_Theme_Name & '") ;See MetroThemes.au3 for selectable themes or to add more' & @CRLF $Code &= @CRLF ; For the Gui Window $Code &= $GuiWindow[$GuiInFocus][9] & " = _Metro_CreateGUI(""" & $Title & """," & $GuiPos[0] & "," & $GuiPos[1] & ", -1, -1, True)" & @CRLF $Code &= '; $mGUI, $AllowDragMove = False, $AllowResize = False, $Win_MinWidth = "", $Win_MinHeight = ""' & @CRLF $Code &= '_Metro_SetGUIOption(' & StringSplit($GuiWindow[$GuiInFocus][9]," ",2)[1] & ', True, True, ' & $GuiPos[0] & ',' & $GuiPos[1] & ')' & @CRLF $Code &= '_Metro_AddWindows11StyleCorners(' & StringSplit($GuiWindow[$GuiInFocus][9]," ",2)[1] & ')' & @CRLF ;Add control buttons $Code &= @CRLF $Code &= '; CloseBtn = True, MaximizeBtn = True, MinimizeBtn = True, FullscreenBtn = True, MenuBtn = True' & @CRLF $Code &= 'Local $Control_Buttons = _Metro_AddControlButtons(True, True, True, False, False)' & @CRLF $Code &= 'Local $GUI_CLOSE_BUTTON = $Control_Buttons[0]' & @CRLF $Code &= 'Local $GUI_MAXIMIZE_BUTTON = $Control_Buttons[1]' & @CRLF $Code &= 'Local $GUI_RESTORE_BUTTON = $Control_Buttons[2]' & @CRLF $Code &= 'Local $GUI_MINIMIZE_BUTTON = $Control_Buttons[3]' & @CRLF $Code &= 'Local $METRO_FULLSCREEN_BUTTON = $Control_Buttons[4]' & @CRLF $Code &= 'Local $METRO_FSRestore_BUTTON = $Control_Buttons[5]' & @CRLF $Code &= 'Local $METRO_MENU_BUTTON = $Control_Buttons[6]' & @CRLF $Code &= @CRLF Else If Not $GuiHasNoMetroCtrls Then $Code &= '; For Metro Buttons in Normal Gui' & @CRLF $Code &= '#include ' & @CRLF $Code &= '#include "C:\Include\MetroGUI-UDF\MetroGUI_UDF.au3"' & @CRLF $Code &= '#include "C:\Include\MetroGUI-UDF\MetroGUI_UDF_xpk.au3"' & @CRLF $Code &= '#include "C:\Include\MetroGUI-UDF\_GUIDisable.au3"' & @CRLF $Code &= @CRLF $Code &= '; Globals are set, nothing visible happens yet' & @CRLF $Code &= '_SetTheme("' & $GUI_Theme_Name & '") ;See MetroThemes.au3 for selectable themes or to add more' & @CRLF & @CRLF $Code &= '; Color overrides for Normal window' & @CRLF $Code &= '$GUIThemeColor = "0xF0F0F0" ; Background Color' & @CRLF $Code &= '$FontThemeColor = "0x191919" ; Checkbox/Radio text' & @CRLF & @CRLF EndIf ; For the Gui Window $Code &= $GuiWindow[$GuiInFocus][9] & " = GUICreate(""" & $Title & """," & $GuiPos[0] & "," & $GuiPos[1] & _ ",-1,-1," & HexToStyleString("0x" & hex($Style[0]),"$WS") & "," & HexToStyleString("0x" & hex($Style[1]),"$WS_EX") & ")" & @CRLF & @CRLF $Properties = $GuiWindow[$GuiInFocus][10] If $Properties <> "" Then $Property = StringSplit($Properties,"♫") For $i=1 to $Property[0]-1 If (Not $GuiHasNoMetroCtrls) And StringInStr($Property[$i],"_SetTheme") Then ContinueLoop $Code &= $Property[$i] & @CRLF Next EndIf EndIf ; For the File Menu Local $CleanName,$SwitchCase=@CRLF If $GuiMenu[0][1] <> "" Then For $i=0 to $MenuCount-1 $CleanName = StringRegExpReplace($GuiMenu[$i][1],"(?i)[^_0-9A-Za-z]","") $Code &= "Local $Menu" & $CleanName & " = GUICtrlCreateMenu(""" & $GuiMenu[$i][1] & """)" & @CRLF $SwitchCase &= " Case $Menu" & $CleanName & @CRLF & @TAB & @TAB & @TAB & @CRLF & @CRLF Next For $j=0 to $MenuItemCount-1 $CleanName = StringRegExpReplace($GuiMenuItem[$j][1],"(?i)[^_0-9A-Za-z]","") $Code &= "Local $MenuItem" & $CleanName & " = GUICtrlCreateMenuItem(""" & $GuiMenuItem[$j][1] & """, " & $GuiMenuItem[$j][3] & ")" & @CRLF $SwitchCase &= " Case $MenuItem" & $CleanName & @CRLF & @TAB & @TAB & @TAB & @CRLF & @CRLF Next EndIf ; For All the controls Local $Text, $ControlPos,$ControlState="" For $i=0 To $ControlCount-1 If ControlIsDeleted($GuiControl[$i][0]) Then ContinueLoop ; SKIP DELETED CONTROLS If StringInStr($GuiControl[$i][1], "CheckBox") Or StringInStr($GuiControl[$i][1], "Radio") Then $Text = GUICtrlRead($GuiControl[$i][0],1) Else $Text = GUICtrlRead($GuiControl[$i][0]) EndIf $ControlPos = ControlGetPos(GetCanvas(),"",$GuiControl[$i][0]) If @error Then MsgBox(4069+64,$WindowTitle,"Couldn't get position of Control " & $GuiControl[$i][1] & " " & $GuiControl[$i][2] & "!") ContinueLoop EndIf ; Don't notify for these Controls If Not (StringInStr($GuiControl[$i][1], "Input") Or StringInStr($GuiControl[$i][1], "Label") Or _ StringInStr($GuiControl[$i][1], "Progress") Or StringInStr($GuiControl[$i][1], "MenuStrip") Or _ StringInStr($GuiControl[$i][1], "Seperator") Or StringInStr($GuiControl[$i][1], "Group") _ ) Then $VariableName = StringSplit($GuiControl[$i][2]," ") If StringInStr($GuiControl[$i][1],"_Metro_CreateToggle") Then $SwitchCase &= " Case " & $VariableName[2] & @CRLF & @TAB & @TAB & @TAB & "_Metro_ToggleSwitch($Msg)" & @CRLF & @CRLF ElseIf StringInStr($GuiControl[$i][1],"_Metro_CreateRadio") Then $SwitchCase &= " Case " & $VariableName[2] & @CRLF & @TAB & @TAB & @TAB & '_Metro_RadioCheck("RadioGroup1", $Msg)' & @CRLF & @CRLF ElseIf StringInStr($GuiControl[$i][1],"_Metro_CreateCheckbox") Then $SwitchCase &= " Case " & $VariableName[2] & @CRLF & @TAB & @TAB & @TAB & "_Metro_CheckboxSwitch($Msg)" & @CRLF & @CRLF Else $SwitchCase &= " Case " & $VariableName[2] & @CRLF & @TAB & @TAB & @TAB & @CRLF & @CRLF EndIf EndIf $Style[0] = $GuiControl[$i][3] $Style[1] = $GuiControl[$i][4] $StyleType = GetStylePreFix($GuiControl[$i][1]) ; Write code for one Control Local $NewLine = $i=0 ? "" : @CRLF Select Case $Style[0]=-1 And $Style[1]=-1 ; No Style If StringInStr($GuiControl[$i][1],"_Metro_CreateProgress") Then $Code &= $NewLine & $GuiControl[$i][2] & " = " & StringReplace($GuiControl[$i][1],"_Wrapper","") & _ "(" & _ $ControlPos[0] & "," & $ControlPos[1] & "," & $ControlPos[2] & "," & $ControlPos[3] & ")" & @CRLF LogToConsole("_Metro_CreateProgress") ElseIf StringInStr($GuiControl[$i][1],"_Metro_CreateRadio") Then $Code &= $NewLine & $GuiControl[$i][2] & " = " & StringReplace($GuiControl[$i][1],"_Wrapper","") & _ '("RadioGroup1","' & $GuiControl[$i][6] & '",' & _ $ControlPos[0] & "," & $ControlPos[1] & "," & $ControlPos[2] & "," & $ControlPos[3] & ")" & @CRLF LogToConsole("_Metro_CreateRadio") ElseIf StringInStr($GuiControl[$i][1],"Seperator") Then If $ControlPos[2] > $ControlPos[3] Then Local $Biggest = $ControlPos[2] Local $Smallest = $ControlPos[3] Else Local $Biggest = $ControlPos[3] Local $Smallest = $ControlPos[2] EndIf $Code &= $NewLine & $GuiControl[$i][2] & " = " & StringReplace($GuiControl[$i][1],"_Wrapper","") & _ '(' & $ControlPos[0] & "," & $ControlPos[1] & "," & $Biggest & "," & $Smallest & ")" & @CRLF LogToConsole("No Style") ElseIf StringInStr($GuiControl[$i][1],"Input_Wrapper") Then $Code &= $NewLine & $GuiControl[$i][2] & " = " & StringReplace($GuiControl[$i][1],"_Wrapper","") & _ '("' & $GuiControl[$i][6] & '",' & _ $ControlPos[0] + 6 & "," & $ControlPos[1] + 6 & "," & $ControlPos[2] - 12 & "," & $ControlPos[3] - 12 & ")" & @CRLF LogToConsole("No Style") ElseIf StringInStr($GuiControl[$i][1],"_Metro_") Then $Code &= $NewLine & $GuiControl[$i][2] & " = " & StringReplace($GuiControl[$i][1],"_Wrapper","") & _ '("' & $GuiControl[$i][6] & '",' & _ $ControlPos[0] & "," & $ControlPos[1] & "," & $ControlPos[2] & "," & $ControlPos[3] & ")" & @CRLF LogToConsole("No Style") Else ; Normal Control paramas $Code &= $NewLine & $GuiControl[$i][2] & " = " & StringReplace($GuiControl[$i][1],"_Wrapper","") & _ "(""" & StringReplace(StringReplace($Text,@CRLF,'" & @CRLF & "'),' & ""',"") & """," & _ $ControlPos[0] & "," & $ControlPos[1] & "," & $ControlPos[2] & "," & $ControlPos[3] & ")" & @CRLF LogToConsole("No Style") EndIf Case $Style[0]<>-1 And $Style[1]<>-1 ; All Styled $Code &= $NewLine & $GuiControl[$i][2] & " = " & StringReplace($GuiControl[$i][1],"_Wrapper","") & _ "(""" & StringReplace(StringReplace($Text,@CRLF,'" & @CRLF & "'),' & ""',"") & """," & _ $ControlPos[0] & "," & $ControlPos[1] & "," & $ControlPos[2] & "," & $ControlPos[3] & "," & _ HexToStyleString($Style[0],$StyleType) & "," & HexToStyleString($Style[1],$StyleType & "_EX") & ")" & @CRLF LogToConsole("All Styled") Case $Style[0]=-1 $Code &= $NewLine & $GuiControl[$i][2] & " = " & StringReplace($GuiControl[$i][1],"_Wrapper","") & _ "(""" & StringReplace(StringReplace($Text,@CRLF,'" & @CRLF & "'),' & ""',"") & """," & _ $ControlPos[0] & "," & $ControlPos[1] & "," & $ControlPos[2] & "," & $ControlPos[3] & "," & _ "-1" & "," & HexToStyleString($Style[1],$StyleType & "_EX") & ")" & @CRLF LogToConsole("EX Styled") Case Else $Code &= $NewLine & $GuiControl[$i][2] & " = " & StringReplace($GuiControl[$i][1],"_Wrapper","") & _ "(""" & StringReplace(StringReplace($Text,@CRLF,'" & @CRLF & "'),' & ""',"") & """," & _ $ControlPos[0] & "," & $ControlPos[1] & "," & $ControlPos[2] & "," & $ControlPos[3] & "," & _ HexToStyleString($Style[0],$StyleType) & ")" & @CRLF LogToConsole("WS Styled") EndSelect ; Write all GuiCtrlSet* $Properties = $GuiControl[$i][5] If $Properties <> "" Then $Property = StringSplit($Properties,"♫") For $j=1 to $Property[0]-1 $Code &= $Property[$j] & @CRLF Next EndIf Next If IsChecked($MenuItemToggleMessageLoop) Then Local $WindowHandle = StringSplit($GuiWindow[$GuiInFocus][9]," ") $Code &= @CRLF & "GuiSetState()" & @CRLF & @CRLF $Code &= "While 1" & @CRLF $Code &= " Local $Msg = GuiGetMsg()" & @CRLF $Code &= " Switch $Msg" & @CRLF $Code &= $SwitchCase If $METRO_ENABLED = True Then $Code &= @TAB & @TAB & "Case $GUI_CLOSE_BUTTON,$GUI_EVENT_CLOSE" & @CRLF & @TAB & @TAB & @TAB & "ExitLoop" & @CRLF & @CRLF $Code &= @TAB & @TAB & "Case $GUI_MAXIMIZE_BUTTON" & @CRLF & @TAB & @TAB & @TAB & "GUISetState(@SW_MAXIMIZE)" & @CRLF & @CRLF $Code &= @TAB & @TAB & "Case $GUI_RESTORE_BUTTON" & @CRLF & @TAB & @TAB & @TAB & "GUISetState(@SW_RESTORE)" & @CRLF & @CRLF $Code &= @TAB & @TAB & "Case $GUI_MINIMIZE_BUTTON" & @CRLF & @TAB & @TAB & @TAB & "GUISetState(@SW_MINIMIZE)" & @CRLF & @CRLF $Code &= @TAB & @TAB & "; Case $METRO_MENU_BUTTON" & @CRLF & @TAB & @TAB & @TAB & "; See _Metro_AddControlButtons" & @CRLF & @CRLF Else $Code &= @TAB & @TAB & "Case $GUI_EVENT_CLOSE" & @CRLF & @TAB & @TAB & @TAB & "ExitLoop" & @CRLF & @CRLF EndIf $Code &= " EndSwitch" & @CRLF $Code &= "Wend" & @CRLF & @CRLF If $GuiHasNoMetroCtrls Then $Code &= "GuiDelete(" & $WindowHandle[2] & ")" & @CRLF Else $Code &= "; Required for Metro GUI and/or Buttons" & @CRLF $Code &= "_Metro_GuiDelete(" & $WindowHandle[2] & ")" & @CRLF EndIf EndIf TextEditor($Code) EndFunc ; <===== GenerateCode Func GetStylePreFix($GuiFunctionNameAsString) Local $StyleType = "" Switch $GuiFunctionNameAsString Case "GUICtrlCreateButton","GUICtrlCreateCheckbox","GUICtrlCreateRadio" $StyleType = "$BS" Case "GUICtrlCreateInput","GUICtrlCreateEdit" $StyleType = "$ES" Case "GUICtrlCreateLabel" $StyleType = "$SS" Case "GUICtrlCreateListView" $StyleType = "$LVS" Case " GUICtrlCreateTreeView" $StyleType = "$TVS" Case "GUICtrlCreateCombo" $StyleType = "$CBS" Case "GUICtrlCreateList" $StyleType = "$LBS" Case "GUICtrlCreateProgress" $StyleType = "$PBS" Case "GUICtrlCreateUpdown" $StyleType = "$UDS" Case "GUICtrlCreateTab" $StyleType = "$TCS" Case "GUICtrlCreateAvi" $StyleType = "$ACS" Case "GUICtrlCreateDate" $StyleType = "$DTS" Case "GUICtrlCreateSlider" $StyleType = "$TBS" Case Else $StyleType = "$" EndSwitch Return $StyleType EndFunc ; <===== GenerateCode Func ExportHtmlDialog() If $ControlCount = 0 Then Return MsgBox(4096+48,$WindowTitle,"Please add Controls to the GUI and try again.") Local $Code="", $hGUI = GetCanvas() Local $Title = WinGetTitle($hGUI) Local $GuiPos = WinGetClientSize($hGUI) Local $Style = GUIGetStyle($hGUI) Local $Properties,$Property,$CurrentState,$SwitchCase=@CRLF Local $Body = "" $Code &= '' & @CRLF $Code &= '' & @CRLF $Code &= '' & @CRLF $Code &= ' ' & @CRLF $Code &= ' ' & @CRLF $Code &= ' ' & $Title & '' & @CRLF $Code &= ' ' & @CRLF $Code &= '' & @CRLF $Code &= '' & @CRLF $Code &= $Body $Code &= '' & @CRLF $Code &= '' & @CRLF Local $tmpHTML = _TempFile(@TempDir,"",".htm") If FileWrite($tmpHTML,$Code) Then ShellExecute($tmpHTML) Sleep(3000) FileDelete($tmpHTML) EndIf ;~ TextEditor($Code) EndFunc Func IsChecked($idControlID) Return BitAND(GUICtrlRead($idControlID), $GUI_CHECKED) = $GUI_CHECKED EndFunc ;==>IsChecked Func ColorIsLight($iColor) Local $r = BitShift(BitAND($iColor, 0xFF0000), 16) Local $g = BitShift(BitAND($iColor, 0x00FF00), 8) Local $b = BitAND($iColor, 0x0000FF) ; Calculate perceived brightness Local $brightness = Sqrt(0.299 * $r ^ 2 + 0.587 * $g ^ 2 + 0.114 * $b ^ 2) Return Not ($brightness < 130) ; threshold: tweak as needed EndFunc Func TextEditor($Code="") AutoItSetOption("GUICloseOnESC",1) Local Static $Ret Local $Text, $Title = "Code: Output" If $Code = "" Then $Text = $Ret $Title = "Code: Input Mode" Else $Text = $Code EndIf Local $CodeDialog = GUICreate($Title,1000,600,-1,-1,BitOR($WS_MAXIMIZEBOX, $WS_MINIMIZEBOX, $WS_CAPTION, $WS_POPUP, $WS_SYSMENU, $WS_THICKFRAME),$WS_EX_TOPMOST) Local $Edit = GUICtrlCreateEdit("",20,20,1000-40,600-40-32-2) GUICtrlSetFont(-1,11,0,0,"Lucida Sans Typewriter",3) ;~ Local $Edit = _GUICtrlRichEdit_Create($CodeDialog,"",20,20,760,526) GUICtrlSetResizing($Edit,$GUI_DOCKBORDERS) If $Title = "Code: Input Mode" Then Local $Copy = GUICtrlCreateButton("OK", 500-42, 600-32-10, 87, 29) Else Local $Copy = GUICtrlCreateButton("Copy All", 500-42, 600-32-10, 87, 29) EndIf GUICtrlSetResizing(-1,$GUI_DOCKBOTTOM + $GUI_DOCKWIDTH + $GUI_DOCKHEIGHT) GUISetState(@SW_SHOW) $LoadSampleCode = GUICtrlCreateLabel("",0,0,20,20) $cMenu = GUICtrlCreateContextMenu($LoadSampleCode) $iMenu = GUICtrlCreateMenuItem("Load text",$cMenu) Local $FileText,$Line,$SampleCode _FileReadToArray("C:\Users\christopherc\Documents\Sample GUI.au3",$FileText,$FRTA_NOCOUNT) For $Line In $FileText $SampleCode &= $Line & @CRLF Next GUICtrlSetData($Edit,$Text) ;~ _GUICtrlRichEdit_SetText($Edit,$Text) ;~ _GUICtrlRichEdit_SetSel($Edit,0,-1) ;~ _GUICtrlRichEdit_SetFont($Edit,12,"Courier New") While 1 Switch GUIGetMsg() Case $iMenu GUICtrlSetData($Edit,$SampleCode) Case $GUI_EVENT_CLOSE GUIDelete($CodeDialog) Return Case $Copy If $Title = "Code: Output" Then ClipPut(GUICtrlRead($Edit)) ExitLoop EndSwitch WEnd If $Code = "" Then $Ret = GUICtrlRead($Edit) EndIf GUIDelete($CodeDialog) AutoItSetOption("GUICloseOnESC",0) If $Code = "" Then Return $Ret EndIf EndFunc Func GetIndexForGUICtrl($ControlID) For $i=0 to $ControlCount-1 If $GuiControl[$i][0] = $ControlID Then ;Local $Ret[4] = [$GuiControl[$i][1],$GuiControl[$i][2],$GuiControl[$i][3],$GuiControl[$i][4]] Return $i EndIf Next ; Throws errors on Guides ; MsgBox(4096+64,$WindowTitle,"Function GetIndexForGUICtrl Critical Error: Cannot find GUI Control in Array $GuiControl.") Return -1 EndFunc Func DeleteSelectedControls() Local $Control = StringSplit($Selected,"|"), $idx $Selected = "" RefreshSelectionRectangle() For $i=1 to $Control[0]-1 GUICtrlSetState(int($Control[$i]),$GUI_HIDE) ConsoleWrite( "-> Deleting Control: " & int($Control[$i]) & @CRLF) ConsoleWrite("+> Write Undo" & @CRLF) $idx = GetIndexForGUICtrl(int($Control[$i])) _ArrayPush($GuiUndo,'Execute($GuiControl[' & $idx & '][6]="' & $GuiControl[$idx][6] & '")',1) _ArrayPush($GuiUndo,"GUICtrlSetState(" & int($Control[$i]) & ",$GUI_SHOW)",1) If $idx<>-1 Then $GuiControl[$idx][6] = "" Next $GuiHasChanges = True EndFunc Func ClearSelectionRectangle($Description) ; Reset everthing: Selected items,rectangle, tooltip, variable name, and anchors $Selected = "" GUICtrlSetState($GuiWindow[$GuiInFocus][0],$GUI_HIDE) GUICtrlSetState($GuiWindow[$GuiInFocus][1],$GUI_HIDE) GUICtrlSetState($GuiWindow[$GuiInFocus][2],$GUI_HIDE) GUICtrlSetState($GuiWindow[$GuiInFocus][3],$GUI_HIDE) GUICtrlSetState($GuiWindow[$GuiInFocus][5],$GUI_HIDE) GUICtrlSetState($GuiWindow[$GuiInFocus][6],$GUI_HIDE) GUICtrlSetState($GuiWindow[$GuiInFocus][7],$GUI_HIDE) GUICtrlSetState($GuiWindow[$GuiInFocus][8],$GUI_HIDE) ToolTip("") ConsoleWrite($Description & "-> Clear Selection Rectangle" & @CRLF) GUICtrlSetData($ControlWindowInputBox,$GuiWindow[$GuiInFocus][9]) EndFunc ;~ Func ClearManipulationToolbar($Description) ;~ ; GUICtrlSetState($GuiWindow[$GuiInFocus][13],$GUI_HIDE) ;~ GUICtrlSetState($GuiWindow[$GuiInFocus][14],$GUI_HIDE) ;~ GUICtrlSetState($GuiWindow[$GuiInFocus][15],$GUI_HIDE) ;~ GUICtrlSetState($GuiWindow[$GuiInFocus][16],$GUI_HIDE) ;~ GUICtrlSetState($GuiWindow[$GuiInFocus][17],$GUI_HIDE) ;~ ConsoleWrite($Description & "-> Hide Manipulation Toolbar" & @CRLF) ;~ EndFunc Func RefreshSelectionRectangle($ShowToolbar=True,$DrawConstrainedMoveAnchors=True) GUICtrlSetState($GuiWindow[$GuiInFocus][0],$GUI_HIDE) GUICtrlSetState($GuiWindow[$GuiInFocus][1],$GUI_HIDE) GUICtrlSetState($GuiWindow[$GuiInFocus][2],$GUI_HIDE) GUICtrlSetState($GuiWindow[$GuiInFocus][3],$GUI_HIDE) GUICtrlSetState($GuiWindow[$GuiInFocus][5],$GUI_HIDE) GUICtrlSetState($GuiWindow[$GuiInFocus][6],$GUI_HIDE) GUICtrlSetState($GuiWindow[$GuiInFocus][7],$GUI_HIDE) GUICtrlSetState($GuiWindow[$GuiInFocus][8],$GUI_HIDE) ConsoleWrite( "Refresh Selection Rectangle" & @CRLF) DrawSelectionRectangle($ShowToolbar,$DrawConstrainedMoveAnchors) EndFunc Func ClearGuides() GUICtrlSetState($GuiWindow[$GuiInFocus][11],$GUI_HIDE) GUICtrlSetState($GuiWindow[$GuiInFocus][12],$GUI_HIDE) ConsoleWrite( "Hidding Guides" & @CRLF) EndFunc Func RefreshCanvas() _WinAPI_RedrawWindow(GetCanvas()) RemoveDeletedControls() DeleteUndoList() GUICtrlSetData($LabelControlCount,$ControlCount) EndFunc Func CalculateBoundingBoxAroundSelectedControls() $hGUI = WinActive("[ACTIVE]") If $hGUI = $ControlWindow Or $hGUI = $ToolBox Then Return Local $Control = StringSplit($Selected,"|"), $aPos,$HighestControlPos[4] = [-256,-256,-256,-256], $LeftestControlPos[4] = [-256,-256,-256,-256], $RightestControlPos[4] = [-256,-256,-256,-256], $LowestControlPos[4] = [-256,-256,-256,-256] For $i=1 to $Control[0]-1 $aPos = ControlGetPos($hGUI, "", int($Control[$i])) If @error Then ConsoleWrite("!$Selected: " & $Selected & @CRLF) ConsoleWrite("!Cannot get postion for control " & $Control[$i] & @CRLF) ContinueLoop EndIf If $HighestControlPos[0] = -256 Then $HighestControlPos[0] = $aPos[0] $HighestControlPos[1] = $aPos[1] $HighestControlPos[2] = $aPos[2] $HighestControlPos[3] = $aPos[3] Else If $aPos[1] < $HighestControlPos[1] Then $HighestControlPos[0] = $aPos[0] $HighestControlPos[1] = $aPos[1] $HighestControlPos[2] = $aPos[2] $HighestControlPos[3] = $aPos[3] EndIf EndIf If $LeftestControlPos[0] = -256 Then $LeftestControlPos[0] = $aPos[0] $LeftestControlPos[1] = $aPos[1] $LeftestControlPos[2] = $aPos[2] $LeftestControlPos[3] = $aPos[3] Else If $aPos[0] < $LeftestControlPos[0] Then $LeftestControlPos[0] = $aPos[0] $LeftestControlPos[1] = $aPos[1] $LeftestControlPos[2] = $aPos[2] $LeftestControlPos[3] = $aPos[3] EndIf EndIf If $LowestControlPos[1] = -256 Then $LowestControlPos[0] = $aPos[0] $LowestControlPos[1] = $aPos[1] $LowestControlPos[2] = $aPos[2] $LowestControlPos[3] = $aPos[3] Else If $aPos[1] + $aPos[3] > $LowestControlPos[1] + $LowestControlPos[3] Then $LowestControlPos[0] = $aPos[0] $LowestControlPos[1] = $aPos[1] $LowestControlPos[2] = $aPos[2] $LowestControlPos[3] = $aPos[3] EndIf EndIf If $RightestControlPos[0] = -256 Then $RightestControlPos[0] = $aPos[0] $RightestControlPos[1] = $aPos[1] $RightestControlPos[2] = $aPos[2] $RightestControlPos[3] = $aPos[3] Else If $aPos[0] + $aPos[2] > $RightestControlPos[0] + $RightestControlPos[2] Then $RightestControlPos[0] = $aPos[0] $RightestControlPos[1] = $aPos[1] $RightestControlPos[2] = $aPos[2] $RightestControlPos[3] = $aPos[3] EndIf EndIf Next Local $Left = $LeftestControlPos[0] Local $Top = $HighestControlPos[1] Local $Right = $RightestControlPos[0] + $RightestControlPos[2] Local $Bottom = $LowestControlPos[1] + $LowestControlPos[3] Local $aRet[] =[$Left,$Top,$Right,$Bottom] Return $aRet EndFunc Func DrawSelectionRectangle($ShowToolbar=True,$DrawConstrainedMoveAnchors=True) $hGUI = WinActive("[ACTIVE]") If $hGUI = $ControlWindow Or $hGUI = $ToolBox Then Return ; Calculation bounding box around selected controls Local $Control = StringSplit($Selected,"|"), $aPos,$HighestControlPos[4] = [-256,-256,-256,-256], $LeftestControlPos[4] = [-256,-256,-256,-256], $RightestControlPos[4] = [-256,-256,-256,-256], $LowestControlPos[4] = [-256,-256,-256,-256] For $i=1 to $Control[0]-1 $aPos = ControlGetPos($hGUI, "", int($Control[$i])) If @error Then ConsoleWrite("DrawSelectionRectangle cannot get postion for control " & $Control[$i] & @CRLF) ContinueLoop EndIf If $HighestControlPos[0] = -256 Then $HighestControlPos[0] = $aPos[0] $HighestControlPos[1] = $aPos[1] $HighestControlPos[2] = $aPos[2] $HighestControlPos[3] = $aPos[3] Else If $aPos[1] < $HighestControlPos[1] Then $HighestControlPos[0] = $aPos[0] $HighestControlPos[1] = $aPos[1] $HighestControlPos[2] = $aPos[2] $HighestControlPos[3] = $aPos[3] EndIf EndIf If $LeftestControlPos[0] = -256 Then $LeftestControlPos[0] = $aPos[0] $LeftestControlPos[1] = $aPos[1] $LeftestControlPos[2] = $aPos[2] $LeftestControlPos[3] = $aPos[3] Else If $aPos[0] < $LeftestControlPos[0] Then $LeftestControlPos[0] = $aPos[0] $LeftestControlPos[1] = $aPos[1] $LeftestControlPos[2] = $aPos[2] $LeftestControlPos[3] = $aPos[3] EndIf EndIf If $LowestControlPos[1] = -256 Then $LowestControlPos[0] = $aPos[0] $LowestControlPos[1] = $aPos[1] $LowestControlPos[2] = $aPos[2] $LowestControlPos[3] = $aPos[3] Else If $aPos[1] + $aPos[3] > $LowestControlPos[1] + $LowestControlPos[3] Then $LowestControlPos[0] = $aPos[0] $LowestControlPos[1] = $aPos[1] $LowestControlPos[2] = $aPos[2] $LowestControlPos[3] = $aPos[3] EndIf EndIf If $RightestControlPos[0] = -256 Then $RightestControlPos[0] = $aPos[0] $RightestControlPos[1] = $aPos[1] $RightestControlPos[2] = $aPos[2] $RightestControlPos[3] = $aPos[3] Else If $aPos[0] + $aPos[2] > $RightestControlPos[0] + $RightestControlPos[2] Then $RightestControlPos[0] = $aPos[0] $RightestControlPos[1] = $aPos[1] $RightestControlPos[2] = $aPos[2] $RightestControlPos[3] = $aPos[3] EndIf EndIf Next Local $GuiPos = WinGetPos($hGUI) ; Show Tooltip X,Y position of bounding box If $LeftestControlPos[0] <> -256 Then ToolTip($LeftestControlPos[0] & "," & $HighestControlPos[1],$LeftestControlPos[0]+$GuiPos[0],$HighestControlPos[1]+$GuiPos[1]) ; SelectionRect, set position GUICtrlSetPos($GuiWindow[$GuiInFocus][0],$LeftestControlPos[0]-2,$HighestControlPos[1]-2,$RightestControlPos[0] + $RightestControlPos[2] - $LeftestControlPos[0] + 4,$LowestControlPos[1] + $LowestControlPos[3] - $HighestControlPos[1] + 4) ; Upper Left, set position GUICtrlSetPos($GuiWindow[$GuiInFocus][1],$LeftestControlPos[0]-10,$HighestControlPos[1]-10) ; Lower Right Pull, set position GUICtrlSetPos($GuiWindow[$GuiInFocus][2],$RightestControlPos[0] + $RightestControlPos[2] + 2,$LowestControlPos[1] + $LowestControlPos[3] + 2) ; Center Marker, set position GUICtrlSetPos($GuiWindow[$GuiInFocus][3],$RightestControlPos[0] + $RightestControlPos[2] - ($RightestControlPos[0] + $RightestControlPos[2] - $LeftestControlPos[0])/2 - 4 ,$LowestControlPos[1] + $LowestControlPos[3] - ($LowestControlPos[1] + $LowestControlPos[3] - $HighestControlPos[1])/2 - 4) ; Right Horizontal pull, set position GUICtrlSetPos($GuiWindow[$GuiInFocus][5],$RightestControlPos[0] + $RightestControlPos[2] + 3,$LowestControlPos[1] + $LowestControlPos[3] - ($LowestControlPos[1] + $LowestControlPos[3] - $HighestControlPos[1])/2 - 4) ; Lower Vertical pull, set position GUICtrlSetPos($GuiWindow[$GuiInFocus][6],$RightestControlPos[0] + $RightestControlPos[2] - ($RightestControlPos[0] + $RightestControlPos[2] - $LeftestControlPos[0])/2 - 4,$LowestControlPos[1] + $LowestControlPos[3] + 3) ; Top Vertical pull, set position GUICtrlSetPos($GuiWindow[$GuiInFocus][7],$RightestControlPos[0] + $RightestControlPos[2] - ($RightestControlPos[0] + $RightestControlPos[2] - $LeftestControlPos[0])/2 - 4, $HighestControlPos[1]-11) ; Left Horizontal pull, set position GUICtrlSetPos($GuiWindow[$GuiInFocus][8],$LeftestControlPos[0]-11,$LowestControlPos[1] + $LowestControlPos[3] - ($LowestControlPos[1] + $LowestControlPos[3] - $HighestControlPos[1])/2 - 4) ; Make the selection rectangle TOPMOST. It took years to find out that just $GUI_ONTOP would not work GUICtrlSetState($GuiWindow[$GuiInFocus][0],BitOR($GUI_SHOW,$GUI_ONTOP)) If $Control[0] > 2 And $ShowToolbar Then ; Draw Toolbar HidePullAnchors(" - AlignmentToolbar Called") IgnoreMouseDown(" - AlignmentToolbar Called") Local $Pick = DisplayButtons("AlignmentToolbar", GetCanvas(), $GuiWindow[$GuiInFocus][0]) If @error Then IgnoreMouseDownCanceled(" - AlignmentToolbar canceled") LogToConsole(" -> Fatal: DrawSelectionRectangle()") DrawSelectionRectangle(False) HideResizingAnchors("DisplayButtons Called") Return EndIf Switch $Pick Case "Config0" ; Align Left GUICtrlSendToDummy($GuiWindow[$GuiInFocus][14]) Case "Config1" ; Align Center GUICtrlSendToDummy($GuiWindow[$GuiInFocus][15]) Case "Config2" ; Align Right GUICtrlSendToDummy($GuiWindow[$GuiInFocus][16]) Case "Config3" ; Align horizontally GUICtrlSendToDummy($GuiWindow[$GuiInFocus][17]) Case "Config4" ; Align Vertically GUICtrlSendToDummy($GuiWindow[$GuiInFocus][18]) Case "Config5" ; Calculate the distance between 2 controls ; GUICtrlSendToDummy($GuiWindow[$GuiInFocus][19]) GUICtrlSendToDummy($CalculateDistanceApart) Case "Config6" ; Exit Toolbar GUICtrlSendToDummy($GuiWindow[$GuiInFocus][20]) Case Else Return LogToConsole(" -> AlignmentToolbar: That $Pick was not expected, Fatal: DrawSelectionRectangle") EndSwitch Else If $DrawConstrainedMoveAnchors Then GUICtrlSetState($GuiWindow[$GuiInFocus][1],BitOR($GUI_SHOW,$GUI_ONTOP)) GUICtrlSetState($GuiWindow[$GuiInFocus][2],BitOR($GUI_SHOW,$GUI_ONTOP)) GUICtrlSetState($GuiWindow[$GuiInFocus][3],$GUI_SHOW) ; Control Center Mark GUICtrlSetState($GuiWindow[$GuiInFocus][5],BitOR($GUI_SHOW,$GUI_ONTOP)) GUICtrlSetState($GuiWindow[$GuiInFocus][6],BitOR($GUI_SHOW,$GUI_ONTOP)) GUICtrlSetState($GuiWindow[$GuiInFocus][7],BitOR($GUI_SHOW,$GUI_ONTOP)) GUICtrlSetState($GuiWindow[$GuiInFocus][8],BitOR($GUI_SHOW,$GUI_ONTOP)) Else GUICtrlSetState($GuiWindow[$GuiInFocus][1],$GUI_HIDE) GUICtrlSetState($GuiWindow[$GuiInFocus][2],$GUI_HIDE) GUICtrlSetState($GuiWindow[$GuiInFocus][3],$GUI_HIDE) GUICtrlSetState($GuiWindow[$GuiInFocus][5],$GUI_HIDE) GUICtrlSetState($GuiWindow[$GuiInFocus][6],$GUI_HIDE) GUICtrlSetState($GuiWindow[$GuiInFocus][7],BitOR($GUI_SHOW,$GUI_ONTOP)) GUICtrlSetState($GuiWindow[$GuiInFocus][8],BitOR($GUI_SHOW,$GUI_ONTOP)) EndIf EndIf EndFunc ; DrawSelectionRectangle Func HideResizingAnchors($Caller) ; Hide everything except the rectangle GUICtrlSetState($GuiWindow[$GuiInFocus][1],$GUI_HIDE) GUICtrlSetState($GuiWindow[$GuiInFocus][2],$GUI_HIDE) GUICtrlSetState($GuiWindow[$GuiInFocus][3],$GUI_HIDE) GUICtrlSetState($GuiWindow[$GuiInFocus][5],$GUI_HIDE) GUICtrlSetState($GuiWindow[$GuiInFocus][6],$GUI_HIDE) LogToConsole($Caller & "-> Hide resizing anchors") EndFunc ; HidePullAnchors Func HidePullAnchors($Caller) ; Hide everything except the rectangle GUICtrlSetState($GuiWindow[$GuiInFocus][1],$GUI_HIDE) GUICtrlSetState($GuiWindow[$GuiInFocus][2],$GUI_HIDE) GUICtrlSetState($GuiWindow[$GuiInFocus][3],$GUI_HIDE) GUICtrlSetState($GuiWindow[$GuiInFocus][5],$GUI_HIDE) GUICtrlSetState($GuiWindow[$GuiInFocus][6],$GUI_HIDE) GUICtrlSetState($GuiWindow[$GuiInFocus][7],$GUI_HIDE) GUICtrlSetState($GuiWindow[$GuiInFocus][8],$GUI_HIDE) LogToConsole($Caller & "-> Hide pull anchors") EndFunc ; HidePullAnchors Func IgnoreMouseDown($Caller) $IgnoreMouseDown = True LogToConsole($Caller & "-> Ignore Mouse on Canvas") EndFunc ; IgnoreMouseDown Func IgnoreMouseDownCanceled($Caller) $IgnoreMouseDown = False LogToConsole($Caller & "->Listen Mouse on Canvas") EndFunc ; IgnoreMouseDownCanceled Func HoldControl($Control) ClearSelectionRectangle("Prepare to drop Control") Local $RefreshCanvas=False If $Control = 0 Then MsgBox(4096+16,$WindowTitle,"HoldControl Error: GuiCtrlCreate_ could not create the Control. ln.:" & @ScriptLineNumber & @CRLF & @CRLF & " Trying GUISwitch(GetCanvas())...") GUISwitch(GetCanvas()) Return EndIf Local $cInfo,$LastPosM="",$Timer = TimerInit(),$hGUI=GetCanvas() Local $hDLL = DllOpen("User32.dll") Do ; ESC Key If _IsPressed("1B", $hDLL) Then GUICtrlSetState($Control,$GUI_HIDE) $RefreshCanvas = True ; $Selected &= $Control & "|" ; DeleteSelectedControls() ExitLoop EndIf $cInfo = GUIGetCursorInfo($hGUI) $CurrPosM = $cInfo[0] & "," & $cInfo[1] If $CurrPosM <> $LastPosM And TimerDiff($Timer) > 10 Then GUICtrlSetPos($Control,$cInfo[0],$cInfo[1]) _WinAPI_RedrawWindow($hGUI) $Timer = TimerInit() EndIf $LastPosM = $CurrPosM Until $cInfo[2] While _IsPressed("1B", $hDLL) Sleep(250) WEnd If $RefreshCanvas Then ; RemoveDeletedControls() RefreshCanvas() EndIf DllClose($hDLL) $GuiHasChanges = True EndFunc Func HoldSelectedControls($Constraint="", $HoldUntil="MouseDown") If $Selected = "" Then Return -1 LogToConsole("$Selected: " & $Selected) Local $cInfo,$LastPosM="",$Timer = TimerInit(),$hGUI=GetCanvas() Local $hDLL = DllOpen("User32.dll") Local $Control = StringSplit($Selected,"|") Local $DragControlID = int($Control[1]) ; Calculate Distance Apart from Leader Control $LeaderControl = ControlGetPos($hGUI, "", $DragControlID) Local $DistanceApart[$Control[0]][3] For $i=1 to $Control[0]-1 If int($Control[$i]) <> $DragControlID Then $FollowerControl = ControlGetPos($hGUI, "", int($Control[$i])) $DistanceApart[$i][0] = $FollowerControl[0] - $LeaderControl[0] $DistanceApart[$i][1] = $FollowerControl[1] - $LeaderControl[1] $DistanceApart[$i][2] = int($Control[$i]) Else $DistanceApart[$i][0] = 0 $DistanceApart[$i][1] = 0 $DistanceApart[$i][2] = $DragControlID & "*" EndIf Next Local $Backup = $Selected ClearSelectionRectangle("Hold Selected Controls") Do ; ESC Key deletes Controls and Aborts If _IsPressed("1B", $hDLL) Then For $i=1 to $Control[0]-1 GUICtrlSetState($Control[$i],$GUI_HIDE) Next ExitLoop EndIf $cInfo = GUIGetCursorInfo($hGUI) $CurrPosM = $cInfo[0] & "," & $cInfo[1] If $CurrPosM <> $LastPosM And TimerDiff($Timer) > 10 Then Switch $Constraint Case "Horizontal","X" GUICtrlSetPos($DragControlID, $cInfo[0], $LeaderControl[1]) Case "Vertical","Y" GUICtrlSetPos($DragControlID, $LeaderControl[0], $cInfo[1]) Case Else GUICtrlSetPos($DragControlID,$cInfo[0],$cInfo[1]) EndSwitch ;GUICtrlSetPos($DragControlID,$cInfo[0],$cInfo[1]) _WinAPI_RedrawWindow($hGUI) $Timer = TimerInit() EndIf $LastPosM = $CurrPosM ; Move Follower Control with Leader Control For $i=1 to $Control[0]-1 If int($Control[$i]) <> $DragControlID Then ;$cInfo = GUIGetCursorInfo($hGUI) $FollowerControlPosX = $cInfo[0] + $DistanceApart[$i][0] $FollowerControlPosY = $cInfo[1] + $DistanceApart[$i][1] $CurrentControlPos = ControlGetPos($hGUI, "", int($Control[$i])) Switch $Constraint Case "Horizontal","X" GUICtrlSetPos(int($Control[$i]), $FollowerControlPosX, $LeaderControl[1] + $DistanceApart[$i][1]) Case "Vertical","Y" GUICtrlSetPos(int($Control[$i]), $LeaderControl[0] + $DistanceApart[$i][0], $FollowerControlPosY) Case Else GUICtrlSetPos(int($Control[$i]), $FollowerControlPosX, $FollowerControlPosY) EndSwitch Sleep(10) ; More accurate drop placement of controls EndIf Next ; Not constrained=Do until mouse up, Constrained= Do until mouse down $cInfo[2] = $HoldUntil="MouseDown" ? $cInfo[2] : Not $cInfo[2] Until $cInfo[2] While _IsPressed("1B", $hDLL) Sleep(250) WEnd $Selected = $Backup DrawSelectionRectangle() DllClose($hDLL) EndFunc Func HoldGuide($Control,$Lock) ; $Lock = 0 for X Axis and 1 for Y Axis Local $cInfo,$LastPosM="",$Timer = TimerInit(),$hGUI=GetCanvas(),$mPos = MouseGetPos() Local $GuiPos = WinGetPos($hGUI) Local $GuiClientSize = WinGetClientSize($hGUI) Local $ClientArea[4] = [$GuiPos[0]+$GuiPos[2]-$GuiClientSize[0],$GuiPos[1]+$GuiPos[3]-$GuiClientSize[1],$GuiClientSize[0],$GuiClientSize[1]] If $Lock Then GUISetCursor(11,1) _MouseTrap($GuiPos[0],$GuiPos[1]+1,$GuiPos[0],$GuiPos[1]+$GuiPos[3]) ; Top pull Else GUISetCursor(13,1) _MouseTrap($GuiPos[0],$GuiPos[1]+$FileMenuHeight+14,$GuiPos[0]+$GuiPos[2],$GuiPos[1]+$FileMenuHeight+14) ; Side pull ;~ _MouseTrap($GuiPos[0],$GuiPos[1],$GuiPos[0]+$GuiPos[2],$GuiPos[1]) ; Side pull EndIf Do $cInfo = GUIGetCursorInfo($hGUI) $CurrPosM = $cInfo[0] & "," & $cInfo[1] If $CurrPosM <> $LastPosM And TimerDiff($Timer) > 10 Then GUICtrlSetPos($Control,$cInfo[0],$cInfo[1]) _WinAPI_RedrawWindow($hGUI) Select Case $cInfo[0] = int($ClientArea[2]/2) ToolTip("Middle X",$cInfo[0],$cInfo[1]) Sleep(1000) Case $cInfo[1] = int($ClientArea[3]/2) ToolTip("Middle Y",$ClientArea[0]+$cInfo[0],$ClientArea[1]+$cInfo[1]) Sleep(1000) EndSelect ToolTip("") $Timer = TimerInit() EndIf $LastPosM = $CurrPosM Until Not $cInfo[2] _MouseTrap() GUISetCursor(2,1) EndFunc Func LockGuideMovement($Control,$Lock) ; $Lock = 0 for X Axis and 1 for Y Axis Local $cInfo,$LastPosM="",$Timer = TimerInit(),$hGUI=GetCanvas(),$mPos = MouseGetPos() Local $GuiPos = WinGetPos($hGUI) Local $GuiClientSize = WinGetClientSize($hGUI) Local $ClientArea[4] = [$GuiPos[0]+$GuiPos[2]-$GuiClientSize[0],$GuiPos[1]+$GuiPos[3]-$GuiClientSize[1],$GuiClientSize[0],$GuiClientSize[1]] If $Lock Then GUISetCursor(11,1) _MouseTrap($GuiPos[0]+9,$GuiPos[1]+1,$GuiPos[0]+9,$GuiPos[1]+$GuiPos[3]) ; Top pull Else GUISetCursor(13,1) ;~ _MouseTrap($GuiPos[0],$GuiPos[1]+32,$GuiPos[0]+$GuiPos[2],$GuiPos[1]+32) ; Side pull _MouseTrap($GuiPos[0],$GuiPos[1],$GuiPos[0]+$GuiPos[2],$GuiPos[1]) ; Side pull EndIf Do $cInfo = GUIGetCursorInfo($hGUI) $CurrPosM = $cInfo[0] & "," & $cInfo[1] If $CurrPosM <> $LastPosM And TimerDiff($Timer) > 10 Then GUICtrlSetPos($Control,$cInfo[0],$cInfo[1]) _WinAPI_RedrawWindow($hGUI) Select Case $cInfo[0] = int($ClientArea[2]/2) ToolTip("Middle X",$cInfo[0],$cInfo[1]) Sleep(1000) Case $cInfo[1] = int($ClientArea[3]/2) ToolTip("Middle Y",$ClientArea[0]+$cInfo[0],$ClientArea[1]+$cInfo[1]) Sleep(1000) EndSelect ToolTip("") $Timer = TimerInit() EndIf $LastPosM = $CurrPosM Until $cInfo[2] _MouseTrap() GUISetCursor(2,1) EndFunc Func InRectangleBounds($X,$Y,$LeftX,$TopY,$RightX,$BottomY) Local $Start[2] = [$LeftX,$TopY] Local $Stop[2] = [$RightX,$BottomY] If $X > $Start[0] And $X < $Stop[0] And _ $Y > $Start[1] And $Y < $Stop[1] Then Return True Else Return False EndIf EndFunc Func DrawGuideLines($Control) If $GuidesAreDisabled Then Return $hGUI = WinActive("[ACTIVE]") If $hGUI = $ControlWindow Or $hGUI = $ToolBox Then Return Local $GuiPos = WinGetPos($hGUI) Local $GuiClientSize = WinGetClientSize($hGUI) Local $ClientArea[4] = [$GuiPos[0]+$GuiPos[2]-$GuiClientSize[0],$GuiPos[1]+$GuiPos[3]-$GuiClientSize[1],$GuiClientSize[0],$GuiClientSize[1]] Local $cPos = ControlGetPos($hGUI,"",$Control) Local $Neigbor For $i = 0 to $ControlCount-1 ; If $Control=0, Guides will show during a control drag If $GuiControl[$i][0] = $Control Then ContinueLoop If ControlIsDeleted($GuiControl[$i][0]) Then ContinueLoop ; SKIP DELETED CONTROLS $Neigbor = ControlGetPos($hGUI, "", $GuiControl[$i][0]) If @error Then ConsoleWrite("!$Selected: " & $Selected & @CRLF) ConsoleWrite("DrawGuideLines: !Cannot get postion for control " & $GuiControl[$i][0] & @CRLF) ContinueLoop EndIf ; ///////////////////////////////////////////AGRESSIVE//SNAP//GUIDES/////////////////////////////////////////////// For $GrabPos=-2 to 2 ;~ ;$cPos = ControlGetPos($hGUI,"",$Control) ;~ If $Neigbor[0] + $Neigbor[2] + 10 = $cPos[0] + $GrabPos Or _ ;~ $Neigbor[1] = $cPos[1] + $GrabPos Then ;~ GUICtrlSetPos($GuiWindow[$GuiInFocus][11],0,$Neigbor[1]-1) ;~ GUICtrlSetPos($GuiWindow[$GuiInFocus][12],$Neigbor[0] + $Neigbor[2] + 10,0) ;~ MouseMove($Neigbor[0] + $Neigbor[2]+10,$Neigbor[1]-1,0) ;~ ; +-----------+ X < - ;~ ; | | ^ Snap Point ;~ ; +-----------+ | Note: Snap is anywhere near the X and Y Guides ;~ EndIf If $Neigbor[0] + $Neigbor[2] + 10 < $cPos[0] And $cPos[0] < $Neigbor[0] + $Neigbor[2] + 20 And _ $Neigbor[1] < $cPos[1] And $Neigbor[1] + 20 > $cPos[1] Then GUICtrlSetPos($GuiWindow[$GuiInFocus][11],0,$Neigbor[1]) GUICtrlSetPos($GuiWindow[$GuiInFocus][12],$Neigbor[0] + $Neigbor[2] + 10,0) MouseMove($Neigbor[0] + $Neigbor[2]+11,$Neigbor[1],0) Sleep(40) ; +-----------+ X < - Snap Point ; | | ^ | ; +-----------+ +---+ Note: Snap is near the X and Y Guides EndIf If InRectangleBounds($cPos[0] + $GrabPos,$cPos[1] + $GrabPos,$Neigbor[0],$Neigbor[1] + $Neigbor[3] + 20,$Neigbor[0] + 20,$Neigbor[1] + $Neigbor[3] + 20 + 20) Then GUICtrlSetPos($GuiWindow[$GuiInFocus][11],0,$Neigbor[1] + $Neigbor[3] + 5) GUICtrlSetPos($GuiWindow[$GuiInFocus][12],$Neigbor[0],0) MouseMove($Neigbor[0]-1,$Neigbor[1] + $Neigbor[3] + 5,0) Sleep(40) ; +-----------+ ; | | ; +-----------+ ; X < - Snap Point ; ^ | ; +---+ Note: Snap is near the X and Y Guides EndIf If $Neigbor[1] = $cPos[1]+$GrabPos Then ; Left Edge Horizontal guide GUICtrlSetPos($GuiWindow[$GuiInFocus][11],0,$Neigbor[1]) $cPos = ControlGetPos($hGUI,"",$Control) MouseMove($cPos[0],$Neigbor[1],0) Sleep(40) ;____________________________________________________________ ; +-----------+ ^ ^ ^ Snap Point ^ ^ ^ ^ ^ ; | | ; +-----------+ Note: Snap is near the Horizontal Guide EndIf If $Neigbor[0] = $cPos[0]+$GrabPos Then ; Left Edge Vertical guide GUICtrlSetPos($GuiWindow[$GuiInFocus][12],$Neigbor[0],0) $cPos = ControlGetPos($hGUI,"",$Control) MouseMove($Neigbor[0],$cPos[1],0) Sleep(40) ; | ; |+-----------+ ; || | ; |+-----------+ ; | < - Snap Point ; | Note: Snap is near the Vertical Guide ; | EndIf Next ; /////////////////////////////////////////////////////////////////////////////////////////////////////////////// ;~ If $Neigbor[1] + $Neigbor[3] = $cPos[1] + $cPos[3] Then ;~ ; Right Edge Horizontal guide ;~ GUICtrlSetPos($GuiWindow[$GuiInFocus][11],0,$Neigbor[1] + $Neigbor[3]) ;~ $cPos = ControlGetPos($hGUI,"",$Control) ;~ MouseMove($cPos[0],$Neigbor[1] + $Neigbor[3],0) ; Don't snap to this ;~ EndIf ;~ If $Neigbor[0] + $Neigbor[2] = $cPos[0] + $cPos[2] Then ;~ ; Right Egde Vertical guide ;~ GUICtrlSetPos($GuiWindow[$GuiInFocus][12],$Neigbor[0] + $Neigbor[2],0) ;~ $cPos = ControlGetPos($hGUI,"",$Control) ;~ MouseMove($Neigbor[0] + $Neigbor[2],$cPos[1],0) ; Don't snap to this ;~ EndIf ;~ For $GrabPos=-20 to 20 ; add these to ifs ;~ $cPos = ControlGetPos($hGUI,"",$Control) ;~ If $Neigbor[0] + $Neigbor[2] + 10 + $GrabPos = $cPos[0] Then ;~ ; Right Egde Vertical guide + 20 pixels right ;~ GUICtrlSetPos($GuiWindow[$GuiInFocus][12],$Neigbor[0] + $Neigbor[2] + 10,0) ;~ $cPos = ControlGetPos($hGUI,"",$Control) ;~ MouseMove($Neigbor[0] + $Neigbor[2] + 10,$cPos[1],0) ; Don't snap to this ;~ EndIf ;~ $cPos = ControlGetPos($hGUI,"",$Control) ;~ If $Neigbor[1] = $cPos[1]+$GrabPos Then ;~ ; Left Edge Horizontal guide ;~ $cPos = ControlGetPos($hGUI,"",$Control) ;~ MouseMove($cPos[0],$Neigbor[1],0) ;~ EndIf ;~ Next Next GUICtrlSetState($GuiWindow[$GuiInFocus][11],BitOR($GUI_SHOW,$GUI_ONTOP)) GUICtrlSetState($GuiWindow[$GuiInFocus][12],BitOR($GUI_SHOW,$GUI_ONTOP)) EndFunc ; DrawGuideLines Func DeleteAllControls() Global $GuiControl[$MaxControls][$MaxControlParameters], $ControlCount = 0 For $i=0 to $MaxControls-1 $GuiControl[$i][0] = Default Next EndFunc Func DeleteAllGuides() For $i=0 to $MaxGuides-1 GUICtrlSetState(int($GuiGuide[$i]),$GUI_HIDE) Next ; GUICtrlDelete is not used because it stops new control creation Global $GuiGuide[$MaxGuides], $GuideCount = 0 For $i=0 to $MaxGuides-1 $GuiGuide[$i] = Default Next EndFunc Func DeleteFileMenu() Global $GuiMenu[$MaxMenus][$MaxMenuParameters], $MenuCount = 0 For $i=0 to $MaxMenus-1 $GuiMenu[$i][0] = Default Next Global $GuiMenuItem[$MaxMenuItems][$MaxMenuItemParameters], $MenuItemCount = 0 For $i=0 to $MaxMenuItems-1 $GuiMenuItem[$i][0] = Default Next EndFunc Func DeleteUndoList() Global $GuiUndo[$MaxUndos] For $i=0 to $MaxUndos-1 $GuiUndo[$i] = "" Next EndFunc Func RemoveDeletedControls() If $ControlCount = 0 Then ; MsgBox(4096+16,$WindowTitle,"No Controls to delete") Return EndIf Local $i,$j,$temp[4],$FoundReplacment For $i = 0 To $ControlCount-1 ;w("> Processing Control " & $GuiControl[$i][0]) $FoundReplacment = False ;w("+ $FoundReplacment = False") For $j = 1 To $ControlCount-1 If $GuiControl[$i][0] = Default Or GUICtrlGetState($GuiControl[$i][0]) = $GUI_HIDE + $GUI_ENABLE Then ; IF DELETED ;w("! Control " & $GuiControl[$i][0] & " is deleted, looking for replacement") If $j > $i And GUICtrlGetState($GuiControl[$j][0]) = $GUI_SHOW + $GUI_ENABLE Then ; IF NEXT NOT DELETED If $GuiControl[$j][0] = Default Then If $FoundReplacment = False And $j = $ControlCount-1 Then For $k=$i To $ControlCount-1 $GuiControl[$k][0] = Default ; Delete the remaining controls and set new control count $GuiControl[$k][1] = Null $GuiControl[$k][2] = Null $GuiControl[$k][3] = Null $GuiControl[$k][4] = Null Next $ControlCount = $i ;w("!!! Cannot find replacement Control for " & $GuiControl[$j][0] & ", Return") ;~ _ArrayDisplay($GuiControl,"Control count: " & $ControlCount) Return Else ;w("> Next Control is Default, ContinueLoop") ContinueLoop EndIf EndIf ;w("> Next Control " & $GuiControl[$j][0] & " is okay to copy") $temp = $GuiControl[$i][0] ;w("! Control " & $GuiControl[$i][0] & " is deleted, looking for replacement") $FoundReplacment = True ;w("+ $FoundReplacment = True") ;w("+ Copying Control " & $GuiControl[$j][0] & " to " & $GuiControl[$i][0]) $GuiControl[$i][0] = $GuiControl[$j][0] $GuiControl[$i][1] = $GuiControl[$j][1] $GuiControl[$i][2] = $GuiControl[$j][2] $GuiControl[$i][3] = $GuiControl[$j][3] $GuiControl[$i][4] = $GuiControl[$j][4] ;w("- Setting " & $GuiControl[$j][0] & " to Default") $GuiControl[$j][0] = Default ExitLoop Else If $FoundReplacment = False And $j = $ControlCount-1 Then For $k=$i To $ControlCount-1 $GuiControl[$k][0] = Default ; Delete the remaining controls and set new control count $GuiControl[$k][1] = Null $GuiControl[$k][2] = Null $GuiControl[$k][3] = Null $GuiControl[$k][4] = Null Next $ControlCount = $i ;w("!!! Cannot find replacement Control for " & $GuiControl[$j][0] & ", Return") ;~ _ArrayDisplay($GuiControl,"Control count: " & $ControlCount) Return Else ;w("> Next Control " & $GuiControl[$j][0] & " is not okay, ContinueLoop") ContinueLoop EndIf EndIf Else ;w("> Next Control " & $GuiControl[$i][0] & " is not deleted, ContinueLoop") ExitLoop EndIf Next Next EndFunc Func NewControl($Constructor,$Name=Default,$Text=Default,$X=Default,$Y=Default,$Width=Default,$Height=Default,$Style=-1,$ExStyle=-1) ; Avoid control creation failure GUISwitch(GetCanvas()) Local $Ret = False If IsArray($Constructor) Then Local $GUIFunction = $Constructor[3] $Constructor[3] = "CallArgArray" Local $ArgArray[$Constructor[0]-2],$Arg For $i=0 to $Constructor[0]-3 If $i > 0 Then ; Don't modify the first parameter $Arg = StringRegExpReplace($Constructor[$i+3],'^\s*"(.*)"\s*$',"$1") ; Remove "Quotes" If Not @extended Then If StringInStr($Constructor[$i+3],"BitOr") Then $Arg = Execute(StringReplace($Constructor[$i+3],"|",",")) ; Convert BitOr Pipes to Commas If $Arg = "" Then ; The String result needs to be Executed to easily apply the Style to the Window MsgBox(4096+16,"NewWindow Error","Bad Style Error: " & $Constructor[$i+3] & @CRLF & "Style will not be imported.") $Arg = -1 Else If StringInStr($Constructor[$i+3],"_EX_") Then $ExStyle = $Arg Else $Style = $Arg EndIf EndIf Else ; Execute all parameters except prama 1, "Quoted Strings", and BitOrs If StringRegExp($Arg,"^(\$WS_|\$SS_|\$TVS_|\$LVS_|\$UDS_|\$DTS_|\$ACS_|\$TCS_|\$GUI_|\$BS_|\$CBS_|\$LBS_|\$ES_|\$PBS_|\$MCS_|\$TBS_)") Then $Arg = Execute($Arg) $Style = $Arg ElseIf StringInStr($Arg,"_EX_",0,1,1,10) Then $Arg = Execute($Arg) $ExStyle = $Arg Else If Not StringInStr($GUIFunction,"MenuItem") Then $Arg = Execute($Arg) EndIf EndIf EndIf $ArgArray[$i] = $Arg Else $ArgArray[$i] = $Constructor[$i+3] ; Preserve parama 1 EndIf Next If StringInStr($GUIFunction,"MenuItem") Then If $GuiMenu[0][1] = "" Then Return ; MsgBox(4096+16, $WindowTitle, "Menu bar does not exist. Ln:" & @ScriptLineNumber) If $MenuItemCount = $MaxMenuItems Then Return MsgBox(4096+16, $WindowTitle, "Maximum MenuItems have been reached. Ln:" & @ScriptLineNumber) ;ConsoleWrite('@@ Debug(' & @ScriptLineNumber & ') : No more WS $ArgArray[2] = "' & $ArgArray[2] &'"'& @CRLF & '>Error code: ' & @error & @CRLF) ;### Debug Console ; Correct ControlID before Call - De-Reference $VariableName to INT For $i=0 To $MenuCount-1 If $GuiMenu[$i][3] = $ArgArray[2] Then $VariableName = $GuiMenu[$i][3] ; Save $VariableName $ArgArray[2] = $GuiMenu[$i][0] ; Parent ControlID "68" ExitLoop EndIf Next ; Create MenuItem Control $GuiMenuItem[$MenuItemCount][0] = Call($GUIFunction,$ArgArray) If @error = 0xDEAD And @extended = 0xBEEF Then Return MsgBox($MB_SYSTEMMODAL, "", """" & $GUIFunction & """ Function does not exist. Ln:" & @ScriptLineNumber) $GuiMenuItem[$MenuItemCount][1] = $ArgArray[1] ; "&Open" $GuiMenuItem[$MenuItemCount][2] = $ArgArray[2] ; Parent ControlID "68" $GuiMenuItem[$MenuItemCount][3] = $VariableName ; "$MenuFile" $MenuItemCount+=1 ElseIf StringInStr($GUIFunction,"Menu") Then ; Create Menu Control $GuiMenu[$MenuCount][0] = Call($GUIFunction,$ArgArray) If @error = 0xDEAD And @extended = 0xBEEF Then Return MsgBox($MB_SYSTEMMODAL, "", """" & $GUIFunction & """ Function does not exist. Ln:" & @ScriptLineNumber) $GuiMenu[$MenuCount][1] = $ArgArray[1] ; Menu Text $GuiMenu[$MenuCount][2] = $Constructor[1] ; Variable Scope $GuiMenu[$MenuCount][3] = $Constructor[2] ; $VariableName $MenuCount+=1 ElseIf $METRO_ENABLED And StringInStr($GUIFunction,"_Metro_AddControlButtons") Then Local $Control_Buttons = Call($GUIFunction,$ArgArray) $METRO_CLOSE_BUTTON = $Control_Buttons[0] $METRO_MAXIMIZE_BUTTON = $Control_Buttons[1] $METRO_RESTORE_BUTTON = $Control_Buttons[2] $METRO_MINIMIZE_BUTTON = $Control_Buttons[3] $METRO_FULLSCREEN_BUTTON = $Control_Buttons[4] $METRO_FSRestore_BUTTON = $Control_Buttons[5] $METRO_MENU_BUTTON = $Control_Buttons[6] Return ; Don't write Undo and update Control count label Else ; Create ALL other controls $GuiControl[$ControlCount][0] = Call($GUIFunction,$ArgArray) If @error = 0xDEAD And @extended = 0xBEEF Then MsgBox($MB_SYSTEMMODAL, "", """" & $GUIFunction & """ Function does not exist or the Function has no Arguments Ln:" & @ScriptLineNumber) _ArrayDisplay($ArgArray,"Function does not exist.") Return EndIf $GuiControl[$ControlCount][1] = $GUIFunction $GuiControl[$ControlCount][2] = $Constructor[1] & " " & $Constructor[2] $GuiControl[$ControlCount][3] = $Style $GuiControl[$ControlCount][4] = $ExStyle ; $GuiControl[$ControlCount][5] = ; For adding GuiCtrl* functions after control creation If StringInStr($GUIFunction,"Metro") Then $GuiControl[$ControlCount][6] = $ArgArray[1] LogToConsole(">ArgArray NewCtrl increased control count.") $ControlCount+=1 EndIf Else If StringInStr($Constructor,"Metro") Then $GuiControl[$ControlCount][0] = Call($Constructor,$Text,$X,$Y,$Width,$Height) ; The Call will fail if for some reason the Canvas is not active If $GuiControl[$ControlCount][0] <> 0 Then $GuiControl[$ControlCount][6] = $Text Else $GuiControl[$ControlCount][0] = Call($Constructor,$Text,$X,$Y,$Width,$Height,$Style,$ExStyle) EndIf If $GuiControl[$ControlCount][0] = 0 Then Return SetError(6,0,False) If @error = 0xDEAD And @extended = 0xBEEF Then Return MsgBox($MB_SYSTEMMODAL, "", """" & $Constructor & """ Function does not exist. Ln:" & @ScriptLineNumber) $GuiControl[$ControlCount][1] = $Constructor If $Name = Default Then $GuiControl[$ControlCount][2] = "Local $Control" & $GuiControl[$ControlCount][0] Else $GuiControl[$ControlCount][2] = $Name EndIf $GuiControl[$ControlCount][3] = $Style $GuiControl[$ControlCount][4] = $ExStyle ; $GuiControl[$ControlCount][5] = ; For adding GuiCtrl* functions after control creation $ControlCount+=1 EndIf _ArrayPush($GuiUndo,"GUICtrlSetState(" & int($GuiControl[$ControlCount-1][0]) & ",$GUI_HIDE)",1) GUICtrlSetData($LabelControlCount,$ControlCount) $GuiHasChanges = True EndFunc ; NewControl Func NewWindow($WindowDefinition="") If $WindowDefinition = "" And $WindowCount = $MaxWindows Then Return SetError(1,0,False) If IsArray($WindowDefinition) Then ; Save constructor, replace with "CallArgArray" Local $WindowFunction = $WindowDefinition[3] $WindowDefinition[3] = "CallArgArray" ; Save the Canvas size for Undo operation $LastCanvasSize[0]=$WindowDefinition[5] $LastCanvasSize[0]=$WindowDefinition[6] ; Center the new window $WindowDefinition[7] = -1 $WindowDefinition[8] = -1 Local $ArgArray[$WindowDefinition[0]-2],$Arg ; Remove qoutes from the whole function call For $i=0 to $WindowDefinition[0]-3 $Arg = StringRegExpReplace($WindowDefinition[$i+3],'^\s*"(.*)"\s*$',"$1") ; If no quotes are removed If Not @extended Then ; Check for the word BitOr If StringInStr($WindowDefinition[$i+3],"BitOr") Then ; Convert BitOr Pipes to Commas $Arg = Execute(StringReplace($WindowDefinition[$i+3],"|",",")) If $Arg = "" Then MsgBox(4096+48,"NewWindow Error","Bad Style Error: " & $WindowDefinition[$i+3] & @CRLF & "Style will not be imported. Ln.:" & @ScriptLineNumber) $Arg = -1 EndIf ; If parama is a Variable get it's value ElseIf StringInStr($WindowDefinition[$i+3],"$",0,1,1,1) Then ; Convert $VarName+12 type things to real values $Arg = Execute($WindowDefinition[$i+3]) If $Arg = "" Then MsgBox(4096+48,"NewWindow Error","Parameter " & $WindowDefinition[$i+3] & @CRLF & "will not be imported because it could not be evaluated. Ln.: " & @ScriptLineNumber) $Arg = -1 EndIf EndIf EndIf $ArgArray[$i] = $Arg Next ; Delete open GUI Window GUIDelete($GuiWindow[$WindowCount-1][4]) DeleteAllControls() DeleteFileMenu() DeleteUndoList() ; Try to create a window from args or call a default window $GuiWindow[$WindowCount-1][4] = Call($WindowFunction,$ArgArray) If @error = 0xDEAD And @extended = 0xBEEF Then NewWindow() MsgBox(4096+48, $WindowTitle,"NewWindow Error: Cannot create window. Parameters are incorrect.") Return SetError(2,0,False) EndIf ; Set Scope and Handle - Example: Global $hWnd $GuiWindow[$WindowCount-1][9] = $WindowDefinition[1] & " " & $WindowDefinition[2] GUICtrlSetData($ControlWindowInputBox,$GuiWindow[$WindowCount-1][9]) ; $WindowCount is now adjusted because Call is successful $WindowCount-=1 ; This is done because the wrapper blocks any styles from passing through. If $WindowFunction = "_Metro_CreateGUI_Wrapper" Then ; These $WS styles required to move the controls around GUISetStyle(BitOR($WS_SIZEBOX, $WS_MINIMIZEBOX, $WS_MAXIMIZEBOX),$WS_EX_ACCEPTFILES) $METRO_ENABLED = True EndIf Else ; Save information for Undo $LastCanvasSize[0]=640 $LastCanvasSize[1]=470 $GuiWindow[$WindowCount][4] = GUICreate("Untitled Window",$LastCanvasSize[0],$LastCanvasSize[1],-1,-1,BitOR($WS_CAPTION, $WS_SYSMENU,$WS_MINIMIZEBOX,$WS_SIZEBOX),$WS_EX_ACCEPTFILES) GUICtrlSetData($ControlWindowInputBox,"Global $hWnd") $GuiWindow[$WindowCount][9] = "Global $hWnd" EndIf ; File Drop Area $FileDropArea = GUICtrlCreateLabel("",0,0,@DesktopWidth,@DesktopHeight) ; Global within Main GUICtrlSetBkColor(-1, $GUI_BKCOLOR_TRANSPARENT) GUICtrlSetState(-1, $GUI_DROPACCEPTED) GUISetState() ; SelectionRect $GuiWindow[$WindowCount][0] = GUICtrlCreateLabel("",8,8,64,64,$SS_BLACKFRAME) GUICtrlSetBkColor(-1, $GUI_BKCOLOR_TRANSPARENT) GUICtrlSetState(-1, $GUI_DISABLE) ; DebugMarkA (Upper left square) $GuiWindow[$WindowCount][1] = GUICtrlCreateLabel("",0,0,8,8,$SS_BLACKRECT) GUICtrlSetState(-1, $GUI_DISABLE) ; DebugMarkB (Lower right square) $GuiWindow[$WindowCount][2] = GUICtrlCreateLabel("",64+8,64+8,8,8,$SS_BLACKRECT) GUICtrlSetBkColor(-1, $COLOR_BLUE) GUICtrlSetState(-1, $GUI_DISABLE) ; DebugMarkC (Lower left square) $GuiWindow[$WindowCount][3] = GUICtrlCreateLabel("",28+8,28+8,8,8,$SS_BLACKRECT) GUICtrlSetState(-1, $GUI_DISABLE) ; Gui's Handle in above Call ; $GuiWindow[$WindowCount][4] ; Horizontal pull $GuiWindow[$WindowCount][5] = GUICtrlCreateLabel("",64+8+2,28+8,8,8,$SS_BLACKRECT) GUICtrlSetState(-1, $GUI_DISABLE) ; Vertical pull $GuiWindow[$WindowCount][6] = GUICtrlCreateLabel("",28+8,64+8+2,8,8,$SS_BLACKRECT) GUICtrlSetState(-1, $GUI_DISABLE) ; Top constrained Vertical pull circle $GuiWindow[$WindowCount][7] = GUICtrlCreateGraphic(28+8,64+8+2,8,8) GUICtrlSetGraphic(-1,$GUI_GR_COLOR,0,$COLOR_BLUE) GUICtrlSetGraphic(-1,$GUI_GR_ELLIPSE,0,0,8,8) GUICtrlSetState(-1, $GUI_DISABLE) ; Left constrained Horizontal pull circle $GuiWindow[$WindowCount][8] = GUICtrlCreateGraphic(28+8,64+8+2,8,8) GUICtrlSetGraphic(-1,$GUI_GR_COLOR,0,$COLOR_BLUE) GUICtrlSetGraphic(-1,$GUI_GR_ELLIPSE,0,0,8,8) GUICtrlSetState(-1, $GUI_DISABLE) ; Scope and name, ex. Global $hWnd ; $GuiWindow[$GuiInFocus][9] ; Properties, ex. GuiSet* ; $GuiWindow[$GuiInFocus][10] ; Horizontal guide line visual $GuiWindow[$WindowCount][11] = GUICtrlCreateLabel("",-10,-10,@DesktopWidth,2) GUICtrlSetBkColor(-1, $COLOR_AQUA) GUICtrlSetState(-1, $GUI_DISABLE) ; Vertical guide line visual $GuiWindow[$WindowCount][12] = GUICtrlCreateLabel("",-10,-10,2,@DesktopHeight) GUICtrlSetBkColor(-1, $COLOR_AQUA) GUICtrlSetState(-1, $GUI_DISABLE) ; Drag bar for Metro windows If $METRO_ENABLED Then $GuiWindow[$GuiInFocus][13] = GUICtrlCreateLabel("test",0,0,$WindowDefinition[5],31,-1,$GUI_WS_EX_PARENTDRAG) EndIf ; Left Align Button $GuiWindow[$WindowCount][14] = GUICtrlCreateDummy() GUICtrlSetState(-1, $GUI_DISABLE) ; Center Align Button $GuiWindow[$WindowCount][15] = GUICtrlCreateDummy() GUICtrlSetState(-1, $GUI_DISABLE) ; Right Align Button $GuiWindow[$WindowCount][16] = GUICtrlCreateDummy() GUICtrlSetState(-1, $GUI_DISABLE) ; Horizontally Align Button $GuiWindow[$WindowCount][17] = GUICtrlCreateDummy() ; Vertically Align Button $GuiWindow[$WindowCount][18] = GUICtrlCreateDummy() ; Calculate the distance between 2 controls $GuiWindow[$WindowCount][19] = GUICtrlCreateDummy() ; Exit Button $GuiWindow[$WindowCount][20] = GUICtrlCreateDummy() GUISetAccelerators($Accel) $GuiInFocus = $WindowCount ClearSelectionRectangle("Initializing Controls") ClearGuides() DeleteUndoList() If GetCanvas() Then RepositionWindowsAroundGUI() WinSetTitle($ControlWindow,"","Control Window") $SaveFile = "" $GuiHasChanges = False $WindowCount+=1 Return True Else NewWindow() MsgBox(4096+16,$WindowTitle,"Could not load GUI window. Check the Styles and try again.") Return SetError(3,0,False) EndIf EndFunc Func RepositionWindowsAroundGUI($CenterAllWindows=True,$CenterWindow = GetCanvas()) Local $GAP = 8 Local $ctrl = WinGetPos($ControlWindow) Local $cntr = WinGetPos($CenterWindow) Local $tool = WinGetPos($ToolBox) ;~ WinMove($cntr, "", $cntr[0] + 100, $cntr[1]) ; Always place ControlWindow fully above CenterWindow Local $ctrlX = $cntr[0] + _Max(0, ($cntr[2] - $ctrl[2]) / 2) Local $ctrlY = $cntr[1] - $ctrl[3] - $GAP If $ctrlY < 0 Then $ctrlY = 0 WinMove($ControlWindow, "", $ctrlX, $ctrlY) ; Always place ToolBox fully to the left of CenterWindow Local $toolX = $cntr[0] - $tool[2] - $GAP Local $toolY = $cntr[1] + _Max(0, ($cntr[3] - $tool[3]) / 2) If $toolX < 0 Then $toolX = 0 WinMove($ToolBox, "", $toolX, $toolY) If Not $CenterAllWindows Then Return Local $WindowHandles[] = [$ControlWindow,$CenterWindow,$ToolBox] CenterWindowGroup($WindowHandles) EndFunc Func CenterWindowGroup($aHandles) If Not IsArray($aHandles) Or UBound($aHandles) = 0 Then Return Local $iMinX = 99999, $iMinY = 99999, $iMaxX = -1, $iMaxY = -1 ; Calculate bounding box For $i = 0 To UBound($aHandles) - 1 If Not WinExists($aHandles[$i]) Then ContinueLoop Local $aPos = WinGetPos($aHandles[$i]) If @error Then ContinueLoop $iMinX = _Min($iMinX, $aPos[0]) $iMinY = _Min($iMinY, $aPos[1]) $iMaxX = _Max($iMaxX, $aPos[0] + $aPos[2]) $iMaxY = _Max($iMaxY, $aPos[1] + $aPos[3]) Next Local $iGroupW = $iMaxX - $iMinX Local $iGroupH = $iMaxY - $iMinY Local $iScreenW = @DesktopWidth Local $iScreenH = @DesktopHeight Local $iOffsetX = Int(($iScreenW - $iGroupW) / 2) - $iMinX - 168 Local $iOffsetY = Int(($iScreenH - $iGroupH) / 2) - $iMinY - 36 ; Move each window For $i = 0 To UBound($aHandles) - 1 If Not WinExists($aHandles[$i]) Then ContinueLoop Local $aPos = WinGetPos($aHandles[$i]) WinMove($aHandles[$i], "", $aPos[0] + $iOffsetX, $aPos[1] + $iOffsetY) Next EndFunc Func helpParseGUIFunction($Line) ; Func Paramas Local $FunctionParametersBlob = StringRegExp($Line,"(?i)^\s*([_\-A-Za-z0-9]+\s*)\((.*)\).*$",1) Switch @error Case 1 MsgBox(4096,"Error","Cannot find Function Parameters." & @CRLF & " Ln# " & @ScriptLineNumber _ & @CRLF & @CRLF & " Ln: " & $Line) Return Case 2 MsgBox(4096,"Error","Fatal Error: Bad search pattern for $hWnd/$ControlID/Function Parameter search, @extended = " & @extended) Exit EndSwitch Local $Parameter = StringSplit($FunctionParametersBlob[1],",") Local $Params = $Parameter[0]+1 Local $Ret[$Params+1] $Ret[0] = $Params $Ret[1] = $FunctionParametersBlob[0] For $i=1 To $Parameter[0] $Ret[$i+1] = $Parameter[$i] Next Return $Ret EndFunc Func helpParseLocalGlobal($Line,$FIRST_TOKEN) ; Global Var = Func Paramas Local $HandleOrFunctionParametersBlob = StringRegExp($Line,"(?i)^\s*[_\-A-Za-z0-9]+\s+(\$[_\-A-Za-z0-9]+)\s+=\s+([_\-A-Za-z0-9]+\s*)\((.*)\).*$",1) Switch @error Case 1 Local $Variables, $Result, $Split $Result = MsgBox(4096+48+4,"Error","Do you want to try to define global variables? Arrays will not be processed." & @CRLF & @CRLF & " Line: " & $Line) If $Result = 6 Then $Variables = StringRegExp($Line,"(?:\$(\w+)\s*=\s*([^,]+))+",3) If Not @error Then _ArrayDisplay($Variables,"defining these") For $i=0 To UBound($Variables)-1 Step 2 If Not Assign($Variables[$i],Execute($Variables[$i+1]),2) Then LogToConsole("!>Failed to Assign $" & $Variables[$i] & " = " & $Variables[$i]) Else LogToConsole("$" & $Variables[$i] & "=" & Eval($Variables[$i])) EndIf Next EndIf EndIf Return Case 2 MsgBox(4096,"Error","Bad search pattern for $hWnd/$ControlID/Function Parameter search, @extended = " & @extended) Return EndSwitch Local $ParameterBlob = ReplaceUnquotedCommas($HandleOrFunctionParametersBlob[2],"|") If $ParameterBlob = "" Then ; NO support for GUICtrlCreateDummy or other NON-gui designer functions LogToConsole("!>" & $Line & " ; Not supported!") Return Else ; Attempt to prevent leading and trailing spaces $ParameterBlob = StringReplace($ParameterBlob,"| ","|") $ParameterBlob = StringReplace($ParameterBlob," |","|") Local $Parameter = StringSplit($ParameterBlob,"|") Local $Params = $Parameter[0]+3 Local $Ret[$Params+1] $Ret[0] = $Params $Ret[1] = $FIRST_TOKEN $Ret[2] = $HandleOrFunctionParametersBlob[0] $Ret[3] = $HandleOrFunctionParametersBlob[1] For $i=1 To $Parameter[0] $Ret[$i+3] = $Parameter[$i] Next EndIf ; _ArrayDisplay($Ret) Return $Ret EndFunc Func ReplaceUnquotedCommas($InString,$Replacement) Local $out = "", $inQuote = False, $parenDepth = 0 For $i = 1 To StringLen($InString) Local $char = StringMid($InString, $i, 1) Switch $char Case '"' $inQuote = Not $inQuote Case '(' If Not $inQuote Then $parenDepth += 1 Case ')' If Not $inQuote And $parenDepth > 0 Then $parenDepth -= 1 Case ',' If Not $inQuote And $parenDepth = 0 Then $char = $Replacement ; replace EndSwitch $out &= $char Next Return $out EndFunc Func ExecuteGuiFunction($Parameter) If Not IsArray($Parameter) Then MsgBox(4096+64,$WindowTitle,"ExecuteGuiFunction Error: parameter was not an array.") Return False EndIf Local $GUIFunction = $Parameter[1] $Parameter[1] = "CallArgArray" Local $ArgArray[$Parameter[0]],$Arg For $i=0 to $Parameter[0]-1 If $i > 0 Then $Arg = StringRegExpReplace($Parameter[$i+1],'^\s*"(.*)"\s*$',"$1") ; Remove "Quotes" If Not @extended Then If StringInStr($Parameter[$i+1],"BitOr") Then $Arg = Execute(StringReplace($Parameter[$i+1],"|",",")) ; Convert BitOr Pipes to Commas If $Arg = "" Then ; The String result needs to be Executed to easily apply the Style to the Window MsgBox(4096+16,"NewWindow Error","Bad Style Error: " & $Parameter[$i+1] & @CRLF & "Style will not be imported.") $Arg = -1 EndIf Else $Arg = Execute($Arg) EndIf EndIf $ArgArray[$i] = $Arg Else $ArgArray[$i] = $Parameter[$i+1] EndIf Next If $METRO_ENABLED Then $ArgArray[1] = GetCanvas() Call($GUIFunction,$ArgArray) If @error = 0xDEAD And @extended = 0xBEEF Then MsgBox($MB_SYSTEMMODAL, "", """" & $GUIFunction & """ Function does not exist or parameters are incorrect. Ln:" & @ScriptLineNumber) Return False Else Return True EndIf EndFunc Func ParseGUICode() Local $Code = TextEditor() If $Code = "" Then Return Local $Line = StringSplit($Code,@CRLF,1), $OkayToCreateControl = False, $FIRST_TOKEN, $Parameter, $ErrorMsg Local $ParseGUICodeError = 'ParseGUICode Error: GUICreate must create a GUI before any Controls are created. "_Metro_AddControlButtons" must be called for Metro windows. Function Call found: "' Local $FirstTokenError = 'Cannot find a FIRST_TOKEN; Local, Global, or Function Call on Ln:' Local $BadSearchError = "Bad search pattern for FIRST_TOKEN search, Ln:" & @ScriptLineNumber For $i=1 To $Line[0] If $Line[$i] = "" Then ContinueLoop $FIRST_TOKEN = StringRegExp($Line[$i],"(?i)^\s*([;~_\-A-Za-z0-9]+)[ (]",1) $ErrorMsg = @error=1 ? $FirstTokenError & $i & ' "' & $Line[$i] & '"' : $BadSearchError If @error Then Return MsgBox(4096+16,$WindowTitle,$ErrorMsg) Switch $FIRST_TOKEN[0] Case "Local","Global" ; Put the function name and prameters into an array $Parameter = helpParseLocalGlobal($Line[$i],$FIRST_TOKEN[0]) If Not IsArray($Parameter) Then ContinueLoop ; Bad code parsed or Variable assigned If $Parameter[3] = "GuiCreate" Then NewWindow($Parameter) $OkayToCreateControl = True ElseIf $Parameter[3] = "_Metro_CreateGUI" Then $Parameter[3] = "_Metro_CreateGUI_Wrapper" _ArrayAdd($Parameter,$GUI_Theme_Name) $Parameter[0]=UBound($Parameter)-1 NewWindow($Parameter) ElseIf $Parameter[3] = "_Metro_AddControlButtons" Then NewControl($Parameter) $GuiWindow[$GuiInFocus][10] &= StringRegExpReplace($Line[$i],"\s*(Local|Global)*\s*\$\w+\s+=\s+","") & "♫" $OkayToCreateControl = True Else If $OkayToCreateControl Then NewControl($Parameter) Else MsgBox(4096+16,$WindowTitle, $ParseGUICodeError & $Parameter[3] & '"') Return EndIf EndIf Case ";~",";" ContinueLoop Case Else If StringRegExp($FIRST_TOKEN[0],"^\s+;") Then ContinueLoop If StringInStr($FIRST_TOKEN[0],"GUISetState") Then ContinueLoop $Parameter = helpParseGUIFunction($Line[$i]) ; Execute GuiFunction and Save it to $GuiWindow If ExecuteGuiFunction($Parameter) And $ControlCount=0 Then If StringInStr($Line[$i],"_SetTheme") Then LogToConsole("!>Ignoring Gui Function _SetTheme") ContinueLoop EndIf $GuiWindow[$GuiInFocus][10] &= $Line[$i] & "♫" ; Else ; $GuiControl[$ControlCount-1][5] &= $Line[$i] & "♫" EndIf EndSwitch Next EndFunc ; ParseGUICode Func GUISave($Mode="Save") Local $Code="UserInterfaceBuilder♦",$idx,$hGUI = GetCanvas() Local $Properties Local $Text, $ControlPos Local $Title = WinGetTitle($hGUI) Local $GuiPos = WinGetClientSize($hGUI) Local $Style = GUIGetStyle($hGUI) Local $CanWriteFile = 0 Local $ControlState If $MenuCount > 0 Then $GuiPos[1] += $FileMenuHeight * $DPI EndIf ; Gui Window $Properties = $GuiWindow[$GuiInFocus][10] If $Properties <> "" Then If $METRO_ENABLED Then ; Change Gui Constructor $Code &= "Constructor→_Metro_CreateGUI_Wrapper" & "♦Name→" & $GuiWindow[$GuiInFocus][9] & "♦Text→" & $Title & "♦Left→-1♦Top→-1♦Width→" & $GuiPos[0] & "♦Height→" & $GuiPos[1] & _ "♦Style→" & True & "♦ExStyle→" & $GUI_Theme_Name & "♦Properties→" & $Properties & @CRLF ; True = Sizable window Else $Code &= "Constructor→GUICreate" & "♦Name→" & $GuiWindow[$GuiInFocus][9] & "♦Text→" & $Title & "♦Left→-1♦Top→-1♦Width→" & $GuiPos[0] & "♦Height→" & $GuiPos[1] & _ "♦Style→" & "0x" & hex($Style[0]) & "♦ExStyle→" & "0x" & hex($Style[1]) & "♦Properties→" & $Properties & @CRLF EndIf Else If $METRO_ENABLED Then ; Change Gui Constructor $Code &= "Constructor→_Metro_CreateGUI_Wrapper" & "♦Name→" & $GuiWindow[$GuiInFocus][9] & "♦Text→" & $Title & "♦Left→-1♦Top→-1♦Width→" & $GuiPos[0] & "♦Height→" & $GuiPos[1] & _ "♦Style→" & True & "♦ExStyle→" & $GUI_Theme_Name & @CRLF ; True = Sizable window ElseIf HasMetroControls("GuiSave is checking for Metro Controls") Then $Code &= "Constructor→GUICreate" & "♦Name→" & $GuiWindow[$GuiInFocus][9] & "♦Text→" & $Title & "♦Left→-1♦Top→-1♦Width→" & $GuiPos[0] & "♦Height→" & $GuiPos[1] & _ "♦Style→" & "0x" & hex($Style[0]) & "♦ExStyle→" & "0x" & hex($Style[1]) & "♦Properties→" & '_SetTheme("' & $GUI_Theme_Name & '")♫' & @CRLF Else $Code &= "Constructor→GUICreate" & "♦Name→" & $GuiWindow[$GuiInFocus][9] & "♦Text→" & $Title & "♦Left→-1♦Top→-1♦Width→" & $GuiPos[0] & "♦Height→" & $GuiPos[1] & _ "♦Style→" & "0x" & hex($Style[0]) & "♦ExStyle→" & "0x" & hex($Style[1]) & @CRLF EndIf EndIf ; File Menu If $MenuCount <> 0 Then For $i=0 to $MenuCount-1 $Code &= "Constructor→GUICtrlCreateMenu" & "♦Name→" & "Local $Menu" & StringRegExpReplace($GuiMenu[$i][1],"(?i)[^_0-9A-Za-z]","") & "♦Text→" & $GuiMenu[$i][1] & @CRLF Next For $j=0 to $MenuItemCount-1 $Code &= "Constructor→GUICtrlCreateMenuItem" & "♦Name→" & "Local $MenuItem" & StringRegExpReplace($GuiMenuItem[$j][1],"(?i)[^_0-9A-Za-z]","") & "♦Text→" & $GuiMenuItem[$j][1] & "♦Parent→" & $GuiMenuItem[$j][3] & @CRLF Next EndIf ; Gui Controls For $idx=0 to $ControlCount-1 ; SKIP DELETED CONTROLS If ControlIsDeleted($GuiControl[$idx][0]) Then ContinueLoop ; Get Control's text If StringInStr($GuiControl[$idx][1], "Metro") Then $Text = $GuiControl[$idx][6] ; You cannot GuiCtrlRead a Metro control Else If StringInStr($GuiControl[$idx][1], "CheckBox") Or StringInStr($GuiControl[$idx][1], "Radio") Then $Text = GUICtrlRead($GuiControl[$idx][0],1) Else $Text = StringReplace(GUICtrlRead($GuiControl[$idx][0]),@CRLF,"♥") EndIf EndIf ; Get Control's position $ControlPos = ControlGetPos($hGUI,"",$GuiControl[$idx][0]) If @error Then ContinueLoop ; Get Control's Properties $Properties = $GuiControl[$idx][5] If $Properties <> "" Then $Code &= "Constructor→" & $GuiControl[$idx][1] & "♦Name→" & $GuiControl[$idx][2] & "♦Text→" & $Text & "♦Left→" & $ControlPos[0] & "♦Top→" & $ControlPos[1] & "♦Width→" & $ControlPos[2] & "♦Height→" & $ControlPos[3] & _ "♦Style→" & $GuiControl[$idx][3] & "♦ExStyle→" & $GuiControl[$idx][4] & "♦Properties→" & $Properties & @CRLF Else If StringInStr($GuiControl[$idx][1],"_Metro_CreateProgress") Then $Code &= "Constructor→" & $GuiControl[$idx][1] & "♦Name→" & $GuiControl[$idx][2] & "♦Text→" & $GuiControl[$idx][6] & "♦Left→" & $ControlPos[0] & "♦Top→" & $ControlPos[1] & "♦Width→" & $ControlPos[2] & "♦Height→" & $ControlPos[3] & _ "♦Style→" & $GuiControl[$idx][3] & "♦ExStyle→" & $GuiControl[$idx][4] & $GuiControl[$idx][4] & "♦Properties→" & 'GUICtrlSetBkColor(-1,$COLOR_WHITE)♫' & @CRLF ;~ ElseIf StringInStr($GuiControl[$idx][1],"_Metro_CreateRadio") Then ;~ ;'("RadioGroup1","' & $GuiControl[$i][6] ;~ $Code &= "Constructor→" & $GuiControl[$idx][1] & "♦Name→" & $GuiControl[$idx][2] & "♦Text→" & $GuiControl[$idx][6] & "♦Left→" & $ControlPos[0] & "♦Top→" & $ControlPos[1] & "♦Width→" & $ControlPos[2] & "♦Height→" & $ControlPos[3] & _ ;~ "♦Style→" & $GuiControl[$idx][3] & "♦ExStyle→" & $GuiControl[$idx][4] & @CRLF ElseIf StringInStr($GuiControl[$idx][1],"Seperator") Then If $ControlPos[2] > $ControlPos[3] Then Local $Biggest = $ControlPos[2] Local $Smallest = $ControlPos[3] Else Local $Biggest = $ControlPos[3] Local $Smallest = $ControlPos[2] EndIf $Code &= "Constructor→" & $GuiControl[$idx][1] & "♦Name→" & $GuiControl[$idx][2] & "♦Text→" & $GuiControl[$idx][6] & "♦Left→" & $ControlPos[0] & "♦Top→" & $ControlPos[1] & "♦Width→" & $Biggest & "♦Height→" & $Smallest & _ "♦Style→" & $GuiControl[$idx][3] & "♦ExStyle→" & $GuiControl[$idx][4] & @CRLF ElseIf StringInStr($GuiControl[$idx][1],"Input_Wrapper") Then $Code &= "Constructor→" & $GuiControl[$idx][1] & "♦Name→" & $GuiControl[$idx][2] & "♦Text→" & $GuiControl[$idx][6] & "♦Left→" & $ControlPos[0] + 6 & "♦Top→" & $ControlPos[1] + 6 & "♦Width→" & $ControlPos[2] - 12& "♦Height→" & $ControlPos[3] - 12& _ "♦Style→" & $GuiControl[$idx][3] & "♦ExStyle→" & $GuiControl[$idx][4] & @CRLF ElseIf StringInStr($GuiControl[$idx][1],"_Metro_") Then $Code &= "Constructor→" & $GuiControl[$idx][1] & "♦Name→" & $GuiControl[$idx][2] & "♦Text→" & $GuiControl[$idx][6] & "♦Left→" & $ControlPos[0] & "♦Top→" & $ControlPos[1] & "♦Width→" & $ControlPos[2] & "♦Height→" & $ControlPos[3] & _ "♦Style→" & $GuiControl[$idx][3] & "♦ExStyle→" & $GuiControl[$idx][4] & @CRLF Else $Code &= "Constructor→" & $GuiControl[$idx][1] & "♦Name→" & $GuiControl[$idx][2] & "♦Text→" & $Text & "♦Left→" & $ControlPos[0] & "♦Top→" & $ControlPos[1] & "♦Width→" & $ControlPos[2] & "♦Height→" & $ControlPos[3] & _ "♦Style→" & $GuiControl[$idx][3] & "♦ExStyle→" & $GuiControl[$idx][4] & @CRLF EndIf EndIf Next ;~ TextEditor($Code) Switch $Mode Case "Save" If $SaveFile = "" Then Local $Filename = FileSaveDialog("Save",@DesktopDir,$WindowTitle & " (*.gui)|Text (*.txt)",2,$Title,$ControlWindow) Else Local $Filename = $SaveFile EndIf Case "SaveAs" Local $Filename = FileSaveDialog("SaveAs",@DesktopDir,$WindowTitle & " (*.gui)|Text (*.txt)",18,$Title,$ControlWindow) Case "AutoSave" Local $Filename = $AutoSaveFile Case Else Return MsgBox(4096+16,$WindowTitle,"GUISave Fatal Error: """ & $Mode & """ is not a valid Save Mode. Err#1") EndSwitch If $Filename <> "" Then Local $hFile = FileOpen($Filename,2) ; OVERWRITE If $hFile = -1 Then Return MsgBox(4096+16,$WindowTitle,"Fatal Error: The file may be in use or you do not have access rights to the file.") Local $CanWriteFile = FileWrite($hFile,$Code) FileClose($hFile) If $CanWriteFile And $Mode <> "AutoSave" Then If $Mode = "SaveAs" Then ; SaveAs $SaveFile = $Filename EndIf WinSetTitle($ControlWindow,"",$SaveFile & " - Control Window") $HasNoChangeIndicator = True $GuiHasChanges = False PromoteRecentListTop($Filename) EndIf ;Else ;MsgBox(4096+16,$WindowTitle,"GUISave Logical Error: The file name is blank. Ln:" & @ScriptLineNumber) EndIf Return $CanWriteFile EndFunc ; <== GUISave Func OpenUserInterfaceFile($Filename="") ;If Not IsDeclared("GuiHasChanges") Then SetError(1,Main(),0) Local $Saved If $GuiHasChanges Then Switch MsgBox(4096+32+$MB_YESNOCANCEL,$WindowTitle,"Do you want to save this User Interface?") Case $IDYES If $SaveFile <> "" Then $Saved = GUISave() Else $Saved = GUISave("SaveAs") EndIf If Not $Saved Then Return Case $IDCANCEL Return EndSwitch EndIf Local $Constructor,$Name,$Text,$Left,$Top,$Width,$Height,$Style,$ExStyle,$Parent,$GUIFunction If $Filename = "" Then $Filename = FileOpenDialog("Open",@DesktopDir,$WindowTitle & " (*.gui)|Text (*.txt)",1,"",$ControlWindow) If @error Then Return EndIf Local $Control = FileReadToArray($Filename) If @error Then MsgBox(4096+16,$WindowTitle,"Check the file name. Ln:" & @ScriptLineNumber-4) Return EndIf Local $EndOfFile = @extended-1 Local $Properties="" Local $GuiCreateCalled = False For $i=0 To $EndOfFile If StringInStr($Control[$i],";",1,1,1,1) Then ContinueLoop ; Line is REM'd out $Pair = StringSplit($Control[$i],"♦") For $j=1 To $Pair[0] $Value = StringSplit($Pair[$j],"→") If $Value[0] = 1 Then ContinueLoop ; If the Pair is just the "UserInterfaceBuilder♦" Header Assign($Value[1],$Value[2],1) Next If Not $GuiCreateCalled And ($Constructor <> "GuiCreate" And $Constructor <> "_Metro_CreateGUI_Wrapper") Then MsgBox(4096+16,$WindowTitle, "Invalid file or Constructor: First Constructor should be a GuiCreate Call. """ & $Constructor & """ was Called. Ln.: " & @ScriptLineNumber) Return Else $GuiCreateCalled = True EndIf Local $CleanName,$ParentID,$SplitName=StringSplit($Name," ") Switch $Constructor Case "GUICreate", "_Metro_CreateGUI_Wrapper" Local $WindowDefinition = [11,$SplitName[1],$SplitName[2],$Constructor,'"' & $Text & '"',$Width,$Height,$Left,$Top,$Style,$ExStyle,"$ToolBox"] If Not NewWindow($WindowDefinition) Then MsgBox(4096+16,$WindowTitle,"The User Interface has incorrect Styles or formating errors. Delete the Styles and try again.") ExitLoop EndIf ; All existing Controls and Menus are delete by NewWindow() If $Properties <> "" Then $Property = StringSplit($Properties,"♫") For $k=1 To $Property[0]-1 If StringInStr($Property[$k],"_Metro_AddWindows11StyleCorners") Then $GuiWindow[$GuiInFocus][10] &= $Property[$k] & "♫" $Property[$k] = StringRegExpReplace($Property[$k],"\(\s*.*(\s*,|\)\s*)",'(' & GetCanvas() & "$1", 1) Execute($Property[$k]) LogToConsole("Execute Property:" & $Property[$k] & " Error: " & @error) ContinueLoop ElseIf StringInStr($Property[$k],"_Metro_AddControlButtons") Then $Control_Buttons = Execute($Property[$k]) LogToConsole("Execute Property:" & $Property[$k] & " Error: " & @error) $GuiWindow[$GuiInFocus][10] &= $Property[$k] & "♫" $METRO_CLOSE_BUTTON = $Control_Buttons[0] $METRO_MAXIMIZE_BUTTON = $Control_Buttons[1] $METRO_RESTORE_BUTTON = $Control_Buttons[2] $METRO_MINIMIZE_BUTTON = $Control_Buttons[3] $METRO_FULLSCREEN_BUTTON = $Control_Buttons[4] $METRO_FSRestore_BUTTON = $Control_Buttons[5] $METRO_MENU_BUTTON = $Control_Buttons[6] ContinueLoop EndIf Execute($Property[$k]) LogToConsole("Execute Property:" & $Property[$k] & " Error: " & @error) $GuiWindow[$GuiInFocus][10] &= $Property[$k] & "♫" Next $Properties="" EndIf If $Constructor = "GUICreate" Then OverrideThemeColors() Case "GUICtrlCreateMenuItem" If $MenuCount = 0 Then Return MsgBox(4096+16, $WindowTitle, "Menu bar does not exist. Ln:" & @ScriptLineNumber) If $MenuItemCount = $MaxMenuItems Then Return MsgBox(4096+16, $WindowTitle, "Maximum MenuItems have been reached. Ln:" & @ScriptLineNumber) $CleanName = "$Menu" & StringRegExpReplace($Text,"[^_0-9A-Za-z]","") ; Correct ControlID before Call - De-Reference $VariableName to INT For $k=0 To $MenuCount-1 If $GuiMenu[$k][3] = $Parent Then $VariableName = $Parent ; Save Parent $VariableName $ParentID = $GuiMenu[$k][0] ; Parent ControlID "68" ExitLoop EndIf Next $GuiMenuItem[$MenuItemCount][0] = Call("GUICtrlCreateMenuItem",$Text,$ParentID) If @error = 0xDEAD And @extended = 0xBEEF Then Return MsgBox($MB_SYSTEMMODAL, "", """" & $GUIFunction & """ Function does not exist. Ln:" & @ScriptLineNumber) $GuiMenuItem[$MenuItemCount][1] = $Text ; "&Open" $GuiMenuItem[$MenuItemCount][2] = $ParentID ; Parent ControlID "68" $GuiMenuItem[$MenuItemCount][3] = $VariableName ; "$MenuFile" ; No Scope $MenuItemCount+=1 Case "GUICtrlCreateMenu" $CleanName = "$Menu" & StringRegExpReplace($Text,"[^_0-9A-Za-z]","") $GuiMenu[$MenuCount][0] = Call("GUICtrlCreateMenu",$Text) If @error = 0xDEAD And @extended = 0xBEEF Then Return MsgBox($MB_SYSTEMMODAL, "", """" & $GUIFunction & """ Function does not exist. Ln:" & @ScriptLineNumber) $GuiMenu[$MenuCount][1] = $Text ; Menu Text $GuiMenu[$MenuCount][2] = "Local" ; Variable Scope $GuiMenu[$MenuCount][3] = $SplitName[2] ; $VariableName $MenuCount+=1 Case Else If $ControlCount = $MaxControls Then Return NewControl($Constructor,$Name,StringReplace($Text,"♥",@CRLF),$Left,$Top,$Width,$Height,$Style,$ExStyle) If $Properties <> "" Then $Property = StringSplit($Properties,"♫") For $k=1 To $Property[0]-1 Execute($Property[$k]) $GuiControl[$ControlCount-1][5] &= $Property[$k] & "♫" Next $Properties="" EndIf ; $GuiControl[$ControlCount][2] = $Name ; $ControlCount+=1 EndSwitch Next $GuiHasChanges = False $SaveFile = $Filename WinSetTitle($ControlWindow,"",$SaveFile & " - Control Window") $HasNoChangeIndicator = True PromoteRecentListTop($Filename) EndFunc ; OpenUserInterfaceFile Func PromoteRecentListTop($Filename) Local $reg_sz, $FullPath, $ItemCount = 0, $MaximumItems = 9 Local $RecentList = "HKCU\SOFTWARE\" & $WindowTitle & "\RecentList" Local $RecentMenuItem[0] ; Read all valid entries into array, skipping duplicates and empty ones For $i = 1 To $MaximumItems $reg_sz = RegEnumVal($RecentList, $i) If @error Or $reg_sz = "" Then ContinueLoop $FullPath = RegRead($RecentList, $reg_sz) If @error Or $FullPath = "" Or $FullPath = $Filename Then ContinueLoop ReDim $RecentMenuItem[UBound($RecentMenuItem) + 1] $RecentMenuItem[UBound($RecentMenuItem) - 1] = $FullPath Next ; Prepend new file ReDim $RecentMenuItem[_Min(UBound($RecentMenuItem) + 1, $MaximumItems)] For $i = UBound($RecentMenuItem) - 1 To 1 Step -1 $RecentMenuItem[$i] = $RecentMenuItem[$i - 1] Next $RecentMenuItem[0] = $Filename ; Clear old entries RegDelete($RecentList, "") ; Write new list For $i = 0 To UBound($RecentMenuItem) - 1 RegWrite($RecentList, $MaximumItems - $i, "REG_SZ", $RecentMenuItem[$i]) Next RegWrite($RecentList, "", "REG_SZ", _Min(UBound($RecentMenuItem), $MaximumItems)) ; default count PopulateRecentsMenu($MenuFile) EndFunc Func PopulateRecentsMenu($ParentMenuID) Local $MaximumItems = 9, $ItemCount = 1 Local $RecentList = "HKCU\SOFTWARE\" & $WindowTitle & "\RecentList" Local $RecentCount = RegRead($RecentList, "") If Not StringIsInt($RecentCount) Then Return For $i = $MaximumItems To 1 Step -1 Local $FullPath = RegRead($RecentList, $i) If @error Or $FullPath = "" Then ContinueLoop GUICtrlSetData(Eval("MenuItemRecent" & $ItemCount), $FullPath) $ItemCount += 1 If $ItemCount > $MaximumItems Then ExitLoop Next EndFunc Func TransformFontDialog() $hWnd = WinWaitActive("Font","&Font:") ControlMove($hWnd,"","[CLASS:Button; INSTANCE:5]",129,275) ; ok ControlMove($hWnd,"","[CLASS:Button; INSTANCE:6]",215,275) ; cancel ControlMove($hWnd,"","[CLASS:Static; INSTANCE:4]",12,199,156,17) ; "Color" label ControlMove($hWnd,"","[CLASS:ComboBox; INSTANCE:4]",12,220,149,22) ; "Color" Combo ControlHide($hWnd,"","[CLASS:Button; INSTANCE:1]") ControlHide($hWnd,"","[CLASS:Button; INSTANCE:2]") ControlHide($hWnd,"","[CLASS:Button; INSTANCE:3]") ControlHide($hWnd,"","[CLASS:ComboBox; INSTANCE:5]") ControlHide($hWnd,"","[CLASS:Static; INSTANCE:6]") ControlHide($hWnd,"","[CLASS:Static; INSTANCE:7]") ControlMove($hWnd,"","[CLASS:ComboBox; INSTANCE:3]",347,30,63,155) ; Font Size Combo ;~ ControlMove($hWnd,"","[CLASS:Button; INSTANCE:4]",12,182,400,81) ;preview box ControlSetText($hWnd,"","[CLASS:Button; INSTANCE:4]","Preview") ControlSetText($hWnd,"","[CLASS:Static; INSTANCE:5]","The Quick Brown Fox Jumped Over the High Fence.") WinSetTrans($hWnd,"",227) WinMove($hWnd,"",@DesktopWidth/2-215,@DesktopHeight/2-234,431,360-16) WinSetOnTop($hWnd,"",1) EndFunc Func PasteFromFile() $Filename = FileOpenDialog("Open",@DesktopDir,"GUI Controls Copy (*.ctrls)|" & $WindowTitle & " (*.gui)|Text (*.txt)",1,"",$ControlWindow) If @error Then Return Local $Line = FileReadToArray($Filename) If @error Then MsgBox(4096+16,$WindowTitle,"Check the file name. Ln:" & @ScriptLineNumber-2) Return EndIf Local $EndOfFile = @extended-1, $Clip = "" For $i=0 To $EndOfFile $Clip &= $Line[$i] & @CRLF Next ClipPut($Clip) WinActivate(GetCanvas()) Send("^v") EndFunc Func OpenRecentItem($ControlID) $RecentItem = GUICtrlRead($ControlID,1) If FileExists($RecentItem) Then OpenUserInterfaceFile($RecentItem) Else MsgBox(4096+16,$WindowTitle,"The file no longer Exists." & @CRLF & @CRLF & $RecentItem) Return EndIf EndFunc Func params() Local $Params = StringSplit($cmdline[2],"&:",1) Local $StructDefine = "struct;", $Pairs, $Length=0, $TmpStr = "" For $Item=1 To $Params[0] $Pair = StringSplit($Params[$Item],"?:",1) $Length = StringLen($Pair[2]) $TmpStr = "CHAR " & $Pair[1] & "[" & $Length & "];" If $Item = $Params[0] Then $TmpStr &= "endstruct" $StructDefine &= $TmpStr Next $Param = DllStructCreate($StructDefine) Switch @error Case 1 MsgBox(4096+16,$WindowTitle,"Fatal Error: Variable passed to DllStructCreate was not a string.") Exit Case 2 MsgBox(4096+16,$WindowTitle,"Fatal Error: There is an unknown Data Type in the string passed.") Exit Case 3 MsgBox(4096+16,$WindowTitle,"Fatal Error: Failed to allocate the memory needed for the struct, or Pointer = 0.") Exit Case 4 MsgBox(4096+16,$WindowTitle,"Fatal Error: Error allocating memory for the passed string.") Exit Case Else ; EndSwitch For $Item=1 To $Params[0] $Pair = StringSplit($Params[$Item],"?:",1) DllStructSetData($Param,$Pair[1],$Pair[2]) Switch @error Case 1 MsgBox(4096+16,$WindowTitle,"Fatal Error: Struct not a valid struct returned by DllStructCreate().") Exit Case 2 MsgBox(4096+16,$WindowTitle,"Fatal Error: Element out of range or unknown.") Exit Case 3 MsgBox(4096+16,$WindowTitle,"Fatal Error: Index out of range.") Exit Case 4 MsgBox(4096+16,$WindowTitle,"Fatal Error: Element data type is unknown.") Exit Case 5 MsgBox(4096+16,$WindowTitle,"Fatal Error: Index <=0.") Exit Case Else ; EndSwitch Next Main() EndFunc ;==>params Func Start($StringCall) ;~ Run(@ComSpec & " /C AutoIt3.exe """ & @ScriptFullPath & """ ""Notify"" ""Hello World.""","C:\Program Files (x86)\AutoIt3") Return Run(@ComSpec & " /C AutoIt3.exe """ & @ScriptFullPath & """ " & $StringCall ,"C:\Program Files (x86)\AutoIt3",@SW_HIDE) EndFunc Func LogToConsole($msg=@CRLF) ConsoleWrite($msg & @CRLF) Return 1 EndFunc ;==>LogToConsole Func LogToConsole2($VariableNameString) ConsoleWrite("$" & $VariableNameString & "=[" & Eval($VariableNameString) & "]" & @CRLF) Return 1 EndFunc ;<==== LogToConsole2 Func W($msg=@CRLF) ConsoleWrite($msg & @CRLF) EndFunc ;==>W Func SetStyleDialog($Constructor="",$StyleIn=-1,$ExStyleIn=-1) Return MsgBox(4096+48,$WindowTitle,"Not ready.") Local $ListPicks = "", $Style = "", $CountSelected = 0 Local Static $ShowMetroWarning=True If StringInStr($Constructor,"_Metro_") Then If $ShowMetroWarning Then MsgBox(4906+48,$WindowTitle,"Metro Controls cannot be styled. They are GUICtrlCreatePic Controls and there would be no reason to style them.") $ShowMetroWarning = False EndIf Return SetError(1,0,False) EndIf Local $StyleWindow = GUICreate("Pick Styles",549,357,-1,-1,0x96C80000,0x00040108) Local $ListStyles = GUICtrlCreateList("",20,20,200,316,BitOR($SS_SIMPLE,$WS_VSCROLL)) GuiCtrlSetBkColor(-1,0xE4EEF7) Local $StyleType = $Constructor="" ? "$WS" : GetStylePreFix($Constructor) ; $StylesList is a Global _GUICtrlListBox_BeginUpdate($ListStyles) For $i=1 To $StylesList[0] ; List Styles belonging that to specific control only If StringInStr($StylesList[$i],$StyleType) Then GUICtrlSetData($ListStyles,$StylesList[$i] & "|") Next _GUICtrlListBox_EndUpdate($ListStyles) Local $ListSelections = GUICtrlCreateList("",330,20,200,316,BitOR($SS_SIMPLE,$WS_VSCROLL)) GuiCtrlSetBkColor(-1,0xE4EEF7) ; Select Style already applied _GUICtrlListBox_BeginUpdate($ListSelections) Local $aNormalStyles = HexToStyleString($ExStyleIn,$StyleType,True) For $i=0 to $aNormalStyles[0] GUICtrlSetData($ListSelections, $aNormalStyles[$i] & "|") $ListPicks &= $Style & "," $CountSelected+=1 Next Local $aExtendedStyles = HexToStyleString($StyleIn,$StyleType & "_EX",True) For $i=0 to $aExtendedStyles[0] GUICtrlSetData($ListSelections, $aExtendedStyles[$i] & "|") $ListPicks &= $Style & "," $CountSelected+=1 Next _GUICtrlListBox_EndUpdate($ListSelections) Local $ButtonOK = GUICtrlCreateButton("OK",231,121,87,29) Local $ButtonCancel = GUICtrlCreateButton("Cancel",231,162,87,29) Local $ButtonClearStyles = GUICtrlCreateButton("Clear",231,204,87,29) ; Local $ButtonAddStyle = GUICtrlCreateButton(">>",231,80,87,29) GUISetState() While 1 Switch GUIGetMsg() Case $ListStyles ; Clicked, Move style to List of picks $Style = GUICtrlRead($ListStyles) GUICtrlSetData($ListSelections, $Style & "|") $ListPicks &= $Style & "," $CountSelected+=1 Case $ButtonClearStyles GUICtrlSetData($ListSelections,"") GUICtrlSetData($ListStyles,"") _GUICtrlListBox_BeginUpdate($ListStyles) For $i=1 To $StylesList[0] If StringInStr($StylesList[$i],$StyleType) Then GUICtrlSetData($ListStyles,$StylesList[$i] & "|") Next _GUICtrlListBox_EndUpdate($ListStyles) $ListPicks = "" $CountSelected=0 Case $ButtonOK If $ListPicks = "" Then ExitLoop ; $Selected is a Global If $Selected <> "" Then ; Style multiple controls $Control = StringSplit($Selected,"|") For $i=1 to $Control[0]-1 ; Get index to save the data $idx = GetIndexForGUICtrl($Control[$i]) If $idx = -1 Then ContinueLoop 2 MsgBox(4096+48,$WindowTitle,"Abort: Could not find control in $GuiControl array. Ln.: " & @ScriptLineNumber) EndIf ; Split selected EX styles from normal styles Local $aListPicks = StringSplit(StringTrimRight($ListPicks,1),",") Local $NormalBitOrArgs="",$ExtendedBitOrArgs="" For $j=1 To $aListPicks[0] If StringInStr($aListPicks[$j],"_EX") Then $ExtendedBitOrArgs &= $aListPicks[$j] Else $NormalBitOrArgs &= $aListPicks[$j] EndIf Next ; Apply all styles If $CountSelected > 1 Then ; Eval selected styles Local $BitOrArgs = StringSplit(StringTrimRight($ListPicks,1),",") For $i=1 to $BitOrArgs[0] $BitOrArgs[$i] = Eval(StringTrimLeft($BitOrArgs[$i],1)) Next ; Apply styles with a Call $BitOrArgs[0] = "CallArgArray" Local $Result = Call("BitOR",$BitOrArgs) If @error = 0xDEAD And @extended = 0xBEEF Then MsgBox(4096, $WindowTitle, "Call failed: BitOR") GUICtrlSetStyle(int($Control[$i]),$Result) Else ; Apply one style GUICtrlSetStyle($Control[$i],StringTrimRight($ListPicks,1)) EndIf $GuiControl[$idx][5] = StringRegExpReplace($GuiControl[$idx][5],"(?Ui)GuiCtrlSetBkColor.*♫","") ; Remove previous color setting $GuiControl[$idx][5] &= 'GuiCtrlSetBkColor(-1,' & "" & ')' & '♫' Next Else ; Style the Gui GUISetStyle(GetCanvas()) $GuiWindow[$GuiInFocus][10] = StringRegExpReplace($GuiWindow[$GuiInFocus][10],"(?Ui)GUISetBkColor.*♫","") ; Remove previous color $GuiWindow[$GuiInFocus][10] &= 'GUISetBkColor(' & "" & ')' & '♫' EndIf $GuiHasChanges = True ExitLoop Case $GUI_EVENT_CLOSE,$ButtonCancel GUIDelete($StyleWindow) Return SetError(1,0,False) EndSwitch WEnd GUIDelete($StyleWindow) Return True EndFunc ; <==== SetStyleDialog Func _Metro_CreateGUI_Wrapper($Title,$Width,$Height,$Left=-1,$Top=-1,$Resizable=True,$MetroTheme=-1,$Parent=-1) If $Parent=-1 Then $Parent=$ToolBox _SetTheme($MetroTheme) ; Just sets some Globals LogToConsole("!>_Metro_CreateGUI_Wrapper Set theme to " & $MetroTheme) Local $Ret = _Metro_CreateGUI($Title, $Width, $Height, $Left, $Top, $Resizable, $Parent) ; True for resizable window If IsHWnd($Ret) Then _Metro_SetGUIOption($Ret, True, True) ; I had to do this because $Left=-1,$Top=-1 was not working WinMove($Ret,"",@DesktopWidth/2-320,@DesktopHeight/2-235) $METRO_ENABLED = True LogToConsole("!>_Metro_CreateGUI_Wrapper created window") EndIf Return $Ret EndFunc Func HasMetroControls($Caller,$DoNotRetest=True) Local Static $HasMetroControls = False If Not $DoNotRetest Then LogToConsole($Caller & "->Set $HasMetroControls = False") $HasMetroControls = False EndIf If Not $HasMetroControls Then For $i=0 To $ControlCount-1 If $GuiControl[$i][6] <> "" Then $HasMetroControls = True LogToConsole($Caller & "-> Gui has Metro Controls") ExitLoop EndIf Next EndIf Return $HasMetroControls EndFunc Func _Metro_CreateRadio_Wrapper($Text, $Left, $Top, $Width, $Height, $Style=-1, $ExStyle=-1) Return _Metro_CreateRadio("Group1",$Text, $Left, $Top, $Width, $Height) EndFunc Func _Metro_CreateRadioEx_Wrapper($Text, $Left, $Top, $Width, $Height, $Style=-1, $ExStyle=-1) Return _Metro_CreateRadioEx("Group1",$Text, $Left, $Top, $Width, $Height) EndFunc Func _Metro_CreateProgress_Wrapper($Text, $Left, $Top, $Width, $Height, $Style=-1, $ExStyle=-1) Return GUICtrlCreateLabel("",$Left, $Top, $Width, $Height) EndFunc Func _Metro_CreateInput_Wrapper($Text, $Left, $Top, $Width, $Height, $Style=-1, $ExStyle=-1) Local $Padding = 6 Local $BorderColor = $ButtonBKColor Return _Metro_CreateUnderlinedRoundedRectangle("", $Left, $Top, $Width, $Height, 0xFFFFFF, $BorderColor,True,$Padding) EndFunc Func _Metro_AddHSeperator_Wrapper($Text, $Left, $Top, $Width, $Size, $Style=-1, $ExStyle=-1) Return _Metro_AddHSeperator($Left, $Top, $Width, $Size) EndFunc Func _Metro_AddVSeperator_Wrapper($Text, $Left, $Top, $Height, $Size, $Style=-1, $ExStyle=-1) Return _Metro_AddVSeperator($Left, $Top, $Height, $Size) EndFunc Func _EventProc($hEventHook, $iEvent, $hWnd, $iObjectID, $iChildID, $iThreadId, $iEventTime) #forceref $hEventHook, $iObjectID, $iChildID, $iThreadId, $iEventTime Local Static $MainWindowVisible = True Switch $hWnd Case GetCanvas(), $ToolBox, $ControlWindow Switch $iEvent Case $EVENT_SYSTEM_MOVESIZEEND RepositionWindowsAroundGUI(False) Case 0x3 ; App has focus if Not $MainWindowVisible Then WinActivate($ToolBox) WinActivate($ControlWindow) WinActivate(GetCanvas()) EndIf $MainWindowVisible = True EndSwitch Case Else If $iEvent = 0x3 Then ; App lost focus $MainWindowVisible = False EndIf EndSwitch EndFunc ;==>_EventProc Func StylesListGlobals() Local $List = "" $List &= "$WS_EX_ACCEPTFILES|" $List &= "$WS_EX_APPWINDOW|" $List &= "$WS_EX_COMPOSITED|" $List &= "$WS_EX_CLIENTEDGE|" $List &= "$WS_EX_CONTEXTHELP|" $List &= "$WS_EX_DLGMODALFRAME|" $List &= "$WS_EX_LAYOUTRTL|" $List &= "$WS_EX_MDICHILD|" $List &= "$WS_EX_OVERLAPPEDWINDOW|" $List &= "$WS_EX_STATICEDGE|" $List &= "$WS_EX_TOPMOST|" $List &= "$WS_EX_TRANSPARENT|" $List &= "$WS_EX_TOOLWINDOW|" $List &= "$WS_EX_WINDOWEDGE|" $List &= "$WS_EX_LAYERED|" $List &= "$GUI_WS_EX_PARENTDRAG|" $List &= "$WS_BORDER|" $List &= "$WS_POPUP|" $List &= "$WS_CAPTION|" $List &= "$WS_CLIPCHILDREN|" $List &= "$WS_CLIPSIBLINGS|" $List &= "$WS_DISABLED|" $List &= "$WS_DLGFRAME|" $List &= "$WS_HSCROLL|" $List &= "$WS_MAXIMIZE|" $List &= "$WS_MAXIMIZEBOX|" $List &= "$WS_MINIMIZE|" $List &= "$WS_MINIMIZEBOX|" $List &= "$WS_OVERLAPPED|" $List &= "$WS_OVERLAPPEDWINDOW|" $List &= "$WS_POPUPWINDOW|" $List &= "$WS_SIZEBOX|" $List &= "$WS_SYSMENU|" $List &= "$WS_THICKFRAME|" $List &= "$WS_VSCROLL|" $List &= "$WS_VISIBLE|" $List &= "$WS_CHILD|" $List &= "$WS_GROUP|" $List &= "$WS_TABSTOP|" $List &= "$DS_MODALFRAME|" $List &= "$DS_SETFOREGROUND|" $List &= "$DS_CONTEXTHELP|" $List &= "$BS_3STATE|" $List &= "$BS_AUTO3STATE|" $List &= "$BS_AUTOCHECKBOX|" $List &= "$BS_CHECKBOX|" $List &= "$BS_LEFT|" $List &= "$BS_PUSHLIKE|" $List &= "$BS_RIGHT|" $List &= "$BS_RIGHTBUTTON|" $List &= "$BS_GROUPBOX|" $List &= "$BS_AUTORADIOBUTTON|" $List &= "$BS_BOTTOM|" $List &= "$BS_CENTER|" $List &= "$BS_DEFPUSHBUTTON|" $List &= "$BS_MULTILINE|" $List &= "$BS_TOP|" $List &= "$BS_VCENTER|" $List &= "$BS_ICON|" $List &= "$BS_BITMAP|" $List &= "$BS_FLAT|" $List &= "$BS_NOTIFY|" $List &= "$CBS_AUTOHSCROLL|" $List &= "$CBS_DISABLENOSCROLL|" $List &= "$CBS_DROPDOWN|" $List &= "$CBS_DROPDOWNLIST|" $List &= "$CBS_LOWERCASE|" $List &= "$CBS_NOINTEGRALHEIGHT|" $List &= "$CBS_OEMCONVERT|" $List &= "$CBS_SIMPLE|" $List &= "$CBS_SORT|" $List &= "$CBS_UPPERCASE|" $List &= "$LBS_DISABLENOSCROLL|" $List &= "$LBS_NOINTEGRALHEIGHT|" $List &= "$LBS_NOSEL|" $List &= "$LBS_NOTIFY|" $List &= "$LBS_SORT|" $List &= "$LBS_STANDARD|" $List &= "$LBS_USETABSTOPS|" $List &= "$ES_AUTOHSCROLL|" $List &= "$ES_AUTOVSCROLL|" $List &= "$ES_CENTER|" $List &= "$ES_LOWERCASE|" $List &= "$ES_NOHIDESEL|" $List &= "$ES_NUMBER|" $List &= "$ES_OEMCONVERT|" $List &= "$ES_MULTILINE|" $List &= "$ES_PASSWORD|" $List &= "$ES_READONLY|" $List &= "$ES_RIGHT|" $List &= "$ES_UPPERCASE|" $List &= "$ES_WANTRETURN|" $List &= "$PBS_MARQUEE|" $List &= "$PBS_SMOOTH|" $List &= "$PBS_SMOOTHREVERSE|" $List &= "$PBS_VERTICAL|" $List &= "$UDS_ALIGNLEFT|" $List &= "$UDS_ALIGNRIGHT|" $List &= "$UDS_ARROWKEYS|" $List &= "$UDS_HORZ|" $List &= "$UDS_NOTHOUSANDS|" $List &= "$UDS_WRAP|" $List &= "$SS_BLACKFRAME|" $List &= "$SS_BLACKRECT|" $List &= "$SS_CENTER|" $List &= "$SS_CENTERIMAGE|" $List &= "$SS_ETCHEDFRAME|" $List &= "$SS_ETCHEDHORZ|" $List &= "$SS_ETCHEDVERT|" $List &= "$SS_GRAYFRAME|" $List &= "$SS_GRAYRECT|" $List &= "$SS_LEFT|" $List &= "$SS_LEFTNOWORDWRAP|" $List &= "$SS_NOPREFIX|" $List &= "$SS_NOTIFY|" $List &= "$SS_RIGHT|" $List &= "$SS_RIGHTJUST|" $List &= "$SS_SIMPLE|" $List &= "$SS_SUNKEN|" $List &= "$SS_WHITEFRAME|" $List &= "$SS_WHITERECT|" $List &= "$TCS_SCROLLOPPOSITE|" $List &= "$TCS_BOTTOM|" $List &= "$TCS_RIGHT|" $List &= "$TCS_MULTISELECT|" $List &= "$TCS_FLATBUTTONS|" $List &= "$TCS_FORCEICONLEFT|" $List &= "$TCS_FORCELABELLEFT|" $List &= "$TCS_HOTTRACK|" $List &= "$TCS_VERTICAL|" $List &= "$TCS_TABS|" $List &= "$TCS_BUTTONS|" $List &= "$TCS_SINGLELINE|" $List &= "$TCS_MULTILINE|" $List &= "$TCS_RIGHTJUSTIFY|" $List &= "$TCS_FIXEDWIDTH|" $List &= "$TCS_RAGGEDRIGHT|" $List &= "$TCS_FOCUSONBUTTONDOWN|" $List &= "$TCS_OWNERDRAWFIXED|" $List &= "$TCS_TOOLTIPS|" $List &= "$TCS_FOCUSNEVER|" $List &= "$DTS_UPDOWN|" $List &= "$DTS_SHOWNONE|" $List &= "$DTS_LONGDATEFORMAT|" $List &= "$DTS_TIMEFORMAT|" $List &= "$DTS_RIGHTALIGN|" $List &= "$DTS_SHORTDATEFORMAT|" $List &= "$MCS_NOTODAY|" $List &= "$MCS_NOTODAYCIRCLE|" $List &= "$MCS_WEEKNUMBERS|" $List &= "$TVS_HASBUTTONS|" $List &= "$TVS_HASLINES|" $List &= "$TVS_LINESATROOT|" $List &= "$TVS_DISABLEDRAGDROP|" $List &= "$TVS_SHOWSELALWAYS|" $List &= "$TVS_RTLREADING|" $List &= "$TVS_NOTOOLTIPS|" $List &= "$TVS_CHECKBOXES|" $List &= "$TVS_TRACKSELECT|" $List &= "$TVS_SINGLEEXPAND|" $List &= "$TVS_FULLROWSELECT|" $List &= "$TVS_NOSCROLL|" $List &= "$TVS_NONEVENHEIGHT|" $List &= "$TBS_AUTOTICKS|" $List &= "$TBS_BOTH|" $List &= "$TBS_BOTTOM|" $List &= "$TBS_HORZ|" $List &= "$TBS_VERT|" $List &= "$TBS_NOTHUMB|" $List &= "$TBS_NOTICKS|" $List &= "$TBS_LEFT|" $List &= "$TBS_RIGHT|" $List &= "$TBS_TOP|" $List &= "$LVS_EX_FULLROWSELECT|" $List &= "$LVS_EX_GRIDLINES|" $List &= "$LVS_EX_HEADERDRAGDROP|" $List &= "$LVS_EX_TRACKSELECT|" $List &= "$LVS_EX_CHECKBOXES|" $List &= "$LVS_EX_BORDERSELECT|" $List &= "$LVS_EX_DOUBLEBUFFER|" $List &= "$LVS_EX_FLATSB|" $List &= "$LVS_EX_MULTIWORKAREAS|" $List &= "$LVS_EX_SNAPTOGRID|" $List &= "$LVS_EX_SUBITEMIMAGES|" $List &= "$LVS_EX_INFOTIP" $List &= "$LVS_ICON|" $List &= "$LVS_REPORT|" $List &= "$LVS_SMALLICON|" $List &= "$LVS_LIST|" $List &= "$LVS_EDITLABELS|" $List &= "$LVS_NOCOLUMNHEADER|" $List &= "$LVS_NOSORTHEADER|" $List &= "$LVS_SINGLESEL|" $List &= "$LVS_SHOWSELALWAYS|" $List &= "$LVS_SORTASCENDING|" $List &= "$LVS_SORTDESCENDING|" $List &= "$LVS_NOLABELWRAP|" Global $StylesList = StringSplit($List,"|",2) ; FileWriteLine(@DesktopDir & "\planscanner\styles.txt",'Global $StylesList = "' & $StylesList & '"') EndFunc Func DisplayButtons($Type, $hWndParent, $ControlID=-1, $OpenToTheRight=False) Local $cbDPI = _HighDPICheck() Local $ButtonStep = (25 * $cbDPI) Local $cMarginR = Number(4 * $cbDPI, 1) If $ControlID <> -1 Then Local $mPos = __GUICtrlGetPos($hWndParent, $ControlID) if @error Then Return SetError(1, 0, "") If $OpenToTheRight Then $mPos[0] += $cMarginR / 2 + $mPos[2] -2 $mPos[1] += $mPos[3] - ($cMarginR / 2) - $ButtonStep Else $mPos[1] += $mPos[3] EndIf Else Local $mPos = MouseGetPos() EndIf Local $DesktopSize = _GetDesktopWorkArea($hWndParent, False) If @error Then Return ;Fix position if it is offscreen Local $mWidth = 157 Local $mHeight = 89 If $mPos[0] + $mWidth > $DesktopSize[2] Then $mPos[0] = $mPos[0] - ($mPos[0] + $mWidth - $DesktopSize[2] + 2) EndIf If $mPos[1] + $mHeight > $DesktopSize[3] Then $mPos[1] = $mPos[1] - ($mPos[1] + $mHeight - $DesktopSize[3] + 2) EndIf Local $LastTheme=$GUI_Theme_Name LogToConsole("Last Theme: " & $GUI_Theme_Name) _SetTheme("DarkPurple") ;See MetroThemes.au3 for selectable themes or to add more LogToConsole("DisplayButtons Set theme to DarkPurple") OverrideThemeColors() Local $MenuForm = GUICreate("_PopupMenuWindowUserInterfaceBuilder", $mWidth, $mHeight, $mPos[0], $mPos[1], $WS_POPUP, 0) Switch $Type Case "Rainbow" Local $aOthers[] = ['Nothing'] Local $ButtonRbLf154 = _Metro_CreateRainbowButtonLeft("Generate Code",0,0,128,29) Local $ButtonRbRt155 = _Metro_CreateRainbowButtonRight("",128,0,29,29) Local $ButtonRbLf156 = _Metro_CreateRainbowButtonLeft("Reset",0,29,87,29) Local $ButtonRbCn157 = _Metro_CreateRainbowButtonCenter("",87,29,29,29) Local $ButtonRbRt158 = _Metro_CreateRainbowButtonRight("",116,29,29,29) Local $ButtonRbWe159 = _Metro_CreateRainbowButtonWindow11("Execute",0,58,76,29) Case "Multipart" Local $aOthers[] = ['Nothing'] Local $ButtonRbLf154 = _Metro_CreateButtonLeft("Generate Code",0,0,128,29) Local $ButtonRbRt155 = _Metro_CreateButtonRight("",128,0,29,29) Local $ButtonRbLf156 = _Metro_CreateButtonLeft("Reset",0,29,87,29) Local $ButtonRbCn157 = _Metro_CreateButtonCenter("",87,29,29,29) Local $ButtonRbRt158 = _Metro_CreateButtonRight("",116,29,29,29) Local $ButtonRbWe159 = _Metro_CreateButtonFlat("Execute",0,58,76,29) Case "MenuStrip" Local $MenuIcon1 = _Metro_CreateMenuStrip("",4,4,84,-1,$ButtonBKColor,"0xF0F0F0") GUICtrlSetState(-1,$GUI_ENABLE) Local $MenuIcon2 = _Metro_CreateMenuButton("File",4,35,56) Local $MenuIcon3 = _Metro_CreateMenuButtonIcon("",88,7,28,28) Local $MenuIcon4 = _Metro_CreateMenuButtonIcon("",116,7,28,28) Local $MenuIcon5 = _Metro_CreateMenuButtonIcon("",60,35,28,28) Local $MenuIcon6 = _Metro_CreateMenuButtonIcon("",88,35,28,28) Local $MenuIcon7 = _Metro_CreateMenuButtonIcon("",116,35,28,28) Local $MenuIcon8 = _Metro_CreateMenuButtonIcon("",4,63) Local $MenuIcon9 = _Metro_CreateMenuButtonIcon("",32,63,28,28) Local $MenuIcon10 = _Metro_CreateMenuButtonIcon("",60,63,28,28) Local $MenuIcon11 = _Metro_CreateMenuButtonIcon("",88,63,28,28) Local $MenuIcon12 = _Metro_CreateMenuButtonIcon("",116,63,28,28) Local $aOthers[] = [$MenuIcon1,$MenuIcon2,$MenuIcon3,$MenuIcon4,$MenuIcon5,$MenuIcon6, _ $MenuIcon7,$MenuIcon8,$MenuIcon9,$MenuIcon10,$MenuIcon11,$MenuIcon12] ; These have to be defined for the msg loop to work for all popup menu windows Local $ButtonRbLf154 = GUICtrlCreateLabel("",-999,-999,1,1) Local $ButtonRbRt155 = GUICtrlCreateLabel("",-999,-999,1,1) Local $ButtonRbLf156 = GUICtrlCreateLabel("",-999,-999,1,1) Local $ButtonRbCn157 = GUICtrlCreateLabel("",-999,-999,1,1) Local $ButtonRbRt158 = GUICtrlCreateLabel("",-999,-999,1,1) Local $ButtonRbWe159 = GUICtrlCreateLabel("",-999,-999,1,1) WinMove($MenuForm,"",$mPos[0],$mPos[1],$mWidth-8,$mHeight+8) Case "MetroButtons" Local $aOthers[] = ['Nothing'] Local $ButtonRbLf154 = _Metro_CreateButton("Okay",6,4,87,29) GUICtrlSetTip(-1,"Default click style button.") Local $ButtonRbRt155 = GUICtrlCreateLabel("",-999,-999,1,1) Local $ButtonRbLf156 = _Metro_CreateButtonEx("Cancel",6,34,87,29) GUICtrlSetTip(-1,"Normal rectangle button.") Local $ButtonRbCn157 = GUICtrlCreateLabel("",-999,-999,1,1) Local $ButtonRbRt158 = GUICtrlCreateLabel("",-999,-999,1,1) Local $ButtonRbWe159 = _Metro_CreateButtonEx2("Save",5,62,87,29) GUICtrlSetTip(-1,"Rounded rectangle button.") WinMove($MenuForm,"",$mPos[0],$mPos[1],98,$mHeight+6) Case "AlignmentToolbar" GUISetAccelerators($Accel) Local $LJust='', $CJust='', $RJust='', $Hori='', $Vert='', $CGrp='', $Exit='', $Calc='' Local $MenuIcon1 = _Metro_CreateMenuButtonIcon($LJust,4,4,28,28,$ButtonBKColor,"0xF0F0F0",-1,-1,8) GUICtrlSetTip(-1,"Controls will be aligned to the first control selected.") Local $MenuIcon2 = _Metro_CreateMenuButtonIcon($CJust,35,4,28,28,$ButtonBKColor,"0xF0F0F0",-1,-1,8) GUICtrlSetTip(-1,"Controls will be aligned to the first control selected.") Local $MenuIcon3 = _Metro_CreateMenuButtonIcon($RJust,66,4,28,28,$ButtonBKColor,"0xF0F0F0",-1,-1,8) GUICtrlSetTip(-1,"Controls will be aligned to the first control selected.") Local $MenuIcon4 = _Metro_CreateMenuButtonIcon($Hori,97,4,28,28,$ButtonBKColor,"0xF0F0F0",-1,-1,8) GUICtrlSetTip(-1,"Controls will be aligned to the first control selected.") Local $MenuIcon5 = _Metro_CreateMenuButtonIcon($Vert,128,4,28,28,$ButtonBKColor,"0xF0F0F0",-1,-1,8) GUICtrlSetTip(-1,"Controls will be aligned to the first control selected.") Local $MenuIcon6 = _Metro_CreateMenuButtonIcon($Calc,159,4,28,28,$ButtonBKColor,"0xF0F0F0",-1,-1,8) GUICtrlSetTip(-1,"Calculate the distance between 2 controls.") Local $MenuIcon7 = _Metro_CreateMenuButtonIcon($Exit,190,4,28,28,$ButtonBKColor,"0xF0F0F0",-1,-1,8) GUICtrlSetTip(-1,"Move control with Shift+[ARROW_KEY] or [ARROW_KEY]. Resize control with Ctrl+Shift+[ARROW_KEY].") Local $aOthers[] = [$MenuIcon1,$MenuIcon2,$MenuIcon3,$MenuIcon4,$MenuIcon5,$MenuIcon6,$MenuIcon7] ; These have to be defined for the msg loop to work for all popup menu windows Local $ButtonRbLf154 = GUICtrlCreateLabel("",-999,-999,1,1) Local $ButtonRbRt155 = GUICtrlCreateLabel("",-999,-999,1,1) Local $ButtonRbLf156 = GUICtrlCreateLabel("",-999,-999,1,1) Local $ButtonRbCn157 = GUICtrlCreateLabel("",-999,-999,1,1) Local $ButtonRbRt158 = GUICtrlCreateLabel("",-999,-999,1,1) Local $ButtonRbWe159 = GUICtrlCreateLabel("",-999,-999,1,1) WinMove($MenuForm,"",$mPos[0],$mPos[1],222,36) Case Else EndSwitch _Metro_AddWindows11StyleCorners($MenuForm) GUISetBkColor($GUIThemeColor) GuiSetState() LogToConsole("DisplayButtons Set theme to " & $LastTheme) _SetTheme($LastTheme) If Not $METRO_ENABLED Then OverrideThemeColors() Local $Ret="", $Timer=TimerInit() While 1 If (Not WinActive($MenuForm)) Or TimerDiff($Timer) > 2000 Then _Metro_GuiDelete($MenuForm) Return SetError(2, 0, "") EndIf Local $Msg = GuiGetMsg() Switch $Msg Case $ButtonRbLf154 $Ret="Config1" ExitLoop Case $ButtonRbRt155 $Ret="Config1" ExitLoop Case $ButtonRbLf156 $Ret="Config2" ExitLoop Case $ButtonRbCn157 $Ret="Config2" ExitLoop Case $ButtonRbRt158 $Ret="Config2" ExitLoop Case $ButtonRbWe159 $Ret="Config3" ExitLoop Case $GUI_EVENT_CLOSE ExitLoop Case Else If $Msg < 1 Then ContinueLoop For $i=0 to UBound($aOthers)-1 If $Msg = $aOthers[$i] Then $Ret="Config" & $i ExitLoop 2 EndIf Next ; Start at 1, don't listen to first Accelerator {Spacebar} press For $i=1 to UBound($Accel)-1 If $Msg = $Accel[$i][1] Then GUISwitch(GetCanvas()) LogToConsole("GUICtrlSendToDummy" & GUICtrlSendToDummy($Msg)) GUISwitch($MenuForm) _Metro_GuiDelete($MenuForm) Return SetError(2, 0, "") EndIf Next EndSwitch Wend ; Required for Metro GUI and/or Buttons _Metro_GuiDelete($MenuForm) Return $Ret EndFunc Func OverrideThemeColors() $GUIThemeColor = "0xF0F0F0" ; Background Color $FontThemeColor = "0x191919" ; Checkbox/Radio text EndFunc Func DrawGDIPlusCallout($hWnd, $x, $y, $sDirection, $iArrowLen, $iLineLen, $sText) ; Function going to be used for "How to.." maybe _GDIPlus_Startup() Local $hDC = _WinAPI_GetDC($hWnd) Local $hGraphics = _GDIPlus_GraphicsCreateFromHDC($hDC) ; Create a back buffer Local $Client = WinGetClientSize($hWnd) Local $hBitmap = _GDIPlus_BitmapCreateFromScan0($Client[0], $Client[1]) Local $hBackbuffer = _GDIPlus_ImageGetGraphicsContext($hBitmap) ; Drawing tools Local $hPen = _GDIPlus_PenCreate(0xFFFF0000, 2) Local $hBrush = _GDIPlus_BrushCreateSolid(0xFFFF0000) ; Local $hFont = _GDIPlus_FontCreate("Segoe UI", 10) ; Local $hFormat = _GDIPlus_StringFormatCreate() Local $tLayout Local $dx = $iArrowLen / Sqrt(2) Local $dy = $iArrowLen / Sqrt(2) Local $x1, $y1, $x2, $y2, $tx, $ty Switch StringLower($sDirection) Case "ne" $x1 = $x + $dx $y1 = $y - $dy $x2 = $x1 + $iLineLen $y2 = $y1 $tx = $x2 + 4 $ty = $y2 - 8 Case "nw" $x1 = $x - $dx $y1 = $y - $dy $x2 = $x1 - $iLineLen $y2 = $y1 $tx = $x2 + 4 $ty = $y2 - 8 Case "se" $x1 = $x + $dx $y1 = $y + $dy $x2 = $x1 + $iLineLen $y2 = $y1 $tx = $x2 + 4 $ty = $y2 - 8 Case "sw" $x1 = $x - $dx $y1 = $y + $dy $x2 = $x1 - $iLineLen $y2 = $y1 $tx = $x2 + 4 $ty = $y2 - 8 Case Else Return SetError(1, 0, 0) EndSwitch ; Draw arrow line and horizontal tail _GDIPlus_GraphicsDrawLine($hBackbuffer, $x, $y, $x1, $y1, $hPen) _GDIPlus_GraphicsDrawLine($hBackbuffer, $x1-1, $y1, $x2, $y2, $hPen) ; Arrowhead Local $angle = ATan2($y - $y1, $x - $x1) Local $ah = 12 ; arrowhead length Local $leftX = $x + $ah * Cos($angle + 2.6) Local $leftY = $y + $ah * Sin($angle + 2.6) Local $rightX = $x + $ah * Cos($angle - 2.6) Local $rightY = $y + $ah * Sin($angle - 2.6) _GDIPlus_GraphicsDrawLine($hBackbuffer, $x, $y, $leftX, $leftY, $hPen) _GDIPlus_GraphicsDrawLine($hBackbuffer, $x, $y, $rightX, $rightY, $hPen) ; Text $tLayout = _GDIPlus_RectFCreate($tx, $ty, 400, 40) ; _GDIPlus_GraphicsDrawStringEx($hBackbuffer, $sText, $hFont, $tLayout, $hFormat, $hBrush) _GDIPlus_GraphicsDrawString($hBackbuffer, $sText, $x1+$iLineLen+4,$y1-7,"Arial",10,0,0xFFFF0000) ; Blit final image to window _GDIPlus_GraphicsDrawImage($hGraphics, $hBitmap, 0, 0) ; Cleanup ; _GDIPlus_FontDispose($hFont) ; _GDIPlus_StringFormatDispose($hFormat) _GDIPlus_BrushDispose($hBrush) _GDIPlus_PenDispose($hPen) _GDIPlus_GraphicsDispose($hBackbuffer) _GDIPlus_BitmapDispose($hBitmap) _GDIPlus_GraphicsDispose($hGraphics) _WinAPI_ReleaseDC($hWnd, $hDC) _GDIPlus_Shutdown() EndFunc Func ATan2($dy, $dx) If $dx = 0 Then Return ($dy > 0 ? 90 : -90) * (ACos(-1) / 180) Return ATan($dy / $dx) + (($dx < 0) ? ACos(-1) : 0) EndFunc ;~ Func ATan2($dy, $dx) ;~ If $dx = 0 Then Return ($dy > 0 ? 90 : -90) * (ACos(-1) / 180) ;~ Return ATan($dy / $dx) + (($dx < 0) ? ACos(-1) : 0) ;~ EndFunc