Re: AutoXYWH() - Move control automatically when GUI resized
Posted: 12 Oct 2016, 15:09
Hmmm, true... it is unspecified. I am assuming it is on a simple "attribution" basis?
Let's help each other out
https://www.autohotkey.com/boards/
NOdrawback wrote:Are there any license restrictions (for using it in a commercial application) for this one?
Code: Select all
If ( cInfo[ctrlID].x = "" ){
Code: Select all
if !IsObject(cInfo[ctrlID]), cInfo[ctrlID] := {}
Code: Select all
#NoEnv
#SingleInstance Force
Gui +Resize
Gui Add, Tab3, x8 y8 w598 h160, Tab 1|Tab 2
Gui Tab, 1
Gui Add, Button, x513 y40 w80 h24, 1
Gui Add, Button, x513 y73 w80 h24, 2
Gui Tab
Gui Add, Button, x513 y176 w80 h23, 3
Gui Show, w613 h210, Window
Return
GuiSize:
If (A_EventInfo == 1) {
Return
}
AutoXYWH("w", "SysTabControl321")
AutoXYWH("xt", "Button1")
AutoXYWH("x", "Button2")
AutoXYWH("x", "Button3")
Return
GuiEscape:
GuiClose:
ExitApp
AutoXYWH(DimSize, cList*) {
Static cInfo := {}
If (DimSize = "reset") {
Return cInfo := {}
}
For i, ctrl in cList {
ctrlID := A_Gui ":" ctrl
If (cInfo[ctrlID].x = "") {
GuiControlGet i, %A_Gui%: Pos, %ctrl%
MMD := InStr(DimSize, "*") ? "MoveDraw" : "Move"
fx := fy := fw := fh := 0
For i, dim in (a := StrSplit(RegExReplace(DimSize, "i)[^xywh]"))) {
If (!RegExMatch(DimSize, "i)" . dim . "\s*\K[\d.-]+", f%dim%)) {
f%dim% := 1
}
}
If (InStr(DimSize, "t")) {
GuiControlGet hWnd, %A_Gui%: hWnd, %ctrl%
hParentWnd := DllCall("GetParent", "Ptr", hWnd, "Ptr")
VarSetCapacity(RECT, 16, 0)
DllCall("GetWindowRect", "Ptr", hParentWnd, "Ptr", &RECT)
DllCall("MapWindowPoints", "Ptr", 0, "Ptr", DllCall("GetParent", "Ptr", hParentWnd, "Ptr"), "Ptr", &RECT, "UInt", 1)
ix := ix - NumGet(RECT, 0, "Int")
iy := iy - NumGet(RECT, 4, "Int")
}
cInfo[ctrlID] := {x: ix, fx: fx, y: iy, fy: fy, w: iw, fw: fw, h: ih, fh: fh, gw: A_GuiWidth, gh: A_GuiHeight, a: a, m: MMD}
} Else If (cInfo[ctrlID].a.1) {
dgx := dgw := A_GuiWidth - cInfo[ctrlID].gw, dgy := dgh := A_GuiHeight - cInfo[ctrlID].gh
Options := ""
For i, dim in cInfo[ctrlID]["a"] {
Options .= dim . (dg%dim% * cInfo[ctrlID]["f" . dim] + cInfo[ctrlID][dim]) . A_Space
}
GuiControl, % A_Gui ":" cInfo[ctrlID].m, % ctrl, % Options
}
}
}
Code: Select all
If (cInfo[ctrlID].x = "") {
ix := iy := iw := ih := 0 ;; added to prevent warning
Just for info.---------------------------
TimeReport.ahk
---------------------------
Warning in #include file "AutoXYWH.ahk":
This variable has not been assigned a value.
Specifically: ix (a local variable)
Line#
045: hParentWnd := DllCall("GetParent", "Ptr", hWnd, "Ptr")
046: VarSetCapacity(RECT, 16, 0)
047: DllCall("GetWindowRect", "Ptr", hParentWnd, "Ptr", &RECT)
048: DllCall("MapWindowPoints", "Ptr", 0, "Ptr", DllCall("GetParent", "Ptr", hParentWnd, "Ptr"), "Ptr", &RECT, "UInt", 1)
049: ix := ix - NumGet(RECT, 0, "Int")
050: iy := iy - NumGet(RECT, 4, "Int")
051: }
---> 053: cInfo[ctrlID] := {x: ix, fx: fx, y: iy, fy: fy, w: iw, fw: fw, h: ih, fh: fh, gw: A_GuiWidth, gh: A_GuiHeight, a: a, m: MMD}
054: }
054: Else
054: if (cInfo[ctrlID].a.1)
054: {
055: dgx := dgw := A_GuiWidth - cInfo[ctrlID].gw, dgy := dgh := A_GuiHeight - cInfo[ctrlID].gh
056: Options := ""
057: For i,dim in cInfo[ctrlID]["a"]
For more details, read the documentation for #Warn.
---------------------------
OK
---------------------------
First post of this thread.ahklearner wrote:where can I find the updated and latest version, please
To do what ?SL5 wrote:what about create a loop or setinterval? and check always the size?
sorry i missunderstud.pramach wrote:The GuiSize is already a kind of trigger called by AHK in case the GUI is resized.SL5 wrote:what about create a loop or setinterval? and check always the size?
Sorry but now I do not understand your wish !SL5 wrote:sorry i missunderstud.
may close the control and start again?
Code: Select all
#Include, AutoXYWH.ahk
Gui, +Resize
Gui, Add, Edit, ve1 w600 h100
Gui, Add, Edit, ve2 w600 h100
Gui, Add, Button, x10 Y+10 w150 vb1 gResize, Resize
Gui, Add, Button, x+10 w150 vb2 gResize, Resize
Gui, Add, Button, x+10 vb3 w150 gResize, Resize
Gui, Add, Button, x+10 vb4 w150 gResize, Resize
Gui, Show, AutoSize
return
Resize:
GuiControl, Move, e1, h50
AutoXYWH("reset") ; Needs to reset if you changed the Control size manually.
return
GuiSize:
If (A_EventInfo = 1) ; The window has been minimized.
Return
AutoXYWH("why", "e1","e2")
AutoXYWH("yw", "b1","b2","b3","b4")
return
Code: Select all
Gui, Add, Edit, ve1 w600 h100 x10 y10
Gui, Add, Edit, ve2 w600 h100
Gui, Add, Button, x10 Y+10 w150 vb1 gResize, Resize
Gui, Add, Button, x+10 w150 vb2 gResize, Resize
Gui, Add, Button, x+10 vb3 w150 gResize, Resize
Gui, Add, Button, x+10 vb4 w150 gResize, Resize
Gui, +Resize
Gui, Show, AutoSize
return
Resize:
GuiControl, Move, e1, h50
AutoXYWH("reset", "") ; Needs to reset if you changed the Control size manually.
return
GuiSize:
If (A_EventInfo = 1) ; The window has been minimized.
Return
AutoXYWH("w", "e1", "e2") ; to keep width of edit fields
h := (A_GuiHeight - 50 ) / 2 ; calculate height of edit fields, (assumption !!) -50 = 2 edit fields with space above, below & between + space for buttons
y := 5
Loop, 2 ; for each edit field
{
GuiControl, MoveDraw, % "e" A_Index, % "h" h "y" y
y += h
}
AutoXYWH("y*", "b1", "b2", "b3", "b4" ) ; to keep Y line of buttons at bottom
w := (A_GuiWidth - 50 ) / 4 ; calculate width of button, -50 = 4 buttons a 10 space left, right & between
x := 10
Loop, 4 ; for each button
{
GuiControl, MoveDraw, % "b" A_Index, % "w" w "x" x
x += w
}
return
GuiEscape:
GuiClose:
; end of application
ExitApp
Code: Select all
AutoXYWH("wh0.5", "e1")
AutoXYWH("wh0.5y0.5", "e2")
AutoXYWH("*w0.25y", "b1")
AutoXYWH("*w0.25yx0.25", "b2")
AutoXYWH("*w0.25yx0.5", "b3")
AutoXYWH("*w0.25yx0.75", "b4")
wolf_II wrote:Try this:I hope that helps.Code: Select all
AutoXYWH("wh0.5", "e1") AutoXYWH("wh0.5y0.5", "e2") AutoXYWH("*w0.25y", "b1") AutoXYWH("*w0.25yx0.25", "b2") AutoXYWH("*w0.25yx0.5", "b3") AutoXYWH("*w0.25yx0.75", "b4")
Thank you for this!Alguimist wrote:GuiControl, Move moves the control relatively to the parent window. Controls placed in a Tab3 control are then misplaced because the parent window is a child dialog. This issue can be solved with a modified version of AutoXYWH:Notice the use of the "t" option.Code: Select all
#NoEnv #SingleInstance Force Gui +Resize Gui Add, Tab3, x8 y8 w598 h160, Tab 1|Tab 2 Gui Tab, 1 Gui Add, Button, x513 y40 w80 h24, 1 Gui Add, Button, x513 y73 w80 h24, 2 Gui Tab Gui Add, Button, x513 y176 w80 h23, 3 Gui Show, w613 h210, Window Return GuiSize: If (A_EventInfo == 1) { Return } AutoXYWH("w", "SysTabControl321") AutoXYWH("xt", "Button1") AutoXYWH("x", "Button2") AutoXYWH("x", "Button3") Return GuiEscape: GuiClose: ExitApp AutoXYWH(DimSize, cList*) { Static cInfo := {} If (DimSize = "reset") { Return cInfo := {} } For i, ctrl in cList { ctrlID := A_Gui ":" ctrl If (cInfo[ctrlID].x = "") { GuiControlGet i, %A_Gui%: Pos, %ctrl% MMD := InStr(DimSize, "*") ? "MoveDraw" : "Move" fx := fy := fw := fh := 0 For i, dim in (a := StrSplit(RegExReplace(DimSize, "i)[^xywh]"))) { If (!RegExMatch(DimSize, "i)" . dim . "\s*\K[\d.-]+", f%dim%)) { f%dim% := 1 } } If (InStr(DimSize, "t")) { GuiControlGet hWnd, %A_Gui%: hWnd, %ctrl% hParentWnd := DllCall("GetParent", "Ptr", hWnd, "Ptr") VarSetCapacity(RECT, 16, 0) DllCall("GetWindowRect", "Ptr", hParentWnd, "Ptr", &RECT) DllCall("MapWindowPoints", "Ptr", 0, "Ptr", DllCall("GetParent", "Ptr", hParentWnd, "Ptr"), "Ptr", &RECT, "UInt", 1) ix := ix - NumGet(RECT, 0, "Int") iy := iy - NumGet(RECT, 4, "Int") } cInfo[ctrlID] := {x: ix, fx: fx, y: iy, fy: fy, w: iw, fw: fw, h: ih, fh: fh, gw: A_GuiWidth, gh: A_GuiHeight, a: a, m: MMD} } Else If (cInfo[ctrlID].a.1) { dgx := dgw := A_GuiWidth - cInfo[ctrlID].gw, dgy := dgh := A_GuiHeight - cInfo[ctrlID].gh Options := "" For i, dim in cInfo[ctrlID]["a"] { Options .= dim . (dg%dim% * cInfo[ctrlID]["f" . dim] + cInfo[ctrlID][dim]) . A_Space } GuiControl, % A_Gui ":" cInfo[ctrlID].m, % ctrl, % Options } } }
Code: Select all
GuiSize:
If (A_EventInfo == 1) {
Return
}
AutoXYWH("w", "SysTabControl321")
AutoXYWH("xt", "Button1")
AutoXYWH("x", "Button2")
AutoXYWH("x", "Button3")
Return
Code: Select all
GuiSize:
If (A_EventInfo == 1) {
Return
}
AutoXYWH("w", "SysTabControl321")
AutoXYWH("xt", "Button1")
AutoXYWH("xt", "Button2")
AutoXYWH("x", "Button3")
Return
Code: Select all
GuiSize:
If (A_EventInfo == 1) {
Return
}
AutoXYWH("w", "SysTabControl321")
AutoXYWH("xt", "Button1")
AutoXYWH("xt", "Button2")
AutoXYWH("xt", "Button3")
Return