Jump to content

Simple button and icon toolbar with hover effect - problem


Recommended Posts

I tried to come up with a simple toolbar which displays the plain icons (without a button frame) but also shows a button effect when hovered or clicked on.

My approach was to create a button, add an icon and hide the icon button again. Then place the icon without the button on top of it. When the mouse is moved over the icon I hide the icon (which leaves button displayed) giving me the hover effect for hover and clicks (using GUIGetCursorInfo() to get the icon ID).

It seem to work ... but sometimes the hover effect does not show as expected especially when the mouse is moved slowly to the edge of the icon. While the icon ID is being read and action triggered (see Mouse OVER text) the icon itself is not being hidden (and button displayed).

I found that the effect is more likely to occur when the GUI is freshly loaded.

Can anyone reproduce this effect? I wonder what may causes this effect or is anything wrong in my coding?

Any hint and support would be appreciated!

Many thanks

#include <StaticConstants.au3>
#include <ButtonConstants.au3>
#include <GUIConstantsEx.au3>

Opt('MustDeclareVars', 1)

f_toolbar()

Func f_toolbar()
    Local $id_button_1_a, $id_button_2_a, $id_button_3_a
    Local $id_button_1_b, $id_button_2_b, $id_button_3_b
    Local $id_button_close
    Local $h_toolbar_gui, $msg_pop, $id_output_lbl

    ; -- Declare and set mouse over variables
    Local $last_tool_b_id = 0       ; ID of last button/icon visited
    Local $a_cursor_b_info          ; GUIGetCursorInfo() array

    Local $win_w = 400              ; GUI width
    Local $win_h = 400              ; GUI height
    Local $icon_file = @SystemDir & "\shell32.dll"

    ; -- Create the GUI -------------------------------------------------------------------------------------------------------
    $h_toolbar_gui = GUICreate("Toolbar hover - Test ...", $win_w, $win_h)

    ; -- A frame for the toolbar
    GUICtrlCreateLabel("", 3, 3, $win_w-3, 44, $SS_ETCHEDFRAME )
    GUICtrlSetState(-1, $GUI_DISABLE)

    ; -- The Toolbar
    ; -- 1. Toolbar button -----------------------------------------------------------------------------------------------------
    $id_button_1_a = GUICtrlCreateButton("1", 4, 4, 40, 40, $BS_ICON)                                                           ; Create BUTTON
    GUICtrlSetImage(-1, $icon_file, -71, 1)                                                                                     ; Add ICON to button
    GUICtrlSetState(-1, $GUI_HIDE)                                                                                              ; Hide ICON BUTTON again
    $id_button_1_b = GUICtrlCreateIcon($icon_file, -71, 4, 4, 40, 40, $BS_CENTER)                                               ; Create ICON to display

    ; -- 2. Toolbar button -----------------------------------------------------------------------------------------------------
    $id_button_2_a = GUICtrlCreateButton("2", 44, 4, 40, 40, $BS_ICON)                                                          ; Create BUTTON
    GUICtrlSetImage(-1, $icon_file, -5, 1)                                                                                      ; Add ICON to button
    GUICtrlSetState(-1, $GUI_HIDE)                                                                                              ; Hide ICON BUTTON again
    $id_button_2_b = GUICtrlCreateIcon($icon_file, -5, 44, 4, 40, 40, $BS_CENTER)                                               ; Create ICON to display

    ; -- 3. Toolbar button -----------------------------------------------------------------------------------------------------
    $id_button_3_a = GUICtrlCreateButton("3", 84, 4, 40, 40, $BS_ICON)
    GUICtrlSetImage(-1, $icon_file, -28, 1)                                                                                     ; Add ICON to button
    GUICtrlSetState(-1, $GUI_HIDE)                                                                                              ; Hide ICON BUTTON again
    $id_button_3_b = GUICtrlCreateIcon($icon_file, -28, 84, 4, 40, 40, $BS_CENTER)                                              ; Create ICON to display

    ; -- Lable CTRL for feedback
    $id_output_lbl = GUICtrlCreateLabel("Move mouse over toolbar ...", 4, 100, $win_w-8, 16)                                    ; Lable for feedback
    GUICtrlSetBkColor($id_output_lbl, 0xFFFFFF)

    ; -- The Close button
    $id_button_close = GUICtrlCreateButton("Close", $win_w/2-40, $win_h-40, 80, 24, $BS_DEFPUSHBUTTON)

    GUISetState(@SW_SHOW)

    While 1
        $msg_pop = GUIGetMsg()
        Select
            Case $msg_pop = $GUI_EVENT_CLOSE
                ExitLoop

            Case $msg_pop = $id_button_close
                ExitLoop

            Case $msg_pop = $id_button_1_a Or $msg_pop = $id_button_1_b
                GUICtrlSetState($id_button_1_a, $GUI_SHOW)                                                                      ; Show BUTTON
                MsgBox(32, "DEBUG", "Button 1 pressed ...", 0, $h_toolbar_gui)

            Case $msg_pop = $id_button_2_a Or $msg_pop = $id_button_2_b
                GUICtrlSetState($id_button_2_a, $GUI_SHOW)                                                                      ; Show BUTTON
                MsgBox(32, "DEBUG", "Button 2 pressed ...", 0, $h_toolbar_gui)

            Case $msg_pop = $id_button_3_a Or $msg_pop = $id_button_3_b
                GUICtrlSetState($id_button_3_a, $GUI_SHOW)                                                                      ; Show BUTTON
                MsgBox(32, "DEBUG", "Button 3 pressed ...", 0, $h_toolbar_gui)

            Case Else
                $a_cursor_b_info = GUIGetCursorInfo($h_toolbar_gui)  ; - $aArray[4] = ID of the control that the mouse cursor is hovering over (or 0 if none)

                Select
                    ; -- Button 1 - Cursor -------------------------------------------------------------------------------------
                    Case  $a_cursor_b_info[4] = $id_button_1_b And $last_tool_b_id <> $id_button_1_b And $last_tool_b_id = 0    ; MOUSE OVER
                        GUICtrlSetState($id_button_1_a, $GUI_SHOW)                                                              ; Show BUTTON
                        GUICtrlSetData($id_output_lbl, "Mouse OVER - Ctrl ID:" & @TAB & $a_cursor_b_info[4])
                        GUICtrlSetBkColor($id_output_lbl, 0xFFFF00)
                        $last_tool_b_id = $id_button_1_b
                        ; -- DEBUG -----------------------------------------------------------------
                         ConsoleWrite("> ... " &  "$last_tool_b_id - Ctrl ID:" & @TAB & $last_tool_b_id & @CRLF)
                        ; -- DEBUG -----------------------------------------------------------------

                    Case $a_cursor_b_info[4] <> $id_button_1_b And $last_tool_b_id = $id_button_1_b                             ; NO MOUSE OVER
                        GUICtrlSetState($id_button_1_a, $GUI_HIDE)                                                              ; Hide BUTTON
                        $a_cursor_b_info[4] = 0
                        GUICtrlSetData($id_output_lbl, "Mouse AWAY - Ctrl ID:" & @TAB & $a_cursor_b_info[4])
                        GUICtrlSetBkColor($id_output_lbl,  0x99CCFF)
                        $last_tool_b_id = 0
                        ; -- DEBUG -----------------------------------------------------------------
                         ConsoleWrite("> ... " &  "$last_tool_b_id - Ctrl ID:" & @TAB & $last_tool_b_id & @CRLF)
                        ; -- DEBUG -----------------------------------------------------------------

                    ; -- Button 2 - Cursor -------------------------------------------------------------------------------------
                    Case  $a_cursor_b_info[4] = $id_button_2_b And $last_tool_b_id <> $id_button_2_b And $last_tool_b_id = 0    ; MOUSE OVER
                        GUICtrlSetState($id_button_2_a, $GUI_SHOW)                                                              ; Show BUTTON
                        GUICtrlSetData($id_output_lbl, "Mouse OVER - Ctrl ID:" & @TAB & $a_cursor_b_info[4])
                        GUICtrlSetBkColor($id_output_lbl, 0xFFFF00)
                        $last_tool_b_id = $id_button_2_b
                        ; -- DEBUG -----------------------------------------------------------------
                         ConsoleWrite("> ... " &  "$last_tool_b_id - Ctrl ID:" & @TAB & $last_tool_b_id & @CRLF)
                        ; -- DEBUG -----------------------------------------------------------------

                    Case $a_cursor_b_info[4] <> $id_button_2_b And $last_tool_b_id = $id_button_2_b                             ; NO MOUSE OVER
                        GUICtrlSetState($id_button_2_a, $GUI_HIDE)                                                              ; Hide BUTTON
                        $a_cursor_b_info[4] = 0
                        GUICtrlSetData($id_output_lbl, "Mouse AWAY - Ctrl ID:" & @TAB & $a_cursor_b_info[4])
                        GUICtrlSetBkColor($id_output_lbl,  0x99CCFF)
                        $last_tool_b_id = 0
                        ; -- DEBUG -----------------------------------------------------------------
                         ConsoleWrite("> ... " &  "$last_tool_b_id - Ctrl ID:" & @TAB & $last_tool_b_id & @CRLF)
                        ; -- DEBUG -----------------------------------------------------------------

                    ; -- Button 3 - Cursor -------------------------------------------------------------------------------------
                    Case  $a_cursor_b_info[4] = $id_button_3_b And $last_tool_b_id <> $id_button_3_b And $last_tool_b_id = 0    ; MOUSE OVER
                        GUICtrlSetState($id_button_3_a, $GUI_SHOW)                                                              ; Show BUTTON
                        GUICtrlSetData($id_output_lbl, "Mouse OVER - Ctrl ID:" & @TAB & $a_cursor_b_info[4])
                        GUICtrlSetBkColor($id_output_lbl, 0xFFFF00)
                        $last_tool_b_id = $id_button_3_b
                        ; -- DEBUG -----------------------------------------------------------------
                         ConsoleWrite("> ... " &  "$last_tool_b_id - Ctrl ID:" & @TAB & $last_tool_b_id & @CRLF)
                        ; -- DEBUG -----------------------------------------------------------------

                    Case $a_cursor_b_info[4] <> $id_button_3_b And $last_tool_b_id = $id_button_3_b                             ; NO MOUSE OVER
                        GUICtrlSetState($id_button_3_a, $GUI_HIDE)                                                              ; Hide BUTTON
                        $a_cursor_b_info[4] = 0
                        GUICtrlSetData($id_output_lbl, "Mouse AWAY - Ctrl ID:" & @TAB & $a_cursor_b_info[4])
                        GUICtrlSetBkColor($id_output_lbl,  0x99CCFF)
                        $last_tool_b_id = 0
                        ; -- DEBUG -----------------------------------------------------------------
                         ConsoleWrite("> ... " &  "$last_tool_b_id - Ctrl ID:" & @TAB & $last_tool_b_id & @CRLF)
                        ; -- DEBUG -----------------------------------------------------------------

                EndSelect
        EndSelect
    WEnd

    GUIDelete()
