SteveJM Posted October 11, 2017 Posted October 11, 2017 I have a working program currently driven largely through menu selections. I would like to add a toolbar where most of the tollbar button actions are basically the same as menu items, but quicker to access. I have been wading around in toolbar examples, MSDN pages etc, it's clearly going to be a bit of a slog to get everything right, including tooltips etc. I thought I would start with something simple to prove the principle. Using bits from the help file examples I have a small program that successfully displays a toolbar. However, what seemed like the most elegant way to deal with the button commands does not seem to work. My understanding was that a toolbar button fires a WM_COMMAND message, with the command Id set by the second parameter in the call to _GUICtrlToolbar_AddButton ( $hWnd, $iID, $iImage) so I though it would be a good idea to set this Id to the same value as my menu item Id; then it would run the same task which is what I wanted. This did not work. I am using message loop mode and would like to stick with this because some of my scripts run hardware at the same time as the gui; it is easier if I don't have to worry about code being interrupted with the hardware in an unknown state . So I added a handler for WM_COMMAND, with some cribbed display code to try and see why. The toolbar button defintely fired a WM_COMMAND message and the Id looked the same, so no explanation there. I guess the issue is with GUIGetMsg() which may be constructed to ignore all but a limited number of control handles, i.e. those made with the GuiCtrlCreate... commands; this is speculation. I would dearly love to find a tidy way to get around this. Having some controls handled in the message loop and some in a WM_COMMAND handler, performing the same task, feels ugly. I would be very grateful for further insight from someone experienced with handling a toolbar. Perhaps I should be trying to fire the menu item. I have attached a code snippet to try and illustrate the issue. ToolbarTrial.au3
Moderators Melba23 Posted October 11, 2017 Moderators Posted October 11, 2017 SteveJM, You are correct - the Control IDs are not at all the same. GUIGetMsg uses the AutoIt -defined CIDs (actually indices within an internal array of controls) while the toolbar uses an entirely separate set of values. Anyway, I would use a dummy control to action the toolbar buttons - something like this: expandcollapse popupAutoItSetOption("MustDeclareVars", 1) #include <ButtonConstants.au3> #include <GUIConstantsEx.au3> #include <WindowsConstants.au3> #include <GuiToolbar.au3> #include <GuiReBar.au3> Global $uiDlg = GUICreate("Toolbar trial", 245, 137, 207, 121) Global $MenuItem2 = GUICtrlCreateMenu("&File") Global $miBeep = GUICtrlCreateMenuItem("Beep", $MenuItem2) Global $btnBeep = GUICtrlCreateButton("Beep higher", 72, 64, 105, 25) GUISetState(@SW_SHOW) ; Start with a default toolbar Global $hToolbar = _GUICtrlToolbar_Create($uiDlg) ; I need an image list. I can make it out ; of a wide bit map, or I can populate it with standard images from comctl32.dll ; Let's start with some standard button images, say Open & Close Global $nButtons = 1 ; I am confused by this as we appear to be adding a whole set of button images Global $hInst = -1 ; This means use a system set Global $iLoc = _GUICtrlToolbar_AddBitmap($hToolbar, $nButtons, $hInst, $IDB_STD_SMALL_COLOR) ; Auto increment the ControlIDs Global Enum $TBBeep_1 = 1001, $TBBeep_2 _GUICtrlToolbar_AddButton($hToolbar, $TBBeep_1, $STD_FILEOPEN) _GUICtrlToolbar_AddButton($hToolbar, $TBBeep_2, $STD_DELETE) ; Create a dummy control to action via the handler Global $cDummy = GUICtrlCreateDummy() GUIRegisterMsg($WM_COMMAND, MY_WM_COMMAND) Global $nMsg While 1 $nMsg = GUIGetMsg() Switch $nMsg Case $miBeep _Beep_1() Case $btnBeep _Beep_2() ; if the dummy is fired Case $cDummy ; Read teh ControlID sent by the handler and action the relevant function Switch GUICtrlRead($cDummy) Case $TBBeep_1 _Beep_1() Case $TBBeep_2 _Beep_2() EndSwitch Case $GUI_EVENT_CLOSE Exit EndSwitch WEnd Func _Beep_1() Beep(300, 200) EndFunc ;==>_Beep_1 Func _Beep_2() Beep(400, 200) EndFunc ;==>_Beep_2 ;-------------------------------------------------------------- Func MY_WM_COMMAND($hWnd, $iMsg, $wParam, $lParam) Local $nNotifyCode = BitShift($wParam, 16) Local $nID = BitAND($wParam, 0x0000FFFF) Local $hCtrl = $lParam #cs MsgBox($MB_SYSTEMMODAL, "MY_WM_COMMAND", "GUIHWnd" & @TAB & ":" & $hWnd & @CRLF & _ "MsgID" & @TAB & ":" & $iMsg & @CRLF & _ "wParam" & @TAB & ":" & $wParam & @CRLF & _ "lParam" & @TAB & ":" & $lParam & @CRLF & @CRLF & _ "WM_COMMAND - Infos:" & @CRLF & _ "-----------------------------" & @CRLF & _ "Code" & @TAB & ":" & $nNotifyCode & @CRLF & _ "CtrlID" & @TAB & ":" & $nID & @CRLF & _ "CtrlHWnd" & @TAB & ":" & $hCtrl) #ce ; Action the dummy control and pass the ControlID of the taskbar item GUICtrlSendToDummy($cDummy, $nID) Return $GUI_RUNDEFMSG EndFunc ;==>MY_WM_COMMAND Please ask if you have any questions. M23 Earthshine 1 Any of my own code posted anywhere on the forum is available for use by others without any restriction of any kind Open spoiler to see my UDFs: Spoiler ArrayMultiColSort ---- Sort arrays on multiple columnsChooseFileFolder ---- Single and multiple selections from specified path treeview listingDate_Time_Convert -- Easily convert date/time formats, including the language usedExtMsgBox --------- A highly customisable replacement for MsgBoxGUIExtender -------- Extend and retract multiple sections within a GUIGUIFrame ---------- Subdivide GUIs into many adjustable framesGUIListViewEx ------- Insert, delete, move, drag, sort, edit and colour ListView itemsGUITreeViewEx ------ Check/clear parent and child checkboxes in a TreeViewMarquee ----------- Scrolling tickertape GUIsNoFocusLines ------- Remove the dotted focus lines from buttons, sliders, radios and checkboxesNotify ------------- Small notifications on the edge of the displayScrollbars ----------Automatically sized scrollbars with a single commandStringSize ---------- Automatically size controls to fit textToast -------------- Small GUIs which pop out of the notification area
SteveJM Posted October 12, 2017 Author Posted October 12, 2017 Sorry to be slow to respond - time zones and work crisies. Thank you for your suggestion. It looks a nice tidy way to deal with the issue, I like it better than the Global array based solution I was working on and I will definately use your concept in preference. I appreciate you taking the time. Now to tackle mixing my own icons with the standard ones, tooltips and then rebars to put the whole thing in. I may be back!
Moderators Melba23 Posted October 12, 2017 Moderators Posted October 12, 2017 SteveJM, We will be here if required. M23 Any of my own code posted anywhere on the forum is available for use by others without any restriction of any kind Open spoiler to see my UDFs: Spoiler ArrayMultiColSort ---- Sort arrays on multiple columnsChooseFileFolder ---- Single and multiple selections from specified path treeview listingDate_Time_Convert -- Easily convert date/time formats, including the language usedExtMsgBox --------- A highly customisable replacement for MsgBoxGUIExtender -------- Extend and retract multiple sections within a GUIGUIFrame ---------- Subdivide GUIs into many adjustable framesGUIListViewEx ------- Insert, delete, move, drag, sort, edit and colour ListView itemsGUITreeViewEx ------ Check/clear parent and child checkboxes in a TreeViewMarquee ----------- Scrolling tickertape GUIsNoFocusLines ------- Remove the dotted focus lines from buttons, sliders, radios and checkboxesNotify ------------- Small notifications on the edge of the displayScrollbars ----------Automatically sized scrollbars with a single commandStringSize ---------- Automatically size controls to fit textToast -------------- Small GUIs which pop out of the notification area
Recommended Posts
Create an account or sign in to comment
You need to be a member in order to leave a comment
Create an account
Sign up for a new account in our community. It's easy!
Register a new accountSign in
Already have an account? Sign in here.
Sign In Now