Jump to content
Sign in to follow this  
momar33

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

Recommended Posts

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

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 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

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

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 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

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

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 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

    • By GillesMaisonneuve
      Good morning,
       
      I am trying to align a two-line text in a button so that it would be centered in the button but can't succeed to do it for the vertical part.
      Can someone tell me what I do wrong ?
      Here is my code:
      $btn3 = GUICtrlCreateButton("Execute " & @LF & " file 1", 100, 65, 60, 50, _ BitOr($BS_CENTER,$BS_BOTTOM,$BS_MULTILINE)) and here is the resulting layout I get in my window.
      I tried to follow the help, made a lot of different parameter combinations (here it's `$BS_BOTTOM`, but I tried `$BS_VCENTER` and `$BS_TOP`), still get the same result : vertical alignement is a no go for me.
      Can someone help ?
      TIA
      Gilles

    • By Pike
      Hey Everyone, I haven't been here in a while and recently picked up my old project. Still an FNG!
      To the point: I want to be able to push the button and either play an mp3, open a file, or open an exe program (all with the same button). The problem is that I don't know how to code for that at "case 1"
              Case 1                                                                                                                                             
                  Local $sRead = IniRead("config.ini", "Config", "One", "Default")                                
                  SoundPlay($sRead, @HotKeyPressed)                                                                     <-------------------------------
                  Run($sRead, @HotKeyPressed)                                                                                 <------------------------------- This 'Run' doesn't work even by itself!
      See code below for layout. If you need more information I will attach more code or answer any questions. Any help is greatly appreciated.
       
      Much Respect,
      Pike
       
      Func _HandleButton() $iClickCount += 1 $iTimer = TimerInit() AdlibRegister("CheckButtonPress", $CheckTime) EndFunc Func CheckButtonPress() If TimerDiff($iTimer) < $CheckTime Or $iTimer = 0 Then Return Switch $iClickCount Case 1 Local $sRead = IniRead("config.ini", "Config", "One", "Default") SoundPlay($sRead, @HotKeyPressed) Run($sRead, @HotKeyPressed) Case 2 MsgBox(0, "INFORMATION:", "Choose the file you want designated to this button") Local $sFileOpenDialog = FileOpenDialog(0, @ScriptDir & "\", "All (*.*)", $FD_FILEMUSTEXIST + $FD_MULTISELECT) If @error Then MsgBox($MB_SYSTEMMODAL, "", "No file(s) were selected.") EndIf Local $sFileName = InputBox("INFORMATION:", "Please Name Your File?" & @CRLF _ & @CRLF _ & "6 Characters or Less", "") IniWrite(@ScriptDir & "\config.ini", "Config", "One", $sFileOpenDialog) IniWrite(@ScriptDir & "\config.ini", "Config", "NameOne", $sFileName) EndSwitch $iClickCount = 0 AdlibUnRegister() EndFunc  

    • By misioooo
      Hi!
       
      I am writing some GUI and i need to use images as buttons, but with text on them (text is from INI file).
      Part with button looks like this:
      $ankieta1 = GUICtrlCreateButton($txtAnk1, 100,350,765,164) GUICtrlSetFont(-1, 22, 800, -1, "Arial") ;GUICtrlSetColor(-1,0xffffff) $hImageBtn_1 = _GUIImageList_Create(765, 164) _GUIImageList_AddBitmap($hImageBtn_1, "c:\path\to\ankieta_clean.bmp") _GUICtrlButton_SetImageList($ankieta1, $hImageBtn_1, 4) GUICtrlSetOnEvent(-1, "On_Ankieta1") The problem - if i uncomment GUICtrlSetColor, color of text changes, but button is just plain gray (no image). How i can change text color not touching image on a button here?
    • By XinYoung
      Quick question: How can I click this "Select All" button in IE? There's no ID, and the href is "#"  
      Am I looking at the wrong html code?
      Am I looking
      Thank you all in advance!
    • By XinYoung
      Hello again 
      I need to click this Submit button, but it's in a lightbox and has no ID (i think) and I can't figure out a way to target it. _IEFormSubmit doesn't work.

       
      Thank you
×
×
  • Create New...