EndFunc   ;==> f_toolbar()
Edited by Mungo
Link to post
Share on other sites

Thanks Yashied,

Yes, I try to get my head around the powerful _GUICtrlToolbar_... and _GUICtrlRebar_...  functions ... However, still try to understand why my example behaves the way it does ... icon not hiding despite action triggered ?

Well, I try keep learning all the time.  :sweating:

Cheers :shifty:

Link to post
Share on other sites

The problem in overlapping controls.

 

#include <StaticConstants.au3>
#include <ButtonConstants.au3>
#include <GUIConstantsEx.au3>

Opt('MustDeclareVars', 1)

f_toolbar()

Func f_toolbar()
    Local $id_button_1_a, $id_button_2_a, $id_button_3_a
    Local $id_button_1_b, $id_button_2_b, $id_button_3_b
    Local $id_button_close
    Local $h_toolbar_gui, $msg_pop, $id_output_lbl

    ; -- Declare and set mouse over variables
    Local $last_tool_b_id = 0       ; ID of last button/icon visited
    Local $a_cursor_b_info          ; GUIGetCursorInfo() array

    Local $win_w = 400              ; GUI width
    Local $win_h = 400              ; GUI height
    Local $icon_file = @SystemDir & "\shell32.dll"

    ; -- Create the GUI -------------------------------------------------------------------------------------------------------
    $h_toolbar_gui = GUICreate("Toolbar hover - Test ...", $win_w, $win_h)

    ; -- A frame for the toolbar
    GUICtrlCreateLabel("", 3, 3, $win_w-3, 44, $SS_ETCHEDFRAME )
    GUICtrlSetState(-1, $GUI_DISABLE)

    ; -- The Toolbar
    ; -- 1. Toolbar button -----------------------------------------------------------------------------------------------------
    $id_button_1_a = GUICtrlCreateButton("1", 4, 4, 40, 40, $BS_ICON)                                                           ; Create BUTTON
    GUICtrlSetImage(-1, $icon_file, -71, 1)                                                                                     ; Add ICON to button
    GUICtrlSetState(-1, $GUI_HIDE)                                                                                              ; Hide ICON BUTTON again
    $id_button_1_b = GUICtrlCreateIcon($icon_file, -71, 4, 4, 40, 40, $BS_CENTER)                                               ; Create ICON to display

    ; -- 2. Toolbar button -----------------------------------------------------------------------------------------------------
    $id_button_2_a = GUICtrlCreateButton("2", 44, 4, 40, 40, $BS_ICON)                                                          ; Create BUTTON
    GUICtrlSetImage(-1, $icon_file, -5, 1)                                                                                      ; Add ICON to button
    GUICtrlSetState(-1, $GUI_HIDE)                                                                                              ; Hide ICON BUTTON again
    $id_button_2_b = GUICtrlCreateIcon($icon_file, -5, 44, 4, 40, 40, $BS_CENTER)                                               ; Create ICON to display

    ; -- 3. Toolbar button -----------------------------------------------------------------------------------------------------
    $id_button_3_a = GUICtrlCreateButton("3", 84, 4, 40, 40, $BS_ICON)
    GUICtrlSetImage(-1, $icon_file, -28, 1)                                                                                     ; Add ICON to button
    GUICtrlSetState(-1, $GUI_HIDE)                                                                                              ; Hide ICON BUTTON again
    $id_button_3_b = GUICtrlCreateIcon($icon_file, -28, 84, 4, 40, 40, $BS_CENTER)                                              ; Create ICON to display

    ; -- Lable CTRL for feedback
    $id_output_lbl = GUICtrlCreateLabel("Move mouse over toolbar ...", 4, 100, $win_w-8, 16)                                    ; Lable for feedback
    GUICtrlSetBkColor($id_output_lbl, 0xFFFFFF)

    ; -- The Close button
    $id_button_close = GUICtrlCreateButton("Close", $win_w/2-40, $win_h-40, 80, 24, $BS_DEFPUSHBUTTON)

    GUISetState(@SW_SHOW)

    While 1
        $msg_pop = GUIGetMsg()
        Select
            Case $msg_pop = $GUI_EVENT_CLOSE
                ExitLoop

            Case $msg_pop = $id_button_close
                ExitLoop

            Case $msg_pop = $id_button_1_a Or $msg_pop = $id_button_1_b
                GUICtrlSetState($id_button_1_a, $GUI_SHOW)
                MsgBox(32, "DEBUG", "Button 1 pressed ...", 0, $h_toolbar_gui)

            Case $msg_pop = $id_button_2_a Or $msg_pop = $id_button_2_b
                GUICtrlSetState($id_button_2_a, $GUI_SHOW)
                MsgBox(32, "DEBUG", "Button 2 pressed ...", 0, $h_toolbar_gui)

            Case $msg_pop = $id_button_3_a Or $msg_pop = $id_button_3_b
                GUICtrlSetState($id_button_3_a, $GUI_SHOW)
                MsgBox(32, "DEBUG", "Button 3 pressed ...", 0, $h_toolbar_gui)

            Case Else
                $a_cursor_b_info = GUIGetCursorInfo($h_toolbar_gui)  ; - $aArray[4] = ID of the control that the mouse cursor is hovering over (or 0 if none)

                Select
                    ; -- Button 1 - Cursor -------------------------------------------------------------------------------------
                    Case  $a_cursor_b_info[4] = $id_button_1_b And $last_tool_b_id = 0                                          ; MOUSE OVER
                        GUICtrlSetState($id_button_1_a, $GUI_SHOW)
                        GUICtrlSetState($id_button_1_b, $GUI_HIDE)
                        GUICtrlSetData($id_output_lbl, "Mouse OVER - Ctrl ID:" & @TAB & $a_cursor_b_info[4])
                        GUICtrlSetBkColor($id_output_lbl, 0xFFFF00)
                        _Swap($id_button_1_a, $id_button_1_b)
                        $last_tool_b_id = $id_button_1_b
                        ; -- DEBUG -----------------------------------------------------------------
                         ConsoleWrite("> ... " &  "$last_tool_b_id - Ctrl ID:" & @TAB & $last_tool_b_id & @CRLF)
                        ; -- DEBUG -----------------------------------------------------------------

                    Case $a_cursor_b_info[4] <> $id_button_1_b And $last_tool_b_id = $id_button_1_b                             ; NO MOUSE OVER
                        GUICtrlSetState($id_button_1_a, $GUI_SHOW)
                        GUICtrlSetState($id_button_1_b, $GUI_HIDE)
                        $a_cursor_b_info[4] = 0
                        GUICtrlSetData($id_output_lbl, "Mouse AWAY - Ctrl ID:" & @TAB & $a_cursor_b_info[4])
                        GUICtrlSetBkColor($id_output_lbl,  0x99CCFF)
                        _Swap($id_button_1_a, $id_button_1_b)
                        $last_tool_b_id = 0
                        ; -- DEBUG -----------------------------------------------------------------
                         ConsoleWrite("> ... " &  "$last_tool_b_id - Ctrl ID:" & @TAB & $last_tool_b_id & @CRLF)
                        ; -- DEBUG -----------------------------------------------------------------

                    ; -- Button 2 - Cursor -------------------------------------------------------------------------------------
                    Case  $a_cursor_b_info[4] = $id_button_2_b And $last_tool_b_id = 0                                          ; MOUSE OVER
                        GUICtrlSetState($id_button_2_a, $GUI_SHOW)
                        GUICtrlSetState($id_button_2_b, $GUI_HIDE)
                        GUICtrlSetData($id_output_lbl, "Mouse OVER - Ctrl ID:" & @TAB & $a_cursor_b_info[4])
                        GUICtrlSetBkColor($id_output_lbl, 0xFFFF00)
                        _Swap($id_button_2_a, $id_button_2_b)
                        $last_tool_b_id = $id_button_2_b
                        ; -- DEBUG -----------------------------------------------------------------
                         ConsoleWrite("> ... " &  "$last_tool_b_id - Ctrl ID:" & @TAB & $last_tool_b_id & @CRLF)
                        ; -- DEBUG -----------------------------------------------------------------

                    Case $a_cursor_b_info[4] <> $id_button_2_b And $last_tool_b_id = $id_button_2_b                             ; NO MOUSE OVER
                        GUICtrlSetState($id_button_2_a, $GUI_SHOW)
                        GUICtrlSetState($id_button_2_b, $GUI_HIDE)
                        $a_cursor_b_info[4] = 0
                        GUICtrlSetData($id_output_lbl, "Mouse AWAY - Ctrl ID:" & @TAB & $a_cursor_b_info[4])
                        GUICtrlSetBkColor($id_output_lbl,  0x99CCFF)
                        _Swap($id_button_2_a, $id_button_2_b)
                        $last_tool_b_id = 0
                        ; -- DEBUG -----------------------------------------------------------------
                         ConsoleWrite("> ... " &  "$last_tool_b_id - Ctrl ID:" & @TAB & $last_tool_b_id & @CRLF)
                        ; -- DEBUG -----------------------------------------------------------------

                    ; -- Button 3 - Cursor -------------------------------------------------------------------------------------
                    Case  $a_cursor_b_info[4] = $id_button_3_b And $last_tool_b_id = 0                                          ; MOUSE OVER
                        GUICtrlSetState($id_button_3_a, $GUI_SHOW)
                        GUICtrlSetState($id_button_3_b, $GUI_HIDE)
                        GUICtrlSetData($id_output_lbl, "Mouse OVER - Ctrl ID:" & @TAB & $a_cursor_b_info[4])
                        GUICtrlSetBkColor($id_output_lbl, 0xFFFF00)
                        _Swap($id_button_3_a, $id_button_3_b)
                        $last_tool_b_id = $id_button_3_b
                        ; -- DEBUG -----------------------------------------------------------------
                         ConsoleWrite("> ... " &  "$last_tool_b_id - Ctrl ID:" & @TAB & $last_tool_b_id & @CRLF)
                        ; -- DEBUG -----------------------------------------------------------------

                    Case $a_cursor_b_info[4] <> $id_button_3_b And $last_tool_b_id = $id_button_3_b                             ; NO MOUSE OVER
                        GUICtrlSetState($id_button_3_a, $GUI_SHOW)
                        GUICtrlSetState($id_button_3_b, $GUI_HIDE)
                        $a_cursor_b_info[4] = 0
                        GUICtrlSetData($id_output_lbl, "Mouse AWAY - Ctrl ID:" & @TAB & $a_cursor_b_info[4])
                        GUICtrlSetBkColor($id_output_lbl,  0x99CCFF)
                        _Swap($id_button_3_a, $id_button_3_b)
                        $last_tool_b_id = 0
                        ; -- DEBUG -----------------------------------------------------------------
                         ConsoleWrite("> ... " &  "$last_tool_b_id - Ctrl ID:" & @TAB & $last_tool_b_id & @CRLF)
                        ; -- DEBUG -----------------------------------------------------------------

                EndSelect
        EndSelect
    WEnd

    GUIDelete()
