Jump to content

Recommended Posts

Hi Guis,

 

I need to create keyboard shortcut to navigate the tabs and activate them, but I could not use the code below:

#include <TabConstants.au3>
#include <WindowsConstants.au3>
#include <GuiTab.au3>
#include <GUIConstantsEx.au3>


HotKeySet("^{TAB}", "_TabRight")
HotKeySet("^+{TAB}", "_TabLeft")


$gui = GUICreate("test",450, 300)

$Tab1 = GUICtrlCreateTab(20, 24, 425, 201)
$TabSheet1 = GUICtrlCreateTabItem("Tabsheet 1")
$lbContagemGrupos2 = GUICtrlCreateLabel("aaaa", 50, 50)
GUICtrlSetColor(-1, 0x0000FF)
GUICtrlCreateTabItem("")
$TabSheet2 = GUICtrlCreateTabItem(" ")
$TabSheet3 = GUICtrlCreateTabItem(" ")

GUISetState()

While 1
    Switch GUIGetMsg()
        Case $GUI_EVENT_CLOSE
            ExitLoop
    EndSwitch
WEnd

Func _TabRight()
    $CurPos = _GUICtrlTab_GetCurSel($Tab1)
    _GUICtrlTab_SetCurSel($Tab1, $CurPos + 1)
    $tab = "$TabSheet" & $CurPos
    GUICtrlSetState($TabSheet1 + $CurPos, $GUI_SHOW)
    Return
EndFunc

Func _TabLeft()
    $CurPos = _GUICtrlTab_GetCurSel($Tab1)
    _GUICtrlTab_SetCurSel($Tab1, $CurPos - 1)
    $tab = "$TabSheet" & $CurPos
    GUICtrlSetState($TabSheet1 + $CurPos, $GUI_SHOW)
    Return
EndFunc


Exit

 

can you help me?

Link to post
Share on other sites

Try this.  It uses GUISetAccelerators instead of hotkey.  This is probably better since you are trying to override default Windows hotkeys.  GUISetAccelerators will only do it while your GUI is active.  Of course you should probably add additional logic to make sure that you are not trying to set the tab index less than the first or greater than the last tab.  Also, you didn't need the GUISetState functions in the _TabLeft and _TabRight functions.

For the record, your original logic would have worked by just taking out the GUISetState functions in your _TabRight() and _TabLeft() functions.  However, as stated above, you only want to use those accelerators while your GUI is active, not system-wide.

 

#include <TabConstants.au3>
#include <WindowsConstants.au3>
#include <GuiTab.au3>
#include <GUIConstantsEx.au3>


;~ HotKeySet("^{tab}\r", "_TabRight")
;~ HotKeySet("^+{tab}", "_TabLeft")


$gui = GUICreate("test",450, 300)

$PrevTab   = GUICtrlCreateDummy()
$NextTab   = GUICtrlCreateDummy()

$Tab1 = GUICtrlCreateTab(20, 24, 425, 201)
$TabSheet1 = GUICtrlCreateTabItem("Tabsheet 1")
$lbContagemGrupos2 = GUICtrlCreateLabel("aaaa", 50, 50)
GUICtrlSetColor(-1, 0x0000FF)
GUICtrlCreateTabItem("")
$TabSheet2 = GUICtrlCreateTabItem(" ")
$TabSheet3 = GUICtrlCreateTabItem(" ")

Global $aAccels[2][2] = [["^+{tab}", $PrevTab], ["^{tab}", $NextTab]]
GUISetAccelerators($aAccels)

GUISetState()

While 1
    Switch GUIGetMsg()
        Case $GUI_EVENT_CLOSE
            ExitLoop
        Case $PrevTab
            _TabLeft()
        Case $NextTab
            _TabRight()
    EndSwitch
WEnd

