Jump to content
Sign in to follow this  
momar33

Wandering Button (When Gui set to Fullscreen and Button is Redrawn)

Recommended Posts

momar33

I am seeing a buttons position change when the following happens.

1. GUI created at 800 x 600

2. GUI info is stored using WinGetPos

3. GUI changed to full-screen using WinMove

4. Button info is stored using ControlGetPos

5. Button is deleted

6. Button is re-created using the stored data from item 4.

7. GUI is restored to the info gathered in item 2.

The button starts with this info:

Button Left:   408
Button Top:    84
Button Width:  80
Button Height: 24
 
and after the events above the button has this info:
Button Left:   409
Button Top:    83
Button Width:  80
Button Height: 24
 
Here is some code that can reproduce the issue:
(press space, f, space, f, then look in the console)
#Region Includes

#include <WindowsConstants.au3>
#include <StaticConstants.au3>
#include <GUIConstantsEx.au3>
#include <Array.au3>

#EndRegion Includes

Const $HT_KEY_FULLSCREEN = "f"
Const $HT_KEY_SPACE = "{SPACE}"

Global $btnAddRebuy[21]
Global $btnRemovePlayer[21]

Global $fFullscreen = False

Global $aGuiInfo
Global $aGuiInfo2

Global $guiWidth  = 800
Global $guiHeight = 600


#Region Dimensions for Settings Screen

; Player
Global $lblPlayerTop    = 60

Global $playerLabelSpace = 24


; Add Rebuy Button
Global $btnRebuyLeft    = 320
Global $btnRebuyWidth   = 80
Global $btnRebuyHeight  = 24

; Remove Player
Global $btnRemoveLeft   = 408
Global $btnRemoveWidth  = 80
Global $btnRemoveHeight = 24

#EndRegion Dimensions for Settings Screen





$hMain = GUICreate("Timer", $guiWidth, $guiHeight, -1, -1, BitOR($WS_MAXIMIZEBOX,$WS_MINIMIZEBOX,$WS_SIZEBOX,$WS_THICKFRAME,$WS_SYSMENU,$WS_CAPTION,$WS_OVERLAPPEDWINDOW,$WS_TILEDWINDOW,$WS_POPUP,$WS_POPUPWINDOW,$WS_GROUP,$WS_TABSTOP,$WS_BORDER,$WS_CLIPSIBLINGS))


For $i = 1 To 5 Step 1  
    $btnAddRebuy[$i] = GUICtrlCreateButton("Button", $btnRebuyLeft, $lblPlayerTop + ($playerLabelSpace * $i), $btnRebuyWidth, $btnRebuyHeight)
    GUICtrlSetResizing($btnAddRebuy[$i], $GUI_DOCKAUTO)
    GuiCtrlSetState($btnAddRebuy[$i], $GUI_DISABLE)
    
    $btnRemovePlayer[$i] = GUICtrlCreateButton("Button", $btnRemoveLeft, $lblPlayerTop + ($playerLabelSpace * $i), $btnRemoveWidth, $btnRemoveHeight)
    ;GUICtrlSetResizing($btnRemovePlayer[$i], $GUI_DOCKAUTO)
 Next
 
GUISetState(@SW_SHOW)

HotKeySet($HT_KEY_FULLSCREEN, "Fullscreen")
HotKeySet($HT_KEY_SPACE, "Redraw")
 
While 1
   $msg = GUIGetMsg()
   If $msg = $GUI_EVENT_CLOSE Then
      ExitLoop
   EndIf
WEnd