EndFunc   ;==> f_toolbar()

Func _Swap(ByRef $iNum1, ByRef $iNum2)
    Local $Temp = $iNum1
    $iNum1 = $iNum2
    $iNum2 = $Temp
EndFunc   ;==>_Swap

Here is a complete example of using Toolbar control.

 

#Include <GUIConstantsEx.au3>
#Include <GUIImageList.au3>
#Include <GUIToolbar.au3>
#Include <StaticConstants.au3>
#Include <ToolbarConstants.au3>
#Include <WindowsConstants.au3>
#Include <WinAPIEx.au3>

$hForm = GUICreate('MyGUI', 332, 332)

$hTool = GUICreate('', 332, 64, 0, 0, $WS_CHILD, 0, $hForm)
$Dummy = GUICtrlCreateDummy()

$hToolbar = _GUICtrlToolbar_Create($hTool, BitOR($BTNS_BUTTON, $BTNS_SHOWTEXT, $TBSTYLE_FLAT, $TBSTYLE_TOOLTIPS), $TBSTYLE_EX_DOUBLEBUFFER)

$hImageList = _GUIImageList_Create(32, 32, 5, 1, 5)
Dim $Icon[5] = [19, 205, 298, 300, 304]
For $i = 0 To 4
    $hIcon = _WinAPI_ShellExtractIcon(@SystemDir & '\shell32.dll', $Icon[$i], 32, 32)
    _GUIImageList_ReplaceIcon($hImageList, -1, $hIcon)
    _WinAPI_DestroyIcon($hIcon)