Func _TabRight()
    ConsoleWrite("Right" & @CRLF)
    $CurPos = _GUICtrlTab_GetCurSel($Tab1)
    _GUICtrlTab_SetCurSel($Tab1, $CurPos + 1)
    $tab = "$TabSheet" & $CurPos
;~     GUICtrlSetState($TabSheet1 + $CurPos, $GUI_SHOW)
    Return
EndFunc

Func _TabLeft()
    ConsoleWrite("Left" & @CRLF)
    $CurPos = _GUICtrlTab_GetCurSel($Tab1)
    _GUICtrlTab_SetCurSel($Tab1, $CurPos - 1)
    $tab = "$TabSheet" & $CurPos
;~     GUICtrlSetState($TabSheet1 + $CurPos, $GUI_SHOW)
    Return
EndFunc


Exit

 

Edited by TheXman
Link to post
Share on other sites
1 hour ago, TheXman said:

Try this.  It uses GUISetAccelerators instead of hotkey.  This is probably better since you are trying to override the default windows hotkey.  This will only do it while your GUI is active.  Of course you should add additional logic to make sure you are not trying to set the tab index higher or lower than the actual number of tabs.  Also, you didn't need the additional GUISetState in the _left and _right functions.

For the record, your original logic would have worked by just taking out the GUISetState functions in your _TabRight() and _TabLeft() functions.  However, as stated above, you only want to use those accelerators while your GUI is active, not system-wide.

 

 

 

Label aaaa is in TAB1, but when using the shortcuts it is still shown in TAB2.
I validated that it is not enabling the TAB and just walking through them.

image.png.17ab97ebe9d4d4366fb877f322dcaa39.png

 

Link to post
Share on other sites

I'm not being critical, just factual.  I looked at your code, and other than changing tabs using a hotkey, I don't have a clue what you're trying to do.

So maybe you can start with a detailed explanation of what it is you are trying to accomplish, what results you are expecting, and any other information that may be be relevant to someone trying to help you help yourself.

Link to post
Share on other sites

I'm sorry, my English is bad.

In the code that you helped me I can walk the TABS, but only the TABS are changed, the contents always remain the one of TAB1.

Example:
In TAB1 there is a label with the caption "aaaaa", when it changes to TAB2 the contents of TAB1 appear, so it has not changed to the contents of TAB2.

It looks like it does not activate the next TAB just browsing between them.

Link to post
Share on other sites

Your problem is by creating the GUI, corected:

$PrevTab   = GUICtrlCreateDummy()
$NextTab   = GUICtrlCreateDummy()

$Tab1 = GUICtrlCreateTab(20, 24, 425, 201)
$TabSheet1 = GUICtrlCreateTabItem("Tabsheet 1")
$lbContagemGrupos2 = GUICtrlCreateLabel("aaaa", 50, 50)
GUICtrlSetColor(-1, 0x0000FF)
$TabSheet2 = GUICtrlCreateTabItem(" ")
$TabSheet3 = GUICtrlCreateTabItem(" ")
GUICtrlCreateTabItem("")

GUISetState()

GUICtrlCreateTabItem("") must be after last tabsheet is created.

Edited by AutoBert
Link to post
Share on other sites

Do you mean like this?  Notice that I used _GUICtrlTab_ActivateTab() instead of GuiControlSetState() or GuiControlSetData().

 

#include <TabConstants.au3>
#include <WindowsConstants.au3>
#include <GuiTab.au3>
#include <GUIConstantsEx.au3>


;~ HotKeySet("^{tab}\r", "_TabRight")
;~ HotKeySet("^+{tab}", "_TabLeft")


$gui = GUICreate("test",450, 300)

$PrevTab   = GUICtrlCreateDummy()
$NextTab   = GUICtrlCreateDummy()

