Jump to content
Sign in to follow this  
Blois

HOTKEYS TAB GUI

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?

Share this post


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

Share this post


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

 

Share this post


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.

Share this post


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.

Share this post


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

Share this post


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

Share this post


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.

Share this post


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
Sign in to follow this  

  • Recently Browsing   0 members

    No registered users viewing this page.

  • Similar Content

    • By Synaps3
      This script will make it so you can press Alt + "+" in Windows Explorer to select all files with the current file extension. This is something that I wanted for a long time and it should be a feature in Windows, but it's not. The only way to get close is to use the search thing (but then it shows the results excluding everything else) or to group by that type, but I don't want it grouped.
      You can press Alt + Enter right after to open properties on those files or you can press delete to delete only files of that type.
      You need the "Automating Windows Explorer" pack here: https://www.autoitscript.com/forum/topic/162905-automating-windows-explorer/
       
      #include "Includes\AutomatingWindowsExplorer.au3" #include <Array.au3> Opt( "MustDeclareVars", 1 ) HotKeySet("!=", "SelectTypes") Func SelectTypes() ; Windows Explorer on XP, Vista, 7, 8 Local $hExplorer = WinGetHandle("[REGEXPCLASS:^(Cabinet|Explore)WClass$]") If Not $hExplorer Then MsgBox(0, "Explorer", "Could not find Windows Explorer.") Return EndIf $hExplorer = WinActive("[REGEXPCLASS:^(Cabinet|Explore)WClass$]") If Not $hExplorer Then MsgBox(0, "Explorer", "Windows Explorer is not in focus.") Return EndIf ; Get an IShellBrowser interface GetIShellBrowser($hExplorer) If Not IsObj($oIShellBrowser) Then MsgBox(0, "Explorer", "Could not get an IShellBrowser interface.") Return EndIf ; Get other interfaces GetShellInterfaces() ; Get selected files with full path ;GetFiles( $fSelected = False, $fFullPath = False, $fPidl = False, $iMax = 0 ) Local $aAllFiles = GetItems(False, False) Local $aFiles = GetItems(True, False) Local $sExt Local $i If UBound($aFiles) = 1 Then ;MsgBox(0, "Selected", $aFiles[0]) $sExt = StringRight($aFiles[0], StringLen($aFiles[0]) - StringInStr($aFiles[0], ".", 0, -1)) ;MsgBox(0, "Selected", $sExt) For $i = 0 To UBound($aAllFiles) - 1 If StringInStr($aAllFiles[$i], ".") > 0 Then If StringRight($aAllFiles[$i], StringLen($aAllFiles[$i]) - StringInStr($aAllFiles[$i], ".", 0, -1)) = $sExt Then SetSelectedItem($i) EndIf EndIf Next Else MsgBox($MB_ICONWARNING, "Error", "None or multiple items selected!") EndIf EndFunc While 1 GUIGetMsg() Wend  
    • By paw
      I use SetSoundDevice to control my audio devices but the UI was either
       
      blurry like this:
      or unusable like this:

      so I made this horrible thing to add scaling to the GUI:
      #Region ;**** Directives created by AutoIt3Wrapper_GUI **** #AutoIt3Wrapper_Change2CUI=y #AutoIt3Wrapper_Res_HiDpi=y #AutoIt3Wrapper_AU3Check_Parameters=-w 3 -w 4 -w 5 #AutoIt3Wrapper_Run_Au3Stripper=y #Au3Stripper_Parameters=/sf /sv /rm #EndRegion ;**** Directives created by AutoIt3Wrapper_GUI **** #include <File.au3> ;~ _convertGUI("") If $CmdLine[0] <> 0 Then _convertGUI($CmdLine[1]) Func _convertGUI($sFilePath) If $sFilePath <> "" Then Local $aArray = FileReadToArray($sFilePath) Else ;TEST DATA Local $aArray[6] = ['$H_Res_Language = GUICtrlCreateProgress(5, 120, 210 + 25, 480, 20, BitOR($GUI_SS_DEFAULT_COMBO, $CBS_SIMPLE)) ; $CBS_DROPDOWNLIST)', _ 'Local $h_Ok = GUICtrlCreateButton("Ok", 72, 224, 81, 33, 0)', _ 'GUICreate($Warning_TiTle, 700, 310, -1, -1, $WS_SIZEBOX + $WS_SYSMENU + $WS_MINIMIZEBOX)', _ 'GUICtrlCreateLabel("Output type: ", 30, 130, 65, 20) ;, $SS_RIGHT)', _ '$H_FieldNameEdit = GUICtrlCreateEdit($INP_FieldNameEdit, 100,260+25, 500, 150 - 25) ;comment', 'Local $H_CANCEL = GUICtrlCreateGraphic("Cancel", 224, 224, 97, 33, 0)'] EndIf Local $hTimer = TimerInit(), $iGUIElementCount = 0, $sResult = "", $sFileName = "", $sDrive = "", $sDir = "", $sExtension = "" If @Compiled Then _PathSplit($sFilePath, $sDrive, $sDir, $sFileName, $sExtension) $sFileName = StringRegExpReplace($sFilePath, "^.*\\", "") EndIf For $i = 0 To (UBound($aArray) - 1) If StringRegExp($aArray[$i], "GUICtrlCreate|GUICreate") Then $sResult = _splitComma($aArray[$i]) If Not @error Then $aArray[$i] = $sResult $iGUIElementCount += 1 EndIf Next ConsoleWrite("t = " & TimerDiff($hTimer) & " GUI elements = " & $iGUIElementCount & " lines = " & (UBound($aArray) - 1) & @CRLF) If $sFileName <> "" Then Local $hFile = FileOpen("edited." & $sFileName, 2) _FileWriteFromArray("edited." & $sFileName, $aArray) FileClose($hFile) EndIf Exit EndFunc ;==>_convertGUI Func _splitComma($sString) Local $sSplitResult = "", $sTrimmedR = "", $sTrimmedL = "" Local $aSplit = StringSplit($sString, ',') If Not @error Then $sTrimmedR = "" $sTrimmedL = "" For $j = 1 To $aSplit[0] If StringRegExp($aSplit[1], "(?:.GUICtrlCreateGraphic|GUICtrlCreateProgress|GUICtrlCreateSlider|GUICtrlCreateTab|GUICtrlCreateTreeView)") Then If $j = 1 Then While StringLeft($aSplit[$j], 1) <> '(' $sTrimmedL &= StringLeft($aSplit[$j], 1) $aSplit[$j] = StringTrimLeft($aSplit[$j], 1) WEnd $aSplit[$j] = StringTrimLeft($aSplit[$j], 1) EndIf EndIf If $j = $aSplit[0] Then While StringRight($aSplit[$j], 1) <> ')' $sTrimmedR &= StringRight($aSplit[$j], 1) $aSplit[$j] = StringTrimRight($aSplit[$j], 1) WEnd $aSplit[$j] = StringTrimRight($aSplit[$j], 1) EndIf If StringRegExp($aSplit[$j], "[0-9]") And $aSplit[$j] <> -1 And $aSplit[$j] <> 0 And $aSplit[$j] <> 1 And Not StringInStr($aSplit[$j], ')') Then If StringRegExp($aSplit[$j], "\-|\+") Then ;put parenthesis around + or - $aSplit[$j] = '(' & $aSplit[$j] & ")*$g_DPI" Else $aSplit[$j] = $aSplit[$j] & "*$g_DPI" EndIf EndIf If $j < $aSplit[0] Then $sSplitResult &= $aSplit[$j] & ',' ElseIf $j = $aSplit[0] Then $sSplitResult &= $aSplit[$j] & ')' Else $sSplitResult &= $aSplit[$j] EndIf Next If $sTrimmedR <> "" Then $sSplitResult &= StringReverse($sTrimmedR) If $sTrimmedL <> "" Then $sSplitResult = $sTrimmedL & '(' & $sSplitResult Else SetError(1) Return EndIf ConsoleWrite($sSplitResult & @CRLF) Return $sSplitResult EndFunc ;==>_splitComma
      And now it looks good: 
      but it doesn't work on everything, for example the "GUICtrlCreateLabel("Output type: ", 30, 130, 65, 20) ;, $SS_RIGHT)" (from the autoit3wrapper gui)
      because the comment contains a parenthesis and it would break completely if there were variables as parameters..
      Is there some kind of parser around that I could use instead or maybe someone who has already done something like this?
    • By TXTechie
      Hello Everyone,
      I've developed my own GUI using AutoIt and I'm allowing users to minimize the GUI, but I also want to include some kind of timer so that it will automatically restore the GUI after something like 30 minutes or an hour. However, I also want them to be able to manually restore the GUI by clicking the application's icon in the taskbar.
      I've searched through the forums, but I'm not sure how to get started.
      Any ideas or functions to research are appreciated!
      Regards,
      TX Techie
    • By Cengokill
      Hi everyone,
      I have created a ListView that is in a tab, and I want to display an image in that tab, with the ListView on top.
      However, the image still appears on top of my ListView.
      If I remove the tabs everything works. 
      I looked at the autoit documentation and the <GuiListView.au3> documentation , I can't figure out how to display a background image, and put on top a ListView, inside a tab. 😥
      Here is the code:
      Opt("GUIOnEventMode", 1) $Form1 = GUICreate($Titre, 700, 627, $Form1Width, $Form1Height); main window $tabulation = GUICtrlCreateTab(148,0,700,580); creating tabs $tab1=GUICtrlCreateTabItem("Tab 1"); first tab GUICtrlSetState(-1, $GUI_SHOW); this tab is selected by default $Pic1 = GUICtrlCreatePic("image.jpg", 0, 30, 700, 627) GUICtrlSetState(-1, $GUI_DISABLE). $idListview = GUICtrlCreateListView("list 1|list 2|list 3", 200, 50, 390, 200) GUISetState(@SW_SHOW) While 1     Sleep(100) WEnd Thank you in advance.

    • By Rskm
      Hi, recently i created a GUI for some calculations in AutoIT.  The GUI has 2 tabs and on the first tab, it has few inputboxes where i use to click with mouse and start entering the inputs. i recently made some changes in the position of these textboxes. I made this by changing the autoit code file instead of making changes in KODA. Now i cannot click inside these textboxes with mouse. However, i can use TAB key to cycle through/enter input in these input boxes. what could have made the inputboxes not responding to mouseclicks. thanks
×
×
  • Create New...