Next

_GUICtrlToolbar_SetImageList($hToolbar, $hImageList)

_GUICtrlToolbar_AddString($hToolbar, 'Button 1')
_GUICtrlToolbar_AddString($hToolbar, 'Button 2')
_GUICtrlToolbar_AddString($hToolbar, 'Button 3')
_GUICtrlToolbar_AddString($hToolbar, 'Button 4')
_GUICtrlToolbar_AddString($hToolbar, 'Button 5')

_GUICtrlToolbar_AddButton($hToolbar, 10000, 0, 0)
_GUICtrlToolbar_AddButton($hToolbar, 10001, 1, 1)
_GUICtrlToolbar_AddButtonSep($hToolbar, 5)
_GUICtrlToolbar_AddButton($hToolbar, 10002, 2, 2)
_GUICtrlToolbar_AddButton($hToolbar, 10003, 3, 3)
_GUICtrlToolbar_AddButton($hToolbar, 10004, 4, 4)

_GUICtrlToolbar_SetButtonSize($hToolbar, 64, 64)
_GUICtrlToolbar_SetMetrics($hToolbar, 0, 0, 1, 0)
_GUICtrlToolbar_SetIndent($hToolbar, 1)

_SendMessage($hToolbar, $TB_AUTOSIZE)

GUISwitch($hForm)

