Jump to content

GUI: mouse to focus on a control?


Recommended Posts

Update: Download the latest version here.

As my first stab at GUI scripting, I'm trying to write a simple graphical interface for Grep for Windows. I have a basic GUI, but I'm stuck on one point and nothing I've tried so far works. The sticking point is that while the Tab key works to move focus from one input control to the next, clicking the mouse on any but the first input does nothing. This seems like a basic feature of GUI functionality that should work out of the box (like Tab), but clearly I'm missing something. I tried (among many other things) Melba23's technique in the post below, but this doesn't do what I'm after -- getting the left click to set the insertion point for user input. Would greatly appreciate a pointer or two. 😉

Here's my code so far:

; Grep for Windows -- GUI [CLD]

#include <AutoItConstants.au3>
#include <GUIConstantsEx.au3>
#include <StaticConstants.au3>
#include <WinAPI.au3>
#include <WindowsConstants.au3>

Opt("WinTitleMatchMode", -2)

#cs
FileInstall("X:\nix\search1.ico", @TempDir & "\search1.ico")
FileInstall("X:\nix\grep.exe", @TempDir & "\grep.exe")
FileInstall("X:\nix\sed.exe", @TempDir & "\sed.exe")
FileInstall("X:\nix\libiconv2.dll", @TempDir & "\libiconv2.dll")
FileInstall("X:\nix\libintl3.dll", @TempDir & "\libintl3.dll")
FileInstall("X:\nix\pcre3.dll", @TempDir & "\pcre3.dll")
FileInstall("X:\nix\regex2.dll", @TempDir & "\regex2.dll")
#ce

; $sDefFs = @ScriptDir & "\.txt"
$sOut = ""
$iX = 20
$iY = 20
$hgGGrep = GUICreate("Grep for Windows: Simple TeXT search", 600, 600)
GUISetState(@SW_SHOW, $hgGGrep)

; Obtain value of control: GUICtrlRead()
; left, top, width,   height
; $iX,  $iY, $iX + n, $iY + m

; $hgIco = GUICtrlCreateIcon(@ScriptDir & "\search1.ico", $iX, $iY, 10)
$hgGL0 = GUICtrlCreateLabel("Enter a string or regular expression" & @CRLF & "(space between words means ""OR"")", $iX + 50, $iY, 250, 30)

$hgSch = GUICtrlCreateInput("", $iX + 50, $iY + 40, 325, 20, $GUI_SS_DEFAULT_INPUT, -1)

$hgXyZ = GUICtrlCreateCheckbox("cAsE-sEnSiTiVe", $iX + 50, $iY + 65, -1, -1)

$hgExe = GUICtrlCreateButton("Search", 400, $iY + 40, -1, -1)

$hgFL1 = GUICtrlCreateLabel("Filespec",      $iX +  50, $iY + 100, 250, 20)
$hgFs1 = GUICtrlCreateInput("d:\path\*.txt", $iX + 110, $iY + 100, 250, 20, $GUI_SS_DEFAULT_INPUT, -1)
$hgFL2 = GUICtrlCreateLabel("Filespec",      $iX +  50, $iY + 120, 250, 20)
$hgFs2 = GUICtrlCreateInput("",              $iX + 110, $iY + 120, 250, 20, $GUI_SS_DEFAULT_INPUT, -1)
$hgFL3 = GUICtrlCreateLabel("Filespec",      $iX +  50, $iY + 140, 250, 20)
$hgFs3 = GUICtrlCreateInput("",              $iX + 110, $iY + 140, 250, 20, $GUI_SS_DEFAULT_INPUT,-1)

$hgOut = GUICtrlCreateEdit($sOut, 25, 190, 550, 400, $ES_LEFT, -1)

GUICtrlSetState($hgSch, $GUI_FOCUS)

While 1
    $nMsg = GUIGetMsg() 

    Switch $nMsg
        Case $GUI_EVENT_CLOSE
            Exit
    EndSwitch

WEnd

;

#cs
_WinAPI_SetFocus(ControlGetHandle("Grep for Windows", "", $hgSch))
_WinAPI_SetFocus(ControlGetHandle("Grep for Windows", "", $hgFs1))
_WinAPI_SetFocus(ControlGetHandle("Grep for Windows", "", $hgFs2))
_WinAPI_SetFocus(ControlGetHandle("Grep for Windows", "", $hgFs3))
#ce

Thanks in advance.

