Jump to content
Sign in to follow this  
Ascend4nt

_GUIBox - Rubberband selection boxes using GUIs

Recommended Posts

Ascend4nt

_GUIBox

Rubberband selection boxes using GUIs

Posted Image

Create Rectangles using GUI boxes. Great for Rubber-band selection (as an alternative to DrawFocusRect), or just putting box outlines on the screen period!

Example code included (including rubber-band style box-selection simulation).

#include <_GUIBox.au3>
; ===============================================================================================================================
; <TestGUIBox.au3>
;
;   Tests for _GUIBox UDF.
;
; Author: Ascend4nt
; ===============================================================================================================================

; ===================================================================================================================
; GLOBAL VARIABLES
; ===================================================================================================================

Global $bEscPressed=False,$bHomeKeyPressed=False,$bEndKeyPressed=False,$aHomeLoc[2]=[-1,-1]

; ===================================================================================================================
; HOTKEY FUNCTIONS
; ===================================================================================================================

Func _EscHotKeyPressed()
    $bEscPressed=True
EndFunc

Func _HomeKeyPressed()
    If Not $bHomeKeyPressed Then
        $bHomeKeyPressed=True
        $aHomeLoc=MouseGetPos()
    EndIf
EndFunc

Func _EndKeyPressed()
    If $bHomeKeyPressed Then $bEndKeyPressed=True
EndFunc

; ===================================================================================================================
; MAIN START
; ===================================================================================================================

Test1()
Test2()

; Test 1
Func Test1()
    MsgBox(0,"Rubber-Band Box Example","After Clicking OK, the Rubber-Band GUI-Box Example will start."&@CRLF& _
        "Press [Home] to set the initial Box start, and then [End] to set the end location of the box."&@CRLF& _
        "You may stop the routine at any time by pressing [Escape].")

    HotKeySet("{ESC}","_EscHotKeyPressed")

    Dim $aCurMousePos,$aRubberBandGBox

    $aRubberBandGBox=_GBoxCreate("",3,0xFF0000)
    HotKeySet("{HOME}","_HomeKeyPressed")
    HotKeySet("{END}","_EndKeyPressed")

    While Not $bEscPressed And Not $bEndKeyPressed
        If $bHomeKeyPressed Then
            $aCurMousePos=MouseGetPos()
            _GBoxShowAt($aRubberBandGBox,$aHomeLoc[0],$aHomeLoc[1],$aCurMousePos[0],$aCurMousePos[1])
        EndIf
        Sleep(5)
    WEnd
    If $bHomeKeyPressed And IsArray($aCurMousePos) Then
        MsgBox(0,"Rubber-band box example complete","Last coordinates of the Rubber-band box: "& _
            "X1:"&$aHomeLoc[0]&" Y1:"&$aHomeLoc[1]&" X2:"&$aCurMousePos[0]&" Y2:"&$aCurMousePos[1])
    EndIf
    _GBoxDestroy($aRubberBandGBox)
EndFunc

; Test 2
Func Test2()
    Local $aBugaBox,$aBoxRed,$aBoxGreen,$aBoxBlue,$aBoxFADED

    $aBugaBox=_GBoxCreate()
    $aBoxRed=_GBoxCreate("",5,0XFF0000)
    $aBoxGreen=_GBoxCreate("",1,0xFF00)
    $aBoxBlue=_GBoxCreate("",1,0xFF)
    $aBoxFADED=_GBoxCreate("",1,0x0FADED)

    MsgBox(0,"Test 2 - Multiple GUI Boxes","Ready to show boxes - Click OK")

    _GBoxShowAt($aBugaBox,100,100,800,800)
    _GBoxShowAt($aBoxRed,300,400,700,700)
    _GBoxShowAt($aBoxGreen,400,800,402,802)
    _GBoxShowAt($aBoxBlue,801,200,900,900)
    _GBoxShowAt($aBoxFADED,410,410,790,790)

    MsgBox(0,"Now to Hide them","Click OK to Hide the boxes now")

    _GBoxHide($aBugaBox)
    _GBoxHide($aBoxRed)
    _GBoxHide($aBoxGreen)
    _GBoxHide($aBoxBlue)
    _GBoxHide($aBoxFADED)

    MsgBox(0,"Now to Redisplay Them","Click OK to Re-display the boxes, though one will have a new color, transparency, and thickness")

    _GBoxSetDisplayProps($aBugaBox,3,0x0899CC,255)  ; Changing the thickness, color, and transparency (to non-transparent)
    ; Since the box was invisible, we need to force it to recognize a resize (last parameter=True) as we altered the thickness
    ;   If we had instead put _GboxShow($aBugaBox) prior to _GBoxSetDisplayProps(), we would not need to force a resize
    _GBoxShow($aBugaBox,False,True)
    _GBoxShow($aBoxRed)
    _GBoxShow($aBoxGreen)
    _GBoxShow($aBoxBlue)
    _GBoxShow($aBoxFADED)

    MsgBox(0,"That's all folks!","Now click OK to delete")

    _GBoxDestroy($aBugaBox)
    _GBoxDestroy($aBoxRed)
    _GBoxDestroy($aBoxGreen)
    _GBoxDestroy($aBoxBlue)
    _GBoxDestroy($aBoxFADED)