; Main GUI controls...

GUICtrlCreateLabel('', 0, 64, 335, 2, $SS_ETCHEDHORZ)

GUIRegisterMsg($WM_COMMAND, 'WM_COMMAND')
GUIRegisterMsg($WM_NOTIFY, 'WM_NOTIFY')

GUISetState(@SW_SHOWNOACTIVATE, $hTool)
GUISetState(@SW_SHOW, $hForm)

While 1
    Switch GUIGetMsg()
        Case 0
            ContinueLoop
        Case $GUI_EVENT_CLOSE
            ExitLoop
        Case $Dummy
            $ID = GUICtrlRead($Dummy)
            Switch $ID
                Case 10000 ; Button 1
                    MsgBox(64, 'Toolbar', 'Button 1 has been pressed!', 0, $hForm)
                Case 10001 ; Button 2
                    MsgBox(64, 'Toolbar', 'Button 2 has been pressed!', 0, $hForm)
                Case 10002 ; Button 3
                    MsgBox(64, 'Toolbar', 'Button 3 has been pressed!', 0, $hForm)
                Case 10003 ; Button 4
                    MsgBox(64, 'Toolbar', 'Button 4 has been pressed!', 0, $hForm)
                Case 10004 ; Button 5
                    MsgBox(64, 'Toolbar', 'Button 5 has been pressed!', 0, $hForm)
                Case Else

            EndSwitch
    EndSwitch
WEnd

Func WM_COMMAND($hWnd, $iMsg, $wParam, $lParam)

    Local $ID = BitAND($wParam, 0xFFFF)

    Switch $hWnd
        Case $hTool
            Switch $ID
                Case 10000 To 10004 ; Button 1 - Button 5
                    GUICtrlSendToDummy($Dummy, $ID)
                Case Else

            EndSwitch
    EndSwitch
    Return $GUI_RUNDEFMSG
EndFunc   ;==>WM_COMMAND

Func WM_NOTIFY($hWnd, $iMsg, $wParam, $lParam)

    Local $tNMIA = DllStructCreate($tagNMITEMACTIVATE, $lParam)
    Local $hTarget = DllStructGetData($tNMIA, 'hWndFrom')
    Local $ID = DllStructGetData($tNMIA, 'Code')

    Switch $hWnd
        Case $hTool
            Switch $hTarget
                Case $hToolbar
                    Switch $ID
                        Case $TBN_GETINFOTIPW