$Tab1 = GUICtrlCreateTab(20, 24, 425, 201)
$TabSheet1 = GUICtrlCreateTabItem("Tabsheet 1")
$lb1 = GUICtrlCreateLabel("aaaa", 50, 50)
$TabSheet2 = GUICtrlCreateTabItem("Tabsheet 2")
$lb2 = GUICtrlCreateLabel("bbbb", 50, 50)
$TabSheet3 = GUICtrlCreateTabItem("Tabsheet 3")
$lb3 = GUICtrlCreateLabel("cccc", 50, 50)
GUICtrlCreateTabItem("")

Global $aAccels[2][2] = [["^+{tab}", $PrevTab], ["^{tab}", $NextTab]]
GUISetAccelerators($aAccels)

GUISetState()

While 1
    Switch GUIGetMsg()
        Case $GUI_EVENT_CLOSE
            ExitLoop
        Case $PrevTab
            _TabLeft()
        Case $NextTab
            _TabRight()
    EndSwitch
WEnd

Func _TabRight()
    $CurPos = _GUICtrlTab_GetCurSel($Tab1)
    If $CurPos < _GUICtrlTab_GetItemCount($Tab1) - 1 Then
        _GUICtrlTab_ActivateTab($Tab1, $CurPos + 1)
        ConsoleWrite("Tab Right" & @CRLF)
    EndIf
EndFunc

Func _TabLeft()
    $CurPos = _GUICtrlTab_GetCurSel($Tab1)
    If $CurPos > 0 Then
        _GUICtrlTab_ActivateTab($Tab1, $CurPos - 1)
        ConsoleWrite("Tab Left" & @CRLF)
    EndIf
EndFunc

 

Edited by TheXman
Link to post
Share on other sites
15 hours ago, TheXman said:

Do you mean like this?  Notice that I used _GUICtrlTab_ActivateTab() instead of GuiControlSetState() or GuiControlSetData().

 

#include <TabConstants.au3>
#include <WindowsConstants.au3>
#include <GuiTab.au3>
#include <GUIConstantsEx.au3>


;~ HotKeySet("^{tab}\r", "_TabRight")
;~ HotKeySet("^+{tab}", "_TabLeft")


$gui = GUICreate("test",450, 300)

$PrevTab   = GUICtrlCreateDummy()
$NextTab   = GUICtrlCreateDummy()

$Tab1 = GUICtrlCreateTab(20, 24, 425, 201)
$TabSheet1 = GUICtrlCreateTabItem("Tabsheet 1")
$lb1 = GUICtrlCreateLabel("aaaa", 50, 50)
$TabSheet2 = GUICtrlCreateTabItem("Tabsheet 2")
$lb2 = GUICtrlCreateLabel("bbbb", 50, 50)
$TabSheet3 = GUICtrlCreateTabItem("Tabsheet 3")
$lb3 = GUICtrlCreateLabel("cccc", 50, 50)
GUICtrlCreateTabItem("")

Global $aAccels[2][2] = [["^+{tab}", $PrevTab], ["^{tab}", $NextTab]]
GUISetAccelerators($aAccels)

GUISetState()

While 1
    Switch GUIGetMsg()
        Case $GUI_EVENT_CLOSE
            ExitLoop
        Case $PrevTab
            _TabLeft()
        Case $NextTab
            _TabRight()
    EndSwitch
WEnd

Func _TabRight()
    $CurPos = _GUICtrlTab_GetCurSel($Tab1)
    If $CurPos < _GUICtrlTab_GetItemCount($Tab1) - 1 Then
        _GUICtrlTab_ActivateTab($Tab1, $CurPos + 1)
        ConsoleWrite("Tab Right" & @CRLF)
    EndIf
EndFunc

Func _TabLeft()
    $CurPos = _GUICtrlTab_GetCurSel($Tab1)
    If $CurPos > 0 Then
        _GUICtrlTab_ActivateTab($Tab1, $CurPos - 1)
        ConsoleWrite("Tab Left" & @CRLF)
    EndIf
EndFunc

 

Tks!

 

