Autohotkey 如何调整大小并交替移动+;调整大小?

Autohotkey 如何调整大小并交替移动+;调整大小?,autohotkey,Autohotkey,在设计某个应用程序时,我需要在一个小GUI窗口中有两个编辑框,这样可以调整窗口的大小,并且只调整第一个编辑框的大小,但是shift+resize会调整第二个编辑框的大小 (请忽略我截图中的图钉图标;它是DisplayFusion放在那里的ontop按钮,不会影响此线程) 我尝试使用anchor.ahk和autoxywh.ahk库自动调整控件大小。这是我的示例代码以及autoxywh的副本(您应该能够粘贴并运行它) 使用AutoXYWH.ahk库: #noenv #单实例力 apptitle:=

在设计某个应用程序时,我需要在一个小GUI窗口中有两个编辑框,这样可以调整窗口的大小,并且只调整第一个编辑框的大小,但是shift+resize会调整第二个编辑框的大小

(请忽略我截图中的图钉图标;它是DisplayFusion放在那里的ontop按钮,不会影响此线程)

我尝试使用
anchor.ahk
autoxywh.ahk
库自动调整控件大小。这是我的示例代码以及autoxywh的副本(您应该能够粘贴并运行它)

使用AutoXYWH.ahk库:
#noenv
#单实例力
apptitle:=“ShiftResize”
def_uiw:=212
Gui,+Hwnd%apptitle%+调整大小
Gui,+minsize%def_UIw%
图形用户界面,页边距,4
图形用户界面,添加,编辑,视频1 HwndhEdit1 w100,
图形用户界面,添加,编辑,视频2 HwndhEdit2 w100 x+4,
Gui,显示
返回
大小:
如果!预加宽
pre\u GuiWidth:=A\u GuiWidth
guicontrolget,edit1,pos
guicontrolget,edit2,pos
if(getkeystate(“shift”、“P”)){
If(edit2w<100)&(A_GuiWidth-pre_GuiWidth<0)
返回
如果(lastResize!=“Edit2”)
lastResize:=“Edit2”,autoxywh(“更新控制信息”)
autoxywh(“w”,hEdit2)
}否则{
If(edit1w<100)&(A_GuiWidth-pre_GuiWidth<0)
返回
如果(lastResize!=“Edit1”)
lastResize:=“Edit1”,autoxywh(“更新控制信息”)
autoxywh(“x”,hEdit2)
autoxywh(“w”,hEdit1)
}
pre\u GuiWidth:=A\u GuiWidth
返回
GuiClose:
出口
; =============================================================================
; 功能:AutoXYWH
;   GUI调整大小时自动移动和调整控件大小。
; 参数:
;   DimSize-可以是一个或多个x/y/w/h可选值,后跟一个分数
;             将“*”添加到DimSize到控件的“MoveDraw”中,而不只是“Move”,这是建议用于GroupBox的
;   cList-控件ID的可变列表
;             ControlID可以是控件HWND、关联变量名、ClassNN或显示的文本。
;             后面的(显示的文本)是可能的,但不推荐,因为不太可靠
; 示例:
;   AutoXYWH(“xy”、“Btn1”、“Btn2”)
;   AutoXYWH(“w0.5H0.75”,hEdit,“显示文本”,“vLabel”,“按钮1”)
;   AutoXYWH(“*w0.5H0.75”,hGroupbox1,“GRB选择”)
; =============================================================================
;   以下是GuiSize如何与AutoXYWH(由toralf修改)配合使用:
;http://ahkscript.org/boards/viewtopic.php?f=5&t=7696&p=45882#p45786
;第一次执行Gui时,将调用GuiSize标签。此时,AutoXYWH存储控件的初始x/y/w/h和GuiWidth/GuiHeight。
;初始\u GuiWidth:=A\u GuiWidth
;初始高度:=A高度
;GuiControlGet,初始控制,位置,%ControlID%
;; 初始控制
;; 初始控制
;; 初始控制
;; 初始控制
;之后,当用户调整Gui窗口的大小时,将调用GuiSize标签,AutoXYWH然后计算Gui宽度和高度的变化。
;Diff\u GuiWidth:=A\u GuiWidth-初始\u GuiWidth
;Diff_GuiHeight:=A_GuiHeight-初始_GuiHeight
;然后,新值:
;新的控制宽度:=Diff\u GuiWidth+初始控制宽度
;新的控制x:=Diff\u GuiWidth+初始控制x
;新的控制高度:=差异高度+初始控制高度
;新控制:=差异高度+初始控制
; -----------------------------------------------------------------------------
; 发布日期:2015-5-17
; 作者:tmplinshi(由toralf修改)
; 需要AHK版本:1.1.13.01+
; =============================================================================
AutoXYWH(DimSize,cList*){;http://ahkscript.org/boards/viewtopic.php?t=1079
静态cInfo:={}
如果(DimSize=“更新控制信息”){
对于ctrlid,cInfo中的obj
{
GuiControlGet,i,位置,%ctrlid%
cInfo[ctrlid].x:=ix
cInfo[ctrlid].y:=iy
cInfo[ctrlid].w:=iw
cInfo[ctrlid].h:=ih
}
返回
}
对于i,在cList中按ctrl键{
ctrlid:=A_Gui:“ctrl”
If(cInfo[ctrlid].x=”“){
GuiControlGet,i,%A\u Gui%:Pos,%ctrl%
GuiControlGet,Hwnd,%A\u Gui%:Hwnd,%ctrl%
MMD:=仪表(DimSize,“*”?“移动绘图”:“移动”
fx:=fy:=fw:=fh:=0
对于i,dim in(a:=StrSplit(RegExReplace(DimSize,“i)[^xywh]”)
If!RegExMatch(DimSize,“i)”dim“\s*\K[\d.-]+”,f%dim%)
f%dim%:=1
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
对于我,在cInfo[ctrlid][“a”]
选项=dim(dg%dim%*cInfo[ctrlid][f”dim]+cInfo[ctrlid][dim])A_空间
GuiControl,%A\u Gui:“cInfo[ctrlid].m,%ctrl,%Options
} } }
Maestrith提出了这个替代方案:
#单实例,强制
设置行,-1
Gui,+minsize230+Resize+hwndmain
Gui,添加,编辑,w100 hwndedit1
图形用户界面,添加,编辑,x+10 w100
ControlGetPos,x,y,w,h,,ahk_id%1%
SysGet,Border,32
SysGet,标题,4
OnMessage(0xA1,“sizemove”)
Gui,显示
返回
大小:
如果(Resize=“Left”&&offsetx&&A\u GuiWidth-offsetx=100){
GuiControl,1:Move,Edit2,%“x”A_GuiWidth-offsetx
GuiControl,1:move,Edit1,%“w”A_GuiWidth+offsetw
}
如果(Resize=“right”&&offsetx&&A\u GuiWidth+woffset>=100){
GuiControl,1:move,Edit2,%“w”A_GuiWidth+woffset
}
如果(Resize=“right”&&offsetx&&A\u GuiWidth+woffset:

#NoEnv
#单实例力
SetBatchLines,-1;重要!!!
AppTitle:=“ShiftResize”
MinSize:=错误
MarginX:=4
Gui,+Hwnd%AppTitle%+调整大小
Gui,利润率,%MarginX%
图形用户界面,添加,编辑,视频1 HwndhEdit1 w100,
图形用户界面,添加,编辑,视频2 HwndhEdit2 w100 x+4,
Gui,显示,%AppTitle%
返回
GuiClose:
出口
大小:
如果(MinSize=False){;GuiSize的第一次调用
圭孔
#noenv
#singleinstance force

apptitle := "ShiftResize"
 def_uiw := 212

Gui, +Hwnd%apptitle% +resize
Gui, +minsize%def_UIw%
gui, margin, 4
Gui, Add, Edit, vEdit1 HwndhEdit1 w100,
Gui, Add, Edit, vEdit2 HwndhEdit2 w100 x+4,
Gui, Show
return

GuiSize:
    If !pre_GuiWidth
        pre_GuiWidth := A_GuiWidth

    guicontrolget, edit1, pos
    guicontrolget, edit2, pos

    if(getkeystate("shift","P")){
        If (edit2w < 100) && (A_GuiWidth-pre_GuiWidth < 0)
            Return
        If (lastResize != "Edit2")
            lastResize := "Edit2", autoxywh("update_ctrl_info")
        autoxywh("w", hEdit2)
    }else{
        If (edit1w < 100)  && (A_GuiWidth-pre_GuiWidth < 0)
            Return
        If (lastResize != "Edit1")
            lastResize := "Edit1", autoxywh("update_ctrl_info")
        autoxywh("x", hEdit2)
        autoxywh("w", hEdit1)
    }

    pre_GuiWidth := A_GuiWidth
return

GuiClose:
ExitApp

; =============================================================================
; Function: AutoXYWH
;   Move and resize control automatically when GUI resizes.
; Parameters:
;   DimSize - Can be one or more of x/y/w/h  optional followed by a fraction
;             add a '*' to DimSize to 'MoveDraw' the controls rather then just 'Move', this is recommended for Groupboxes
;   cList   - variadic list of ControlIDs
;             ControlID can be a control HWND, associated variable name, ClassNN or displayed text.
;             The later (displayed text) is possible but not recommend since not very reliable 
; Examples:
;   AutoXYWH("xy", "Btn1", "Btn2")
;   AutoXYWH("w0.5 h 0.75", hEdit, "displayed text", "vLabel", "Button1")
;   AutoXYWH("*w0.5 h 0.75", hGroupbox1, "GrbChoices")
; =============================================================================
;   Here is how GuiSize works with AutoXYWH (mod by toralf):
;http://ahkscript.org/boards/viewtopic.php?f=5&t=7696&p=45882#p45786
;The first time Gui, Show executing, the GuiSize lable will be called. At that time then, AutoXYWH stores the initial x/y/w/h of Controls and GuiWidth/GuiHeight.
;Initial_GuiWidth := A_GuiWidth
;Initial_GuiHeight := A_GuiHeight

;GuiControlGet, Initial_Control, Pos, %ControlID%
;; Initial_ControlX
;; Initial_ControlY
;; Initial_ControlW
;; Initial_ControlH

;After that, when user resizing the Gui window, GuiSize lable will be called, AutoXYWH then calculates the changes of Gui Width and Height.
;Diff_GuiWidth := A_GuiWidth - Initial_GuiWidth
;Diff_GuiHeight := A_GuiHeight - Initial_GuiHeight

;Then, the new values:
;New_ControlW := Diff_GuiWidth + Initial_ControlW
;New_ControlX := Diff_GuiWidth + Initial_ControlX

;New_ControlH := Diff_GuiHeight + Initial_ControlH
;New_ControlY := Diff_GuiHeight + Initial_ControlY
; -----------------------------------------------------------------------------
; Release date: 2015-5-17
; Author      : tmplinshi (mod by toralf)
; requires AHK version : 1.1.13.01+
; =============================================================================
AutoXYWH(DimSize, cList*){       ; http://ahkscript.org/boards/viewtopic.php?t=1079
  static cInfo := {}

  If (DimSize = "update_ctrl_info") {
    For ctrlid, obj in cInfo
    {
        GuiControlGet, i, Pos, %ctrlid%
        cInfo[ctrlid].x := ix
        cInfo[ctrlid].y := iy
        cInfo[ctrlid].w := iw
        cInfo[ctrlid].h := ih
    }
    Return
  }

  For i, ctrl in cList {
    ctrlid := A_Gui ":" ctrl
    If ( cInfo[ctrlid].x = "" ){
        GuiControlGet, i, %A_Gui%:Pos, %ctrl%
        GuiControlGet, Hwnd, %A_Gui%:Hwnd, %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
        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
        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
} } }
#SingleInstance,Force
SetBatchLines,-1
Gui,+minsize230 +Resize +hwndmain
Gui,Add,Edit,w100 hwndedit1
Gui,Add,Edit,x+10 w100
ControlGetPos,x,y,w,h,,ahk_id%edit1%
SysGet,Border,32
SysGet,Caption,4
OnMessage(0xA1,"sizemove")
Gui,Show
return
GuiSize:
if(Resize="Left"&&offsetx&&A_GuiWidth-offsetx<=100){
    Gui,+minsize%A_GuiWidth%
}
if(Resize="Left"&&offsetx&&A_GuiWidth-offsetx>=100){
    GuiControl,1:Move,Edit2,% "x" A_GuiWidth-offsetx
    GuiControl,1:move,Edit1,% "w" A_GuiWidth+offsetw
}
if(Resize="right"&&offsetx&&A_GuiWidth+woffset>=100){
    GuiControl,1:move,Edit2,% "w" A_GuiWidth+woffset
}
if(Resize="right"&&offsetx&&A_GuiWidth+woffset<=100)
    Gui,+MinSize%A_GuiWidth%
return
GuiClose:
GuiEscape:
ExitApp
return
sizemove(){
    global
    resize:=GetKeyState("Shift","P")?"Right":"Left"
    ControlGetPos,x,y,w,h,Edit2,ahk_id%main%
    ControlGetPos,xx,yy,ww,hh,Edit1,ahk_id%main%
    VarSetCapacity(rect,16)
    DllCall("GetClientRect",UPtr,main,UPtr,&rect),width:=NumGet(rect,8),height:=NumGet(rect,12)
    offsetx:=width-x+border
    offsetw:=ww-width
    woffset:=w-width
}
#NoEnv
#SingleInstance Force
SetBatchLines, -1 ; important !!!

AppTitle := "ShiftResize"

MinSize := False
MarginX := 4

Gui, +Hwnd%AppTitle% +Resize
Gui, Margin, %MarginX%
Gui, Add, Edit, vEdit1 HwndhEdit1 w100,
Gui, Add, Edit, vEdit2 HwndhEdit2 w100 x+4,
Gui, Show, , %AppTitle%
Return

GuiClose:
ExitApp

GuiSize:
   If (MinSize = False) { ; first call of GuiSize
      GuiControlGet, Edit1, Pos
      MinWidth1 := Edit1W
      GuiControlGet, Edit2, Pos
      MinWidth2 := Edit2W
      Gui, +MinSize%A_GuiWidth%x
      MinSize := True
      Return
   }
   Margin := A_GuiWidth - (Edit2X + Edit2W) - MarginX
   If GetKeyState("Shift", "P") { ; Edit2
      Edit2W += Margin
      If (Edit2W < MinWidth2)
         Edit2W := MinWidth2
      Edit2X := A_GuiWidth - Edit2W - MarginX
      GuiControl, Move, Edit2, x%Edit2X% w%Edit2W%
      Edit1W := Edit2X - MarginX - MarginX
      GuiControl, Move, Edit1, w%Edit1W%
   }
   Else { ; Edit1
      Edit1W += Margin
      If (Edit1W < MinWidth1)
         Edit1W := MinWidth1
      GuiControl, Move, Edit1, w%Edit1W%
      Edit2X := Edit1X + Edit1W + MarginX
      Edit2W := A_GuiWidth - Edit2X - MarginX
      GuiControl, Move, Edit2, x%Edit2X% w%Edit2W%
   }
Return