Recently Browsing 0 members
No registered users viewing this page.
it's quite often, that someone asks how to change the texts of the MsgBox buttons or the InputBox buttons or how to change the position of ta MsgBox. Since years I use CBT hooks for that, but now I made a small UDF out of it for the ease of use. Of course you can build your own GUI or use already existing UDFs to do the same, but I like this way and you can hack (hook) the inbuild InputBox.
#include-once #include <WinAPI.au3> Global Const $tagCBT_CREATEWND = "ptr lpcs;HWND tagCBT_CREATEWND" Global Const $tagCREATESTRUCT = "ptr lpCreateParams;handle hInstance;HWND hMenu;HWND hwndParent;int cy;int cx;int y;int x;LONG style;ptr lpszName;ptr lpszClass;DWORD dwExStyle" Global $g__hProcDlgBox = DllCallbackRegister("__DlgBox_CbtHookProc", "LRESULT", "int;WPARAM;LPARAM") Global $g__TIdDlgBox = _WinAPI_GetCurrentThreadId() Global $g__hHookDlgBox = _WinAPI_SetWindowsHookEx($WH_CBT, DllCallbackGetPtr($g__hProcDlgBox), 0, $g__TIdDlgBox) Global Const $g__MaxDlgBtns = 5 ; maximum of 5 buttons to rename text Global Const $g__MaxDlgItemId = 11 ; maximun ID of buttons to search is 11 as this is the maximun used in Messagebox Global $g__DlgBoxPosX, $g__DlgBoxPosY, $g__DlgBoxWidth, $g__DlgBoxHeight Global $g__aDlgBoxBtnText[$g__MaxDlgBtns] Global $g__DlgBtnCount = 0 _DlgBox_SetDefaults() OnAutoItExitRegister("__DlgBox_UnregisterHook") Func _DlgBox_SetButtonNames($TxtBtn1 = Default, $TxtBtn2 = Default, $TxtBtn3 = Default, $TxtBtn4 = Default, $TxtBtn5 = Default) $g__aDlgBoxBtnText = $TxtBtn1 $g__aDlgBoxBtnText = $TxtBtn2 $g__aDlgBoxBtnText = $TxtBtn3 $g__aDlgBoxBtnText = $TxtBtn4 $g__aDlgBoxBtnText = $TxtBtn5 $g__DlgBtnCount = @NumParams EndFunc ;==>_DlgBox_SetButtonNames Func _DlgBox_SetPosition($x = Default, $y = Default) ;only for MsgBox, not working and not needed for InputBox $g__DlgBoxPosX = $x $g__DlgBoxPosY = $y EndFunc ;==>_DlgBox_SetPosition Func _DlgBox_SetSize($w = Default, $h = Default) $g__DlgBoxWidth = $w $g__DlgBoxHeight = $h EndFunc ;==>_DlgBox_SetSize Func _DlgBox_SetDefaults() $g__DlgBoxPosX = Default $g__DlgBoxPosY = Default $g__DlgBoxWidth = Default $g__DlgBoxHeight = Default For $i = 0 To UBound($g__aDlgBoxBtnText) - 1 $g__aDlgBoxBtnText[$i] = Default Next EndFunc ;==>_DlgBox_SetDefaults Func __DlgBox_CbtHookProc($nCode, $wParam, $lParam) Local $tcw, $tcs Local $iSearch = 0 Local $ahBtn[$g__DlgBtnCount] If $nCode < 0 Then Return _WinAPI_CallNextHookEx($g__hHookDlgBox, $nCode, $wParam, $lParam) EndIf Switch $nCode Case 3 ;5=HCBT_CREATEWND If _WinAPI_GetClassName(HWnd($wParam)) = "#32770" Then ;Dialoig window class $tcw = DllStructCreate($tagCBT_CREATEWND, $lParam) $tcs = DllStructCreate($tagCREATESTRUCT, DllStructGetData($tcw, "lpcs")) If $g__DlgBoxPosX <> Default Then DllStructSetData($tcs, "x", $g__DlgBoxPosX) If $g__DlgBoxPosY <> Default Then DllStructSetData($tcs, "y", $g__DlgBoxPosY) If $g__DlgBoxWidth <> Default Then DllStructSetData($tcs, "cx", $g__DlgBoxWidth) If $g__DlgBoxHeight <> Default Then DllStructSetData($tcs, "cy", $g__DlgBoxHeight) EndIf Case 5 ;5=HCBT_ACTIVATE For $i = 1 To $g__MaxDlgItemId If IsHWnd(_WinAPI_GetDlgItem($wParam, $i)) Then If $g__aDlgBoxBtnText[$iSearch] <> Default Then _WinAPI_SetDlgItemText($wParam, $i, $g__aDlgBoxBtnText[$iSearch]) $iSearch += 1 If $iSearch >= UBound($ahBtn) Then ExitLoop EndIf Next EndSwitch Return _WinAPI_CallNextHookEx($g__hHookDlgBox, $nCode, $wParam, $lParam) EndFunc ;==>__DlgBox_CbtHookProc Func __DlgBox_UnregisterHook() _WinAPI_UnhookWindowsHookEx($g__hHookDlgBox) DllCallbackFree($g__hProcDlgBox) EndFunc ;==>__DlgBox_UnregisterHook Func _WinAPI_SetDlgItemText($hDlg, $nIDDlgItem, $lpString) Local $aRet = DllCall('user32.dll', "int", "SetDlgItemText", _ "hwnd", $hDlg, _ "int", $nIDDlgItem, _ "str", $lpString) Return $aRet EndFunc ;==>_WinAPI_SetDlgItemText
Simple example to see how to use it
#include "HookDlgBox.au3" _DlgBox_SetButtonNames("1", "two", "3") MsgBox(4, "Test 1", "Custom button texts") _DlgBox_SetPosition(20, 20) MsgBox(66, "Test 2", "Custom position and button texts") _DlgBox_SetButtonNames("Submit", "Don't submit", "Don't know") InputBox("Test 3", "Where were you born?", "Planet Earth") _DlgBox_SetSize(800, 800) InputBox("Test 4", "Where were you born?", "Planet Earth") _DlgBox_SetSize(Default, 800) MsgBox(66, "Test 5", "Strange but working") _DlgBox_SetButtonNames(Default, "Wait", "What?") _DlgBox_SetSize(Default, Default) _DlgBox_SetPosition(500, 500) MsgBox(66, "Test 6", "So far so good!") _DlgBox_SetDefaults() MsgBox(6, "Test 7", "Default position and button texts") Hope you like it.
The more projects I work on, the harder it is to find old scripts I created with certain techniques in them. I'd like to leave this here for others to get an idea from and it will be available now by keyword searching in this forum.
This project needed an evenly distributed button grid setup on a touch screen with half decent sized buttons and spacing so the user would be less likely to press the key beside it. Here is one quick example to give anyone an idea of a way to handle it.
#include <GUIConstants.au3> GUICreate("Button Grid", 1080, 100) ; will create a dialog box that when displayed is centered GUISetState(@SW_SHOW) ; will display an empty dialog box ;--Create and Position Controls Dim $btnActivated ;Col 1 is button id, Col 2 is True/False used in 1 example as depressed Dim $btnArray ;Col 1 is button id, Col 2 is True/False used in 1 example as depressed $num = 0 $btnActivated = GUICtrlCreateButton("Activated", 0, 0, 100, 100) ;x,y,w,h $btnActivated = True GUICtrlSetBkColor(-1,0x00ff00) GUICtrlSetColor(-1,0x005500) GUICtrlSetFont(-1,14) For $Y = 0 To 1 For $X = 0 To 7 ConsoleWrite( ($X * 100) + ($X*20) + 120 & @CRLF) If $Y=0 Then $btnArray[$num] = GUICtrlCreateButton($num + 1, ($X * 100) + ($X*20) + 120, 0, 100, 40) ;x,y,w,h Else $btnArray[$num] = GUICtrlCreateButton($num + 1, ($X * 100) + ($X*20) + 120, ($Y * 40) + $Y*20, 100, 40) ;x,y,w,h EndIf GUICtrlSetBkColor($btnArray[$num], 0xFFFFFF) $num += 1 Next Next ;--Set Button Names GUICtrlSetData($btnArray,"Autoit") GUICtrlSetData($btnArray,"Is") GUICtrlSetData($btnArray,"Cool") ; Run the GUI until the dialog is closed While 1 $msg = GUIGetMsg() Switch $msg Case $GUI_EVENT_CLOSE ExitLoop Case $btnActivated $btnActivated = NOT $btnActivated If $btnActivated Then GUICtrlSetBkColor($btnActivated,0x00ff00) GUICtrlSetColor($btnActivated,0x005500) GUICtrlSetData($btnActivated,"Activated") GUICtrlSetFont($btnActivated,14) Else GUICtrlSetBkColor($btnActivated,0xFF9999) GUICtrlSetColor($btnActivated,0x550000) GUICtrlSetData($btnActivated,"DeActivated") GUICtrlSetFont($btnActivated,13) EndIf Case $btnArray If $btnActivated Then MsgBox(0,"Notice","Btn1",1) EndIf Case $btnArray If $btnActivated Then MsgBox(0,"Notice","Btn2",1) EndIf Case $btnArray If $btnActivated Then MsgBox(0,"Notice","Btn3",1) EndIf EndSwitch WEnd I couldn't find one of my old projects that broke the button array into more columns that included the actual button name in the field. Feel free to share your own or share a more flexible version of this simple example.
I am making some GUI with combobox for the Baudrates communications and I listed 9600, 57600, 115200.
I wrote the code to be defaulted to 57600 like this:
GUICtrlSetData($comboBox_opticalBaudRate, "9600|57600|115200", "57600")
But I wanted the GUI to remember the last item the user picks so the baudrates will NOT be defaulted to 57600.
Example, I pick 9600 as my baudrates, then I close the GUI, after opening it, it always prompt 57600 since that is what I did in my code. But I want that if I choose 9600 and close the GUI, opening it again will show 9600 now instead of 57600.
Is there a way to do it in GUI setting?
As many of you may not be aware, of much about AutoIt's humble beginnings, and aspects related to the first GUI version of AutoIt, I thought it might be nice to create a historical reference here for all the many GUI creators that have been created by various people over the years.
NOTE - While one could argue, that this topic might be better placed in one of the Chat forums, I would argue, that it links to heaps of good code. While much may be redundant in that code, it is still interesting and forms a great perspective. Many are bound to find useful elements at the very least.
Koda, is no doubt the most well-known GUI creator now, but there was a time, when CyberSlug's legendary GUIBuilder (first known as AutoBuilder) ruled the roost, and AutoIt coder's saw it as a Godsend. AutoIt coding was much simpler back then of course.
Below, will be a timeline, of any AutoIt GUI creators listed in forum pages. It will be added to by myself as I find them or as others here find them and place a link in a subsequent post ... PLEASE HELP! Comments welcome too.
(Also note, that this is also intended to include updates, branches etc by others)
Apr 20 2004 - AutoBuilder by CyberSlug.
Sep 27 2004 - An interesting topic, where CyberSlug talks about the future of AutoBuilder (etc) and renaming to GUIBuilder and you see the first mentions and links to updates by others (including myself & livewire).
Nov 05 2004 - A topic where lookfar is working on a SciTE replacement, talks about starting a Form Designer.
Aug 10 2005 - GuiBuilder first update by TheSaint.
Sep 26 2005 - GUIBuilder updates by livewire (he also talks about transferring his efforts to Koda).
Nov 02 2005 - KODA FormDesigner v1.3 by lookfar
Nov 03 2005 - Seemingly interesting topic about forms by tonedeaf
Dec 26 2005 - AutoIt Studio(beta) by BillLuvsU
Jan 09 2006 - AutoBuilder update (or branch) by _^__darkbytez (livewire also posts).
Feb 19 2006 - Koda v1.5 by lookfar
Sep 07 2006 - Koda v18.104.22.168 by Lazycat
Jan 07 2007 - Form/GUI Builder by FlintBrenick
Jun 10 2007 - Gorganizer by _Kurt (more of an assister than actual GUI maker)
Jun 27 2007 - Basic GUI Designer by Mast3rpyr0
May 03 2008 - Autoit Programmer's Desktop (APD) by Ealric
Jul 11 2008 - Gui Designer by Alek
Aug 11 2008 - Gorganizer update by _Kurt
Jun 19 2009 - Easy GUI by Mat
Aug 13 2009 - GUI Script Creator by Pandemic (not sure this qualifies, but it made me think of templates)
Aug 16 2010 - Creation Gui by AZJIO
Jan 22 2012 - ISN AutoIt Studio by ISI360 (includes ISN Form Studio 2, a GUI editor)
Mar 19 2012 - Arduino GUI Programmer by nikosliapis (creates a specific type of GUI)
Aug 01 2012 - GuiBuilder Resurrected update/branch to GUIBuilder by baroquebob
Dec 01 2012 - Form Builder beta (v1.0.6) by BuckMaster
Jan 12 2015 - GUIBuilderNxt update by jaberwacky of GUIBuilder v0.8 (as a new prototype, modified to work with latest AutoIt) (not a update to the Resurrected version)
Aug 12 2016 - The GuiBuilder Return by DFerrato as an update to GUIBuilder,
Jan 17 2017 - GUIBuilder Project by TheSaint (a work in progress based on CyberSlug's original ... and later versions, updated by Roy, TheSaint & others).
May 29 2019 - The GuiBuilder Return by DFerrato as an update to GUIBuilder, His new and improved version.
May 9 2022 - GuiBuilderPlus by kurtykurtyboy as an update to GUIBuilder. A new an improved version with more to come.
There are a significant number of creators/designers that have been started and never completed.
+++++ STILL UNDER CONSTRUCTION +++++
P.S. Well that's it from me tonight. I know of at least one other major creator, but cannot recall it's name or the name of the coder, though I think it starts with 'L'. Bound to be a few I've missed, and some I cannot seem to find their first appearance here (Koda, Form Builder, etc), but there may be an obvious reason for that. Will probably rely on feedback from others now that I've got the ball rolling.
NOTE - If anyone wants to discuss any of these programs above or give some background history, then by all means do so. I will cross-reference (link to) any important comments.
#Region ### START Koda GUI section ### Form=C:\Users\Engr. Ashraful\Videos\koda_22.214.171.124\Forms\ProgramPlayer\FormProgamToOpen.kxf
$FormInput = GUICreate("Input", 302, 205, 454, 285)
$Resolution = GUICtrlCreateCombo("Resolution", 80, 24, 145, 25)
$ComboProgramType = GUICtrlCreateCombo("Program Type Selection", 80, 64, 145, 25, BitOR($CBS_DROPDOWN,$CBS_AUTOHSCROLL))
$ButtonEnter = GUICtrlCreateButton("Enter", 104, 104, 75, 25)
#EndRegion ### END Koda GUI section ###
$nMsg = GUIGetMsg()
please help me to read combo box input and use the value for another function/ work