Good Work.

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 It_is_me_Me
      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?
       
      Thanks.
    • By ashraful089
      #include <ButtonConstants.au3>
      #include <ComboConstants.au3>
      #include <GUIConstantsEx.au3>
      #include <WindowsConstants.au3>
      #Region ### START Koda GUI section ### Form=C:\Users\Engr. Ashraful\Videos\koda_1.7.3.0\Forms\ProgramPlayer\FormProgamToOpen.kxf
      $FormInput = GUICreate("Input", 302, 205, 454, 285)
      $Resolution = GUICtrlCreateCombo("Resolution", 80, 24, 145, 25)
      GUICtrlSetData(-1, "1920|VM1920|1366")
      $ComboProgramType = GUICtrlCreateCombo("Program Type Selection", 80, 64, 145, 25, BitOR($CBS_DROPDOWN,$CBS_AUTOHSCROLL))
      GUICtrlSetData(-1, "Multimedia|Official|Design|Web")
      $ButtonEnter = GUICtrlCreateButton("Enter", 104, 104, 75, 25)
      GUISetState(@SW_SHOW)
      #EndRegion ### END Koda GUI section ###
      While 1
          $nMsg = GUIGetMsg()
          Switch $nMsg
              Case $GUI_EVENT_CLOSE
                  Exit
          EndSwitch
      WEnd
       
      please help me to read combo box input and use the value for another function/ work
       
    • By Aapjuh
      Hi,
      I am having a problem properly saving the Width of a resizable Gui.
      When a user resizes the Gui it gets saved in an ini when the Gui closes to then restore the new Width upon reopening the app.
      with GUICreate("myGui",300,200,Default,Default,$WS_SIZEBOX)
      WinGetPos($hGUI) returns 314, and WinGetClientSize($hGUI) returns 298
      when its then saved in the ini the gui keeps expanding or shrinking every time its opened by +14 or -2
      I figure it has to do with borders etc, but i also guess borders depend on the window theme and whatnot or is user specific, so i can't just do $GuiWidth = $GetGuiWidth[arr] -14 or +2 right?

      is there a proper way of doing this?
      Thanks in advance,
      Aapjuh
    • By It_is_me_Me
      I have provided a portion of my script (seen below) and I wanted to use what the USER will input into my IP address box and input box for TCP port. I set the IP address to use 0.0.0.0 as default and the Port to 502. But I want to let the user change it and when they click the buttons (IP Address and Port), the tooltip will show what the USER entered. How can I use the details that the User will input into my input box and IP address box and let them see what they entered when they click the buttons?
       
      Here are the scripts:
      ;-------------------------------------------------------------
      #include <ButtonConstants.au3>
      #include <ComboConstants.au3>
      #include <EditConstants.au3>
      #include <GUIConstantsEx.au3>
      #include <GuiIPAddress.au3>
      #include <StaticConstants.au3>
      #include <WindowsConstants.au3>
      #include <GuiEdit.au3>
      #include <MsgBoxConstants.au3>
      #include <Date.au3>
      #include <TabConstants.au3>
      #include <GuiTab.au3>

      Global $Form1 = GUICreate("Security Automation", 490, 339, -1, -1)
      ;MAIN Tab
      Global $TAB = GUICtrlCreateTab(0, 0, 489, 337)
      Global $tab_main = GUICtrlCreateTabItem("Main")
      $label_Title = GUICtrlCreateLabel("ETP-073 Security", 12, 33, 103, 17)
      GUICtrlSetFont(-1, 8, 800, 0, "MS Sans Serif")
      ;-----------------TCP User input information-------------------------------------------------------------------------------
      $groupBox_TCP = GUICtrlCreateGroup("TCP", 12, 49, 289, 57, BitOR($GUI_SS_DEFAULT_GROUP,$BS_FLAT))
      ;TCP IP address
      Global $IPAddress1 = _GUICtrlIpAddress_Create($Form1, 20, 81, 170, 21)
      $Label_ipAddress = GUICtrlCreateLabel("Host IP Address", 20, 65, 80, 17)
      $userInputIP = _GUICtrlIpAddress_Set($IPAddress1, "0.0.0.0")
      ;TCP Port
      $label_tcpPort = GUICtrlCreateLabel("Port", 196, 65, 23, 17)
      Global $input_tcpPort = GUICtrlCreateInput("502", 196, 81, 57, 21, BitOR($GUI_SS_DEFAULT_INPUT,$ES_CENTER))
      $userPort = GUICtrlRead($input_tcpPort)
      ;TCP Address
      $label_tcpAddress = GUICtrlCreateLabel("Addr.", 260, 65, 29, 17)
      Global $input_tcpDevAddress = GUICtrlCreateInput("1", 260, 81, 33, 21, BitOR($GUI_SS_DEFAULT_INPUT,$ES_CENTER))
      ;Buttons
      Global $btn_userIP = GUICtrlCreateButton("User IP", 308, 297, 81, 25)
      Global $btn_Port = GUICtrlCreateButton("Port", 404, 297, 75, 25)
      ;Showing the GUI
      GUISetState(@SW_SHOW)
      While 1
         $nMsg = GUIGetMsg()
         Switch $nMsg
            Case $GUI_EVENT_CLOSE
               Exit
            Case $btn_userIP
               ToolTip($userInputIP)
            Case $btn_Port
               ToolTip($userPort)
         EndSwitch
      WEnd
      ;--------------end of script ------------------
       
      Note: There will be a "!->Includefile <WMDebug.au3> not found." Pay no attention to it.
    • By CYBRIX
      So I am a person who has learned programming off the internet, without structured courses, and I'm trying to create a UI element that can be used like "GUICtrlCreate...".

      I'd like to get some kind of insight on how to improve the code of a Graph element that I have created.
      I am unfamiliar on the standards for creating such UI elements, and assume I'll get some valuable insight here.
       
      Here's some sample code: (I tried to make it look a bit less upsetting to those who know better, but be warned: not pretty.)
      #include <WinAPISys.au3> #include <WinAPI.au3> #include <WinAPIGdi.au3> #include <Array.au3> #include <WindowsConstants.au3> #include <GUIConstants.au3> Local $hWnd = GUICreate("Test", 200, 200) GUISetState(@SW_SHOW, $hWnd) Local $hGraph = _GraphStartUp($hWnd, 10, 30, 180, 180) Local $nData, $nDataMax = 1000, $hDataTimer = TimerInit() While GUIGetMsg() <> $GUI_EVENT_ClOSE If TimerDiff($hDataTimer) >= 150 Then $nData = Random(0, $nDataMax) _UpdateGraph($nData) $hDataTimer = TimerInit() EndIf Sleep(20) WEnd _GraphShutDown($hWnd, $hGraph) Exit Func _GraphStartUp($hWnd, $x, $y, $w, $h, $nUpdateTimes = 1000, $nResolution = 60) Global $hBluePen = _WinAPI_CreatePen($PS_SOLID, 2, _WinAPI_RGB(220, 0, 0)) Global $hGreyPen = _WinAPI_CreatePen($PS_DASH, 1, _WinAPI_RGB(100, 100, 100)) Global $hBlackPen = _WinAPI_CreatePen($PS_SOLID, 1, _WinAPI_RGB(0, 0, 0)) Global $hWhitePen = _WinAPI_CreatePen($PS_SOLID, 1, _WinAPI_RGB(255, 255, 255)) Global $nGraphRes = $nResolution Global $aGraphData[$nGraphRes + 1] For $i = 2 To $nGraphRes $aGraphData[$i] = 0 Next Global $hWinDC = _WinAPI_GetWindowDC($hWnd) Global $nGraphX = $x Global $nGraphY = $y Global $nGraphWidth = $w Global $nGraphHeight = $h Global $nGraphXUnit = $nGraphWidth / ($nGraphRes - 1) Global $nGraphBottomY = $nGraphY + $nGraphHeight Global $nGraphMaxX = $nGraphX + $nGraphWidth Global $aUpdateArea[4][2] = [[$nGraphX - 1, $nGraphY - 1], [$nGraphX - 1, $nGraphBottomY + 1], [$nGraphMaxX + 1, $nGraphBottomY + 1], [$nGraphMaxX + 1, $nGraphY - 1]] Global $pUpdateAreaRgn = _WinAPI_CreatePolygonRgn($aUpdateArea) Global $pTextRect = _WinAPI_CreateRectEx($nGraphX + 1, $nGraphY + 1, $nGraphWidth / 2, $nGraphHeight / 4) Global $nGreatestValue = 1 GLobal $pGraphArea = _WinAPI_CreateRectEx($nGraphX - 7, $nGraphY - 26, $nGraphWidth + 14, $nGraphHeight + 2) Global $pDrawCall = DllCallbackRegister('_DrawGraph', 'none', '') Global $pGraphTimer = _WinAPI_SetTimer($hWnd, 567891234, $nUpdateTimes, DllCallbackGetPtr($pDrawCall)) _DrawGraph() Return $pGraphTimer EndFunc Func _DrawGraph() Global $hPen $nGreatestValue = _ArrayMax($aGraphData, 1, 1) $hPen = _WinAPI_SelectObject($hWinDC, $hWhitePen) _WinAPI_PaintRgn($hWinDC, $pUpdateAreaRgn) $hPen = _WinAPI_SelectObject($hWinDC, $hGreyPen) _WinAPI_DrawLine($hWinDC, $nGraphX, $nGraphY, $nGraphMaxX, $nGraphY) _WinAPI_DrawLine($hWinDC, $nGraphX, $nGraphY + ($nGraphHeight / 2), $nGraphMaxX, $nGraphY + ($nGraphHeight / 2)) _WinAPI_DrawLine($hWinDC, $nGraphMaxX, $nGraphY, $nGraphMaxX, $nGraphBottomY) $hPen = _WinAPI_SelectObject($hWinDC, $hBluePen) For $i = 1 To $nGraphRes - 1 _WinAPI_DrawLine($hWinDC, $nGraphX + (($i - 1) * $nGraphXUnit), $nGraphBottomY - ($aGraphData[$i] / $nGreatestValue * $nGraphHeight), $nGraphX + ($i * $nGraphXUnit), $nGraphBottomY - ($aGraphData[$i + 1] / $nGreatestValue * $nGraphHeight)) Next $hPen = _WinAPI_SelectObject($hWinDC, $hBlackPen) _WinAPI_DrawLine($hWinDC, $nGraphX, $nGraphBottomY, $nGraphMaxX, $nGraphBottomY) _WinAPI_DrawLine($hWinDC, $nGraphX, $nGraphY, $nGraphX, $nGraphBottomY) _WinAPI_DrawText($hWinDC, Round($aGraphData[$nGraphRes], 2), $pTextRect, $DT_LEFT) EndFunc Func _UpdateGraph($nData) _ArrayAdd($aGraphData, $nData) _ArrayDelete($aGraphData, 1) EndFunc Func _GraphShutDown($hWnd, $pGraphTimer) _WinAPI_SelectObject($hWinDC, $hPen) _WinAPI_DeleteObject($hBlackPen) _WinAPI_DeleteObject($hGreyPen) _WinAPI_DeleteObject($hBluePen) _WinAPI_DeleteObject($hWhitePen) _WinAPI_ReleaseDC($hWnd, $hWinDC) _WinAPI_KillTimer($hWnd, $pGraphTimer) DllCallbackFree($pDrawCall) _WinAPI_RedrawWindow($hWnd, $pGraphArea) EndFunc  
×
×
  • Create New...