Func Fullscreen()
    If WinActive($hMain) Then
        If $fFullscreen Then
            ;GUISetStyle(BitOR($WS_MAXIMIZEBOX,$WS_MINIMIZEBOX,$WS_SIZEBOX,$WS_THICKFRAME,$WS_SYSMENU,$WS_CAPTION,$WS_OVERLAPPEDWINDOW,$WS_TILEDWINDOW,$WS_POPUP,$WS_POPUPWINDOW,$WS_GROUP,$WS_TABSTOP,$WS_BORDER,$WS_CLIPSIBLINGS), Default, $hMain)
            $aGuiInfo2 = WinGetPos($hMain)
            ConsoleWrite("******* Fullscreen *******" & @LF)
            ConsoleWrite("Win Left:   " & $aGuiInfo2[0] & @LF)
            ConsoleWrite("Win Top:    " & $aGuiInfo2[1] & @LF)
            ConsoleWrite("Win Width:  " & $aGuiInfo2[2] & @LF)
            ConsoleWrite("Win Height: " & $aGuiInfo2[3] & @LF & @LF)
            ;WinMove($hMain, Default, $aGuiInfo[0], $aGuiInfo[1], $aGuiInfo[2], $aGuiInfo[3])
            WinMove($hMain, Default, 238, 179, 816, 638)
            $fFullscreen = False
            
            $aCtrlInfo = ControlGetPos($hMain, "", $btnRemovePlayer[1])
            ConsoleWrite("******* Button Info after Restored *******" & @LF)
            ConsoleWrite("Button Left:   " & $aCtrlInfo[0] & @LF)
            ConsoleWrite("Button Top:    " & $aCtrlInfo[1] & @LF)
            ConsoleWrite("Button Width:  " & $aCtrlInfo[2] & @LF)
            ConsoleWrite("Button Height: " & $aCtrlInfo[3] & @LF & @LF)
        Else
            ;GUISetStyle($WS_POPUP, Default, $hMain)
            $aGuiInfo = WinGetPos($hMain)
            ConsoleWrite("******* Start Size *******" & @LF)
            ConsoleWrite("Win Left:   " & $aGuiInfo[0] & @LF)
            ConsoleWrite("Win Top:    " & $aGuiInfo[1] & @LF)
            ConsoleWrite("Win Width:  " & $aGuiInfo[2] & @LF)
            ConsoleWrite("Win Height: " & $aGuiInfo[3] & @LF & @LF)
            WinMove($hMain, Default, 0, 0, @DesktopWidth, @DesktopHeight)
            $fFullscreen = True
            
            $aCtrlInfo = ControlGetPos($hMain, "", $btnRemovePlayer[1])
            ConsoleWrite("******* Button Info after Fullscreened *******" & @LF)
            ConsoleWrite("Button Left:   " & $aCtrlInfo[0] & @LF)
            ConsoleWrite("Button Top:    " & $aCtrlInfo[1] & @LF)
            ConsoleWrite("Button Width:  " & $aCtrlInfo[2] & @LF)
            ConsoleWrite("Button Height: " & $aCtrlInfo[3] & @LF & @LF)
        EndIf
    Else
        HotKeySet($HT_KEY_FULLSCREEN)
        Send($HT_KEY_FULLSCREEN)
        HotKeySet($HT_KEY_FULLSCREEN, "Fullscreen")
    EndIf
 EndFunc


Func Redraw()
      Local $aCtrlInfo
      $aCtrlInfo = ControlGetPos($hMain, "", $btnRemovePlayer[1])
      ConsoleWrite("******* Button Info before Redraw *******" & @LF)
      ConsoleWrite("Button Left:   " & $aCtrlInfo[0] & @LF)
      ConsoleWrite("Button Top:    " & $aCtrlInfo[1] & @LF)
      ConsoleWrite("Button Width:  " & $aCtrlInfo[2] & @LF)
      ConsoleWrite("Button Height: " & $aCtrlInfo[3] & @LF & @LF)
      GuiCtrlDelete($btnRemovePlayer[1])

      $btnRemovePlayer[1] = GUICtrlCreateButton("Button", $aCtrlInfo[0], $aCtrlInfo[1], $aCtrlInfo[2], $aCtrlInfo[3])
      ;GUICtrlSetResizing(-1, $GUI_DOCKAUTO)
      
      $aCtrlInfo = ControlGetPos($hMain, "", $btnRemovePlayer[1])
      ConsoleWrite("******* Button Info after Redraw *******" & @LF)
      ConsoleWrite("Button Left:   " & $aCtrlInfo[0] & @LF)
      ConsoleWrite("Button Top:    " & $aCtrlInfo[1] & @LF)
      ConsoleWrite("Button Width:  " & $aCtrlInfo[2] & @LF)
      ConsoleWrite("Button Height: " & $aCtrlInfo[3] & @LF & @LF)