Edited by CarlD
Added download link
Link to comment
Share on other sites

Hi CarlD

Your 3 Label controls got a too large width that overlaps the 3 Input controls on the same line.
Just reduce each Label control width, for example from 250 to 50, then you can select the 3 Input controls with your mouse

$hgFL1 = GUICtrlCreateLabel("Filespec",      $iX +  50, $iY + 100, 50, 20)
$hgFs1 = GUICtrlCreateInput("d:\path\*.txt", $iX + 110, $iY + 100, 250, 20, $GUI_SS_DEFAULT_INPUT, -1)

$hgFL2 = GUICtrlCreateLabel("Filespec",      $iX +  50, $iY + 120, 50, 20)
$hgFs2 = GUICtrlCreateInput("",              $iX + 110, $iY + 120, 250, 20, $GUI_SS_DEFAULT_INPUT, -1)

$hgFL3 = GUICtrlCreateLabel("Filespec",      $iX +  50, $iY + 140, 50, 20)
$hgFs3 = GUICtrlCreateInput("",              $iX + 110, $iY + 140, 250, 20, $GUI_SS_DEFAULT_INPUT,-1)

$hgOut = GUICtrlCreateEdit($sOut, 25, 190, 550, 400, $ES_LEFT, -1)

Also, concerning the $GUI_SS_DEFAULT_* styles, Melba23 explained something interesting here :
https://www.autoitscript.com/forum/topic/122105-gui_ss_default_input/?do=findComment&comment=847583

It shows that you don't need to use the $GUI_SS_DEFAULT_INPUT variable in your Input control style, because it's the default and you're not adding any new style to it.

On the contrary, as you're adding a new style to your Edit control, then you should keep its default $GUI_SS_DEFAULT_EDIT and add to it your new style, using the BitOr() function.

Also, -1 is not required as extended style as it's the default, which brings us here :

$hgFL1 = GUICtrlCreateLabel("Filespec",      $iX +  50, $iY + 100, 50, 20)
$hgFs1 = GUICtrlCreateInput("d:\path\*.txt", $iX + 110, $iY + 100, 250, 20)

$hgFL2 = GUICtrlCreateLabel("Filespec",      $iX +  50, $iY + 120, 50, 20)
$hgFs2 = GUICtrlCreateInput("",              $iX + 110, $iY + 120, 250, 20)

$hgFL3 = GUICtrlCreateLabel("Filespec",      $iX +  50, $iY + 140, 50, 20)
$hgFs3 = GUICtrlCreateInput("",              $iX + 110, $iY + 140, 250, 20)

$hgOut = GUICtrlCreateEdit($sOut, 25, 190, 550, 400, BitOR($GUI_SS_DEFAULT_EDIT, $ES_LEFT))

Good luck :)

Edited by pixelsearch
Link to comment
Share on other sites

4 hours ago, pixelsearch said:

Your 3 Label controls got a too large width that overlaps the 3 Input controls on the same line.

Just reduce each Label control width, for example from 250 to 50, then you can select the 3 Input controls with your mouse

That's it! Problem solved. Thank you, @pixelsearch!

4 hours ago, pixelsearch said:

Also, concerning the $GUI_SS_DEFAULT_* styles, Melba23 explained something interesting here :
https://www.autoitscript.com/forum/topic/122105-gui_ss_default_input/?do=findComment&comment=847583

It shows that you don't need to use the $GUI_SS_DEFAULT_INPUT variable in your Input control style, because it's the default and you're not adding any new style to it.

On the contrary, as you're adding a new style to your Edit control, then you should keep its default $GUI_SS_DEFAULT_EDIT and add to it your new style, using the BitOr() function.

Also, -1 is not required as extended style as it's the default, which brings us here :

[...]

 

Noted, thank you. Some of these parameters are just placeholders, as I'm still learning my way. I just started this yesterday!

Your help is much appreciated! 😀

Link to comment
Share on other sites

Well, I've got pretty far with this in the last week, I think. Grep for Windows is lightning fast for text search, and my script wraps a simple GUI around it. You can read search results in the Edit window, or export them to a text editor or to Word (rich text). The EXEcutable is attached (GGREP.ZIP). The source code is accessible via the Settings button. Thanks again to @pixelsearch for getting me over the initial hump. 🤓

You can download the latest version here.

Edited by CarlD
Added download link
Link to comment
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
 Share

×
×
  • Create New...