;~                          Local $tNMTBGIT = DllStructCreate($tagNMTBGETINFOTIP, $lParam)
                            Local $tNMTBGIT = DllStructCreate($tagNMHDR & ';ptr Text;int TextMax;int Item;lparam lParam;', $lParam)
                            Local $Item = DllStructGetData($tNMTBGIT, 'Item')
                            Local $Text = ''

                            Switch $Item
                                Case 10000 ; Button 1
                                    $Text = 'Tooltip 1'
                                Case 10001 ; Button 2
                                    $Text = 'Tooltip 2'
                                Case 10002 ; Button 3
                                    $Text = 'Tooltip 3'
                                Case 10003 ; Button 4
                                    $Text = 'Tooltip 4'
                                Case 10004 ; Button 5
                                    $Text = 'Tooltip 5'
                                Case Else

                            EndSwitch
                            If $Text Then
                                DllStructSetData(DllStructCreate('wchar[' & DllStructGetData($tNMTBGIT, 'TextMax') & ']', DllStructGetData($tNMTBGIT, 'Text')), 1, $Text)
                            EndIf
                    EndSwitch
            EndSwitch
    EndSwitch
    Return $GUI_RUNDEFMSG
EndFunc   ;==>WM_NOTIFY

In addition, you can use my Skin UDF.

 

#Include <GDIPlus.au3>
#Include <GUIConstantsEx.au3>
#Include <Skin.au3>

_GDIPlus_Startup()

$hForm = GUICreate('MyGUI', 401, 160)
GUISetBkColor(0xF0F0F0)
$Button1 = _Skin_AddButton(12, 119, 29, 29, _LoadBitmap('down_normal.bmp'), _LoadBitmap('down_over.bmp'), _LoadBitmap('down_push.bmp'))
$Button2 = _Skin_AddButton(46, 119, 29, 29, _LoadBitmap('up_normal.bmp'), _LoadBitmap('up_over.bmp'), _LoadBitmap('up_push.bmp'))
$Button3 = _Skin_AddButton(87, 124, 29, 29, _LoadBitmap('down_normal_small.bmp'), _LoadBitmap('down_over_small.bmp'), _LoadBitmap('down_push_small.bmp'))
$Button4 = _Skin_AddButton(111, 124, 29, 29, _LoadBitmap('up_normal_small.bmp'), _LoadBitmap('up_over_small.bmp'), _LoadBitmap('up_push_small.bmp'))
$Button5 = _Skin_AddButton(323, 14, 64, 64, _LoadBitmap('cd_normal.bmp'), _LoadBitmap('cd_over_push.bmp'), _LoadBitmap('cd_over_push.bmp'))
GUISetState()

While 1
    _Skin_Helper($hForm)
    $Msg = GUIGetMsg()
    Switch $Msg
        Case $GUI_EVENT_CLOSE
            ExitLoop
        Case $Button1
            ConsoleWrite('#1' & @CR)
        Case $Button2
            ConsoleWrite('#2' & @CR)
        Case $Button3
            ConsoleWrite('#3' & @CR)
        Case $Button4
            ConsoleWrite('#4' & @CR)
        Case $Button5
            ConsoleWrite('#5' & @CR)
    EndSwitch
WEnd

GUIDelete()

_Skin_Destroy()

Func _LoadBitmap($sPath)

    Local $hBitmap, $hImage

    _GDIPlus_Startup()
    $hImage = _GDIPlus_ImageLoadFromFile($sPath)
    $hBitmap = _GDIPlus_BitmapCreateHBITMAPFromBitmap($hImage)
    _GDIPlus_ImageDispose($hImage)
    _GDIPlus_Shutdown()
    Return $hBitmap
EndFunc   ;==>_LoadBitmap
Link to post
Share on other sites

Yashied,

Thanks for the hint and addition to my coding - fixed the problem and learned and understood something new again ;)

Great examples for both the GuiToolbar as well as Skin UDFs. I probably will use both of them in different areas of my project.

I already started to work through the GuiToolbar examples before but had problems piecing things together and got stuck. However, with getting your examples I gave it another shot and it looks much more promising now.

Your example is nice and complete and it is much easier for me to comprehend now how it works (thumbs UP !). I just started and I am still working on it - and some questions undoubtedly will still arise  :graduated:

Cheers

Edited by Mungo
Link to post
Share on other sites

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 account

Sign in

Already have an account? Sign in here.