EndFunc
Is there a way to fix this, or is the issue built in to how windows get resized?
 

Share this post


Link to post
Share on other sites
Melba23

momar33,

Why not use the correct GUICtrlResizing mode (you can set it globally using Opt) and then just hide/show the button rather then deleting/recreating it? That would save a lot of code and keep it in the correct place. ;)

M23


Public_Domain.png.2d871819fcb9957cf44f4514551a2935.png Any of my own code posted anywhere on the forum is available for use by others without any restriction of any kind._______Open Open spoiler to see my UDFs:

Spoiler

ArrayMultiColSort ---- Sort arrays on multiple columns
ChooseFileFolder ---- Single and multiple selections from specified path treeview listing
Date_Time_Convert -- Easily convert date/time formats, including the language used
ExtMsgBox --------- A highly customisable replacement for MsgBox
GUIExtender -------- Extend and retract multiple sections within a GUI
GUIFrame ---------- Subdivide GUIs into many adjustable frames
GUIListViewEx ------- Insert, delete, move, drag, sort, edit and colour ListView items
GUITreeViewEx ------ Check/clear parent and child checkboxes in a TreeView
Marquee ----------- Scrolling tickertape GUIs
NoFocusLines ------- Remove the dotted focus lines from buttons, sliders, radios and checkboxes
Notify ------------- Small notifications on the edge of the display
Scrollbars ----------Automatically sized scrollbars with a single command
StringSize ---------- Automatically size controls to fit text
Toast -------------- Small GUIs which pop out of the notification area

 

Share this post


Link to post
Share on other sites
momar33

I am using $GUI_DOCKAUTO in my actual program, but removed it for simplification.

With $GUI_DOCKAUTO set, this still happens just slightly differently.

The code posted is the result of weeding out unnecessary code.

Hiding/Showing will not work for me. I change the button color which makes the button "Windows Classic Style", I redraw the button to get the 3d button back.

What I am doing is using a colored button to show a more prominent tab focus.

(Down button changes the focus (and background color) of the next button down, then redraws the button that previously had focus).

Share this post


Link to post
Share on other sites
Melba23

momar33,

Because of a bug deep in the core code (and therefore very unlikely ever to be fixed) colouring buttons is not a good idea in AutoIt - they trap the ENTER key for a start and lose styles for another. :(

Whenever I need to highlight a button I place a slightly larger label underneath it (and disable it to prevent Autoit getting confused and actioning neither) and then change the colour of that label when required. That way the button remains "standard" and perfectly useable. Here is a short example:

#include <GUIConstantsEx.au3>
#include <MsgBoxConstants.au3>

$hGUI = GUICreate("Test", 500, 500)

$cLabel_1 = GUICtrlCreateLabel("", 8, 8, 84, 34)
GUICtrlSetState($cLabel_1, $GUI_DISABLE)
$cButton_1 = GUICtrlCreateButton("One", 10, 10, 80, 30)

$cLabel_2 = GUICtrlCreateLabel("", 8, 48, 84, 34)
GUICtrlSetState($cLabel_2, $GUI_DISABLE)
GUICtrlSetBkColor($cLabel_2, 0xFF0000)
$cButton_2 = GUICtrlCreateButton("Two", 10, 50, 80, 30)

GUISetState()

While 1
    Switch GUIGetMsg()
        Case $GUI_EVENT_CLOSE
            Exit
        Case $cButton_1
            GUICtrlSetBkColor($cLabel_1, 0xFFFFFF)
            GUICtrlSetBkColor($cLabel_2, 0xFF0000)
        Case $cButton_2
            GUICtrlSetBkColor($cLabel_2, 0xFFFFFF)
            GUICtrlSetBkColor($cLabel_1, 0xFF0000)
    EndSwitch
WEnd
Any use? :)