EndFunc

Download the ZIP from my site

Ascend4nt's AutoIT Code License agreement:

While I provide this source code freely, if you do use the code in your projects, all I ask is that:

  • If you provide source, keep the header as I have put it, OR, if you expand it, then at least acknowledge me as the original author, and any other authors I credit
  • If the program is released, acknowledge me in your credits (it doesn't have to state which functions came from me, though again if the source is provided - see #1)
  • The source on it's own (as opposed to part of a project) can not be posted unless a link to the page(s) where the code were retrieved from is provided and a message stating that the latest updates will be available on the page(s) linked to.
  • Pieces of the code can however be discussed on the threads where Ascend4nt has posted the code without worrying about further linking.
*edit: clarified with the word 'outlines' so as not to confuse people. (creating resizable solid boxes is a much simpler task not even needing a UDF - I just posted code to do exactly this -> ) Edited by Ascend4nt

Share this post


Link to post
Share on other sites
Bot
Such a great script. However, I see in the source file that $iGBoxColor = background color but in fact, it's the border color of the box not the background one. So can you add an option to set the background color of the box and its transparency as well? Thanks Edited by Bot

Share this post


Link to post
Share on other sites
Ascend4nt

Such a great script. However, I see in the source file that $iGBoxColor = background color but in fact, it's the border color of the box not the background one. So can you add an option to set the background color of the box and its transparency as well? Thanks

Are you kidding? What do you suppose this line does?:

GUISetBkColor($iGBoxColor,$aBoxRet[$i])

The GUI's are created *without* borders, so I don't know where you get the idea that there even is one.

*edit: Bot, I think you misunderstood - if you are looking to create full boxes (not outlines like my code creates), then you've got a much simpler task. I clarified the wording in my first post, hopefully that should make it more clear. The 'outline' created by my code is actually 4 separate GUI's.

Edited by Ascend4nt

Share this post


Link to post
Share on other sites
Bot

Are you kidding? What do you suppose this line does?:

GUISetBkColor($iGBoxColor,$aBoxRet[$i])

The GUI's are created *without* borders, so I don't know where you get the idea that there even is one.

*edit: Bot, I think you misunderstood - if you are looking to create full boxes (not outlines like my code creates), then you've got a much simpler task. I clarified the wording in my first post, hopefully that should make it more clear. The 'outline' created by my code is actually 4 separate GUI's.

OK I see. Then I will create a full box. Thanks for your answer :mellow:

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  

  • Similar Content

    • therks
      By therks
      So I'm needing a (better) way to get the selection in an edit control, while knowing which end of the selection is active vs anchor (ie, if you're holding shift while moving with the arrow keys, which end of the selection is moving and which is not). Since _GUICtrlEdit_GetSel() only returns the start and end positions, in the order of smallest to largest, if you were to pass that back to the _GUICtrlEdit_SetSel(), the user's selection could end up "backwards".
      My solution has been this function:
      Func _GUICtrlEdit_GetSelByAnchor($hWnd) ; Get selection range with anchor in first index If Not IsHWnd($hWnd) Then $hWnd = GUICtrlGetHandle($hWnd) Local $aActive, $aSelection = _GUICtrlEdit_GetSel($hWnd) ; Get base selection If $aSelection[0] <> $aSelection[1] Then ; Only proceed if actual selection range _GUICtrlEdit_SetSel($hWnd, -1, 0) ; Deselect, leaving only the active point $aActive = _GUICtrlEdit_GetSel($hWnd) ; Record the active point If $aActive[0] = $aSelection[0] Then ; If the active point is equal to the original first index ; Swap the original selection points (putting the anchor in [0] and active in [1]) $aSelection[0] = $aSelection[1] $aSelection[1] = $aActive[0] EndIf _GUICtrlEdit_SetSel($hWnd, $aSelection[0], $aSelection[1]) ; Reset selection to the original points EndIf Return $aSelection EndFunc The problem with this, as you may have already guessed from the two SetSel calls, is that calling it in a tight loop causes a lot of flickering. Is there a better, more reliable way to do what I'm looking for?
    • Katie_Deely
      By Katie_Deely
      Hey
       
      I have a GUI with an edit-field and a button.
      First I write some text into the edit-field and select a part of it. After that I press the button, and the selection is edited.
      How would I do that, though? When the text is selected and I press the button, it's unselected before the button actually raises an event. 
    • Joep86
      By Joep86
      Hi, 
      I just started recently with AutoIT and I am trying to make two dropdownlists where the selectable values of the second dropdownlist will be depending on what is selected on the first one.
      For example: 
      Dropdown 1                 Dropdown 2                   
      xxx                =>             01-15    ("01" , "02" ,"03" , ...)                    
      yyy                =>             a - f       ("a" , "b" ,"c" ,"d" ,"e" ,"f" ) 
      zzz                =>             "new", "old", "spare"
       
      I started with this code that I've found in this Forum:
      #include <GUIConstantsEx.au3>
      ; Here is the array
      Global $aArray[6] = ["SORT", "PCM", "UNIF", "KKE", "GMS", "CDY"]
      ; And here we get the elements into a list
      $sList = ""
      For $i = 0 To UBound($aArray) - 1
          $sList &= "|" & $aArray[$i]
      Next
      ; Create a GUI
      #include <GUIConstantsEx.au3>
      $hGUI = GUICreate("DropDown", 500, 500)
      ; Create the combo
      $hCombo = GUICtrlCreateCombo("", 10, 10, 200, 20)
      ; And fill it
      GUICtrlSetData($hCombo, $sList)
      GUISetState()
      While 1
          Switch GUIGetMsg()
              Case $GUI_EVENT_CLOSE
                  Exit
          EndSwitch
       WEnd
       
       
      Any idea how to start on this one...
      thanks upfront
       
       
       
    • UEZ
      By UEZ
      I'm stuck on how to use for range selection .Cells function.
      Instead of
      _Excel_RangeSort($oWorkbook, Default, Default, "AD:AD", Default, Default, $xlYes, False, Default, "AE:AE", Default, "L:L", Default) and
      $aResult = _Excel_RangeRead($oWorkbook, 1, "S2:AB" & $iRows) which works properly I want to use Cells to select the range.
       
      Why? Because the Excel sheet was modified and an additional row was inserted. I want to create the script more dynamically by selection it with Cells because I can search for the column headers.
      Any idea?
       
      Thanks.
    • Xandy
      By Xandy
      Hi I'm struggling to clear the display text of of a GUI control combo selection string.
      I would like to clear the selection like it is clear after it is populated, but not remove any items from the list.

      Here is a small example.

      #include <GuiComboBox.au3> #include <ComboConstants.au3> #include <GUIConstantsEx.au3> ; Create GUI $hgui= guicreate("Clear ComboBox Edit Text", 320, 200) $control_combo= guictrlcreatecombo("", 10, 10, 250, 20, $CBS_DROPDOWNLIST) $control_clear_button= guictrlcreatebutton("Reset Blank Combo Selection String", 10, 40, 200, 20) guisetstate() guictrlsetdata($control_combo, "a|b|c"); Populate Combo while 1 switch guigetmsg() case $control_clear_button guictrlsetdata($control_combo, ""); This clears the entire list frustrating me case $gui_event_close exitloop endswitch;guigetmsg() wend;main loopDoes anyone one know how I can reset the selection to "", clear, empty set?I've tried SetEditText but doesn't work CBS_DROPDOWNLIST.

      SOLVED:
      Sorry I thought I had tried this: _GUICtrlComboBox_SetCurSel($control_combo, -1) is the solution.
×

Important Information

We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.