Sign In Now
  • Recently Browsing   0 members

    No registered users viewing this page.

  • Similar Content

    • By UEZ
      I'm searching for a way to set an icon for a system menu entry in the console window. I can add / remove entries but I didn't find a way to set an icon for the entry I made.
      Example:
      #AutoIt3Wrapper_Change2CUI=y #include <GDIPlus.au3> #include <GUIConstantsEx.au3> #include <GuiMenu.au3> #include <WindowsConstants.au3> Global $id_Test = 5000 Global $hConsole = HWnd(DllCall("kernel32.dll", "hwnd", "GetConsoleWindow")[0]) If Not $hConsole Then Exit HotKeySet("{ESC}", "_Exit") Global $hSysmenu = _GUICtrlMenu_GetSystemMenu($hConsole) Global $iCount = _GUICtrlMenu_GetItemCount ($hSysmenu) _GUICtrlMenu_InsertMenuItem($hSysmenu, $iCount, "Test", $id_Test) _GDIPlus_Startup() $hBitmap_GDI = _GDIPlus_BitmapCreateFromMemory(_Test(), True) ConsoleWrite('@@ Debug(' & @ScriptLineNumber & ') : $hBitmap_GDI = ' & $hBitmap_GDI & @CRLF & '>Error code: ' & @error & @CRLF) ;### Debug Console $hBmp1 = _WinAPI_CreateSolidBitmap($hConsole, 0xFF0000, 16, 16) ConsoleWrite('@@ Debug(' & @ScriptLineNumber & ') : $hBmp1 = ' & $hBmp1 & @CRLF & '>Error code: ' & @error & @CRLF) ;### Debug Console $hBmp2 = _WinAPI_CreateSolidBitmap($hConsole, 0x00FF00, 16, 16) ConsoleWrite('@@ Debug(' & @ScriptLineNumber & ') : $hBmp2 = ' & $hBmp2 & @CRLF & '>Error code: ' & @error & @CRLF) ;### Debug Console ;ConsoleWrite(_GUICtrlMenu_SetItemBmp($hSysmenu, $id_Test, $hBitmap_GDI, False) & @CRLF) ConsoleWrite(_GUICtrlMenu_SetItemBitmaps($hSysmenu, $id_Test, $hBmp1, $hBmp2, False) & ", " & @error & @CRLF) ;_GUICtrlMenu_SetItemBmp($hSysmenu, $id_Test, 8, False) ;set the default close icon _GDIPlus_Shutdown() Do Sleep(1000) Until False Func _Exit() ConsoleWrite("Bye..." & @CRLF) _GUICtrlMenu_DeleteMenu ($hSysmenu, $id_Test, False) _WinAPI_DeleteObject($hBitmap_GDI) _WinAPI_DeleteObject($hBmp1) _WinAPI_DeleteObject($hBmp2) Exit EndFunc ;Code below was generated by: 'File to Base64 String' Code Generator v1.20 Build 2020-06-05 Func _Test($bSaveBinary = False, $sSavePath = @ScriptDir) Local $Test $Test &= 'iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAACXBIWXMAAA3XAAAN1wFCKJt4AAADKElEQVQ4yz2RT2gcdRTHP7+Z36y7yzZZdvJv22i0rBpiAwnWCMZrUCGIBxEvpQSEHAQhePLkyUKg6Em9iZCcahH0pFYxkIqiIdHKYmPUUHcDmU2TuJnZzc7s/H7PQ5M8ePAu7/M+X56y1hKGYY+IOEDqOI6TzWY1gFIKEcF1XRzHUWmaJnF8bHBy5pfbnz9fb0hBh2F4bm5ubjWKogudTqdVqVT0/Py853kehUKBQqHA2tqaVKtVfenS2P6HH396PDri9D9+cdC/8dkXNW2t9fb29spRFPmtVqtULBaVMYZ8Pk82m8X3farVKjdv3qCn+FbpnFuXfNpQkkwlX33z3RtaKYXW2mqtcV1XtNZks9kzQCaTIeNp4sSh8rAnzSe0HO5bt1arHR51y79pEcEYo05Aylp7OqOUIk0TRp+aYO5Ki3B3VR3s70pictzZGlC5jHW0UgprLVEU4Xke29vbLCwsoLXGcRRxYjk/2MtLz2X4/tvbaO3y9XoPlUe7CI7VAMYYPM+jXC5jrcUYAwipUeSzHhV/k59+bFK5OMytOxco9ezQTQ2A4ujoqDQ+Ph4sLS2JiNiDgwM5PDyQ3SCQ/5ptubv6rsy9XJIfvnxbNv/8W+7d+9deu/aeTE9PB2EYljSAiKje3l7SNCUIAkDQXp77f3zE4uJ1Xnv9KoWRK+zs1DlfHiCXy2OtBcA5AdDpdHBdl4F+n77BEdz2z3zw/iKvvHqVZ194h0wmz0B/Ca094jjmtE4NEBFarRa7jfvkHgqp/rrKxOQzjF6+wtY/u4g9Jo5TfL+EiGCtxVqLFhGUUhhjsNZgrcvqrU948rFhKlNvEkUdtNvBoFEqPVtUSqGUQiulaDabtNttPC/D5t3fqTU0Y5dfpNFogFhEOLsaxzHtdpsgCNT6+rrSSZIwOztrhoeH' $Test &= 'qdfrRmutJp6e4q+tKsbYs3in7+7r65OhoSE9MzNjkiRBt9ttkiRxjTHkcjl3bGxMPYhjSdP0rLvdLt1uF9d1BcDzPHdyclL0yspKuLGxcT0IgkeKxaINgsADXBFxAefEQB4ImNT3/W4Yhk6z2awtLy9H/wPnrsNEnFPl4QAAAABJRU5ErkJggg==' Local $bString = _WinAPI_Base64Decode($Test) If @error Then Return SetError(1, 0, 0) $bString = Binary($bString) If $bSaveBinary Then Local Const $hFile = FileOpen($sSavePath & "\AutoSave_16x16_04.png", 18) If @error Then Return SetError(2, 0, $bString) FileWrite($hFile, $bString) FileClose($hFile) EndIf Return $bString EndFunc ;==>_Test Func _WinAPI_Base64Decode($sB64String) Local $aCrypt = DllCall("Crypt32.dll", "bool", "CryptStringToBinaryA", "str", $sB64String, "dword", 0, "dword", 1, "ptr", 0, "dword*", 0, "ptr", 0, "ptr", 0) If @error Or Not $aCrypt[0] Then Return SetError(1, 0, "") Local $bBuffer = DllStructCreate("byte[" & $aCrypt[5] & "]") $aCrypt = DllCall("Crypt32.dll", "bool", "CryptStringToBinaryA", "str", $sB64String, "dword", 0, "dword", 1, "struct*", $bBuffer, "dword*", $aCrypt[5], "ptr", 0, "ptr", 0) If @error Or Not $aCrypt[0] Then Return SetError(2, 0, "") Return DllStructGetData($bBuffer, 1) EndFunc ;==>_WinAPI_Base64Decode  
      You must compile and run it to see the menu entry in the console window.

       
      Any idea?
    • By Jemboy
      Recently I was working on a script with icons using GuiCtrkCreatIcon.
      I decided to change the sub folder name of the icons to a more meaning name, however made a typo.

      I tested the .exe on my test computer and it worked flawlessly (because both icon folder where on my test computer) 😁
      But after I installed the script on the intended computers , I got chaos!😵
      Zooming into the problem, I discovered, that because the icons could not be found, the ControlID were returned with a value of 0
      and thus played havoc within the GuiGetMsg() switch/case statement.
      I have been able to reproduce this  (see example)
      #include <GUIConstantsEx.au3> ;============================================================================================================ ; PLEASE, do not save this example in the example folder: C:\Program Files (x86)\AutoIt3\Examples\Helpfile ;============================================================================================================ Example() Func Example() GUICreate(" My GUI Icons", 250, 250) $Icon1 = GUICtrlCreateIcon("shell32.dll", 10, 20, 20) $Icon2 = GUICtrlCreateIcon(@ScriptDir & '\Extras\horse.ani', -1, 20, 40, 32, 32) $Icon3 = GUICtrlCreateIcon("shell32.dll", 7, 20, 75, 32, 32) GUISetState(@SW_SHOW) ;$Icon2 = -1 ; ==> When this line is uncommented the script "works", so -1 could be a potential fix. ; Loop until the user exits. While 1 Switch GUIGetMsg() Case $GUI_EVENT_CLOSE ExitLoop Case $Icon2 Beep (500,500) EndSwitch WEnd GUIDelete() EndFunc ;==>Example If you save the above script outside the Autoit example folder and run it, it will keep beeping because GuiCtrlCreatIcon did not find horse.ani and return $Icon2=0.
      At the moment GUICtrlCreateIcon () only returns the conntrolID on success and 0 on failure.
      I would like to propose a return of -1 on failure, so a existing and working script won't go awry when the icon can not be found.
       
    • By Zobu
      Hey Guys,
      I want to add a new checkbox with its own variable every time the add button is clicked.
      The added checkboxes should remain when I close the window or exit the script and when I reopen I should be able to add new checkboxes aswell.
      here is what I have so far..
      #include <GUIConstantsEx.au3> #include <WindowsConstants.au3> #include <StaticConstants.au3> #include <EditConstants.au3> #include <MsgBoxConstants.au3> #include <GuiButton.au3> $test = GUICreate("adding test", 475, 345, 500, 175) $Check1 = GUICtrlCreateCheckbox("Checkbox 1", 15, 25, 300, 25) $Button = GUICtrlCreateButton("Add", 365, 25, 90, 20) $Check2 = GUICtrlCreateCheckbox("Checkbox 2", 15, 50, 300, 25) $Check3 = GUICtrlCreateCheckbox("Checkbox 3", 15, 75, 300, 25) GUICtrlSetState($Check2, $GUI_HIDE) GUICtrlSetState($Check3, $GUI_HIDE) GUISetState(@SW_SHOW) While 1 Switch GUIGetMsg() Case $GUI_EVENT_CLOSE ; Exit Case $Button GUICtrlSetPos($Check2, 15, 50, 300, 25) GUICtrlSetState($Check2, $GUI_SHOW) Case $Button GUICtrlSetPos($Check3, 15, 75, 300, 25) GUICtrlSetState($Check3, $GUI_SHOW) EndSwitch WEnd  
    • By MarcoMonte
      Hello Everyone,
      Hoping someone can help me,
      I am totally stuck on this problem,

      I cannot reach the textarea and the button in a maps page that I get by clicking on a button in a previus page, the only way I can interact with this is using tab and mouseclick but this is a danger method as  you know.

      I get the handle by using: $Posizione = _IEAttach("Ricerca Indirizzo su mappa")

      then I tried a lot of things but nothing works, can someone give me a hint?
      --------------------
      WinWait("Ricerca Indirizzo su mappa")
      sleep(1000)
      $Posizione = _IEAttach("Ricerca Indirizzo su mappa")
      WinSetState ("Ricerca Indirizzo su mappa", "", @SW_MAXIMIZE  )
      WinActivate("Ricerca Indirizzo su mappa")
      sleep(500)
      ;~ $oForm = _IEFormGetObjByName($Posizione, "form1");Punta il Form
      $oText = _IEFormElementGetObjByName($Posizione,"indirizzo")
      $oText = _IEFormElementGetObjByName($Posizione,"writeAddress")

      ;~ $LenteTestoMess = _IEFormElementGetValue($oText);Inserisce il PrimoRepertorio nella variabile
      ;~ _IELinkClickByText($Posizione, $oForm);Clicca su Aggiorna ed invia il form
      _IEFormElementSetValue ($oText,"via Ravenna 12" );Completamento campo testo
      ----------------------------------------------------
      Mappa.odt Ricerca Indirizzo su mappa.htm
    • By GillesMaisonneuve
      Good morning,
       
      I am trying to align a two-line text in a button so that it would be centered in the button but can't succeed to do it for the vertical part.
      Can someone tell me what I do wrong ?
      Here is my code:
      $btn3 = GUICtrlCreateButton("Execute " & @LF & " file 1", 100, 65, 60, 50, _ BitOr($BS_CENTER,$BS_BOTTOM,$BS_MULTILINE)) and here is the resulting layout I get in my window.
      I tried to follow the help, made a lot of different parameter combinations (here it's `$BS_BOTTOM`, but I tried `$BS_VCENTER` and `$BS_TOP`), still get the same result : vertical alignement is a no go for me.
      Can someone help ?
      TIA
      Gilles

×
×
  • Create New...