M23


Public_Domain.png.2d871819fcb9957cf44f4514551a2935.png Any of my own code posted anywhere on the forum is available for use by others without any restriction of any kind._______Open Open spoiler to see my UDFs:

Spoiler

ArrayMultiColSort ---- Sort arrays on multiple columns
ChooseFileFolder ---- Single and multiple selections from specified path treeview listing
Date_Time_Convert -- Easily convert date/time formats, including the language used
ExtMsgBox --------- A highly customisable replacement for MsgBox
GUIExtender -------- Extend and retract multiple sections within a GUI
GUIFrame ---------- Subdivide GUIs into many adjustable frames
GUIListViewEx ------- Insert, delete, move, drag, sort, edit and colour ListView items
GUITreeViewEx ------ Check/clear parent and child checkboxes in a TreeView
Marquee ----------- Scrolling tickertape GUIs
NoFocusLines ------- Remove the dotted focus lines from buttons, sliders, radios and checkboxes
Notify ------------- Small notifications on the edge of the display
Scrollbars ----------Automatically sized scrollbars with a single command
StringSize ---------- Automatically size controls to fit text
Toast -------------- Small GUIs which pop out of the notification area

 

Share this post


Link to post
Share on other sites
momar33

M23,

I had actually thought about that method at one time, but for whatever reason decided against it.  (or it may have been a backup idea)

I will likely use that method if I can't figure out the issue in the OP.

Do you have any idea what is causing the issue in the OP?

It doesn't appear to be an issue with my code, but I was kinda hoping it was and I just missed it.

Thanks,

M33

Share this post


Link to post
Share on other sites
Melba23

momar33,

 

Do you have any idea what is causing the issue in the OP?

Not really. GUI resizing and storing control coordinates for redrawing is always fraught with difficulty - which is why I tend to go for the hide/show method and let AutoIt look after control position and size for me. :)

M23


Public_Domain.png.2d871819fcb9957cf44f4514551a2935.png Any of my own code posted anywhere on the forum is available for use by others without any restriction of any kind._______Open Open spoiler to see my UDFs:

Spoiler

ArrayMultiColSort ---- Sort arrays on multiple columns
ChooseFileFolder ---- Single and multiple selections from specified path treeview listing
Date_Time_Convert -- Easily convert date/time formats, including the language used
ExtMsgBox --------- A highly customisable replacement for MsgBox
GUIExtender -------- Extend and retract multiple sections within a GUI
GUIFrame ---------- Subdivide GUIs into many adjustable frames
GUIListViewEx ------- Insert, delete, move, drag, sort, edit and colour ListView items
GUITreeViewEx ------ Check/clear parent and child checkboxes in a TreeView
Marquee ----------- Scrolling tickertape GUIs
NoFocusLines ------- Remove the dotted focus lines from buttons, sliders, radios and checkboxes
Notify ------------- Small notifications on the edge of the display
Scrollbars ----------Automatically sized scrollbars with a single command
StringSize ---------- Automatically size controls to fit text
Toast -------------- Small GUIs which pop out of the notification area

 

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

    • Viszna
      By Viszna
      Hey
      Why does Windows 10 "AutoIt Window Info" give the wrong window position?
      WinMove() moves the window to a different point than parameters? -look script

      The test script moves the notepad.exe window to 0, 0, the real window coordinates are 8, 0
      Modified script add WinGetPos() and MouseMove() and MouseGetPos()
      #include <ScreenCapture.au3> Local $iPID = Run("notepad.exe", "") WinWait("[CLASS:Notepad]", "", 10); Wait 10 seconds for the Notepad window to appear. WinMove ("[CLASS:Notepad]", "", 0, 0, 600, 400) WinActivate("[CLASS:Notepad]") Send("WinMove ('[CLASS:Notepad]', "", 0, 0, 600, 400){ENTER}") Send("@DesktopWidth: " & @DesktopWidth & "{ENTER}") Send("@DesktopHeight: " & @DesktopHeight & "{ENTER}") Send("@DesktopDepth: " & @DesktopDepth & "{ENTER}") Send("@OSArch: " & @OSArch & "{ENTER}") Send("@OSBuild: " & @OSBuild & "{ENTER}") Send("@OSServicePack: " & @OSServicePack & "{ENTER}") Send("@OSType: " & @OSType & "{ENTER}") Send("@OSVersion: " & @OSVersion & "{ENTER}") Send(WinGetPos("[CLASS:Notepad]") & "{ENTER}") Send("X: " & WinGetPos("[CLASS:Notepad]")[0] & "{ENTER}") Send("Y: " & WinGetPos("[CLASS:Notepad]")[1] & "{ENTER}") Send("Width: " & WinGetPos("[CLASS:Notepad]")[2] & "{ENTER}") Send("Height: " & WinGetPos("[CLASS:Notepad]")[3] & "{ENTER}") MouseMove(0,400) Send("MouseMove(0,400){ENTER}") Send("MouseGetPos() X: " & MouseGetPos()[0] & "Y: " & MouseGetPos()[1]) Sleep(100) _ScreenCapture_Capture('C:\temp\screen.bmp',0,0,800,600) MsgBox(0,"Info","Save screen to C:\temp\screen.bmp" & @CRLF & "Click OK to view the bitmap") Run("explorer.exe C:\temp\screen.bmp") Is ALWAYS such a difference 8px (in every Windows 7, 8, Server)?
    • nooneclose
      By nooneclose
      Hello again, I am in phase two of my help bot. I cannot figure out how to properly code Autoit to click on a webpage button using the I.E UDF. I want to click on the button that I have attached as an image. This button does not have a name but it has an ID. Here is the HTML code for this button that I found using chromes developer inspector.
      HTML Code: 
      <img role="button" tabindex="-1" id="toolactions_INSERT-tbb_image" src="nav_icon_insertkey.gif" alt="New Work Order CTRL+ALT+I" draggable="false"> Here is the code that I have so far:
      ;******************************************************************************* ; Opens IE and fill out a New Workorder ;******************************************************************************* ; Start IE at the ** Tracking Application in ****** $oIE = _IECreate("https:I_am_Bound_by_my_company_to_not_reveal_this_webpage") ; Wait for a browser page load to complete _IELoadWait($oIE) Sleep(6000) ; Store the field names where the important data will be sent Local $nWorkOrderB = _IEGetObjById($oIE, "toolactions_INSERT-tbb_image") _IEAction($nWorkOrderB, "click")  I want my program to click on the button that looks like a piece of paper with a blue # 
      (For those wondering, I am allowed to send images just not the URL.) 
      As always any help would be appreciated. 

    • MJ36
      By MJ36

      How to click this button ? 
      I Try 
       
      func test () $oCorrectObj = "" $tags = $oIE.document.GetElementsByTagName("button") For $tag in $tags $class_value = $tag.GetAttribute("type") If string($class_value) = "buttont" Then $oCorrectObj = $tag MsgBox(0, "Level: ", "Level found :)") Else MsgBox(16, "Failed", "Not found.") ExitLoop EndIf Next If IsObj ( $oCorrectObj ) Then _IEAction ($oCorrectObj, "click") EndIF  
      and
       
      func klik () Local $oFound = "" Local $oBtns = _IETagNameGetCollection($oIE, "span") For $oBtn In $oBtns If String($oBtn.classname) = "yt-uix-button-content" Then $oFound = $oBtn EndIf Next _IEAction ($oFound, "click") EndFunc  
      Please Help 
      Can you click it by name?
    • faustf
      By faustf
      i guys , like title anyone  have idea if is possible , and if yes if  have example to post ?  i find in forum and in google but  i dont know   how can start  to create  button with icon over toolbar near  clock or is  goog before language layout .
      sorry i not post any script but i dont know  where to start
      thankz
      at  all
    • caramen
      By caramen
      Hmmm i am sorry  i had simular problem but i cant find back post. 
       
      How to hide a gui button ? 
       
      I Want to dodge the variable non déclaréd when i make button in
      if statment 
       
      thx before 
×