관리 메뉴

ㄴrㅎnㅂrㄹrㄱi

Control Anchoring - for resizing windows (창크기에 따라 같이 변하는 오브젝트) 본문

AUTOHOTKEY/스크립트

Control Anchoring - for resizing windows (창크기에 따라 같이 변하는 오브젝트)

님투 2009. 1. 4. 15:58
반응형
http://www.autohotkey.com/forum/viewtopic.php?t=4348

This function defines how controls should be automatically positioned relatively to the new dimensions of a GUI when resized. 
Instructions are in the script. The example is also helpful for first time users. 

Download Function




복잡해 보이겠지만  생각보단 간편합니다.
아래 함수를 보시면  아시겠지만

/*

  Function: Anchor
    Defines how controls should be automatically positioned relative to the new dimensions of a GUI when resized.
  
  Parameters:
    cl - a control HWND, associated variable name or ClassNN to operate on
    a - (optional) one or more of the anchors: 'x', 'y', 'w' (width) and 'h' (height),
        optionally followed by a relative factor, e.g. "x h0.5"
    r - (optional) true to redraw controls, recommended for GroupBox and Button types
  
  Examples:
> "xy" ; bounds a control to the bottom-left edge of the window
> "w0.5" ; any change in the width of the window will resize the width of the control on a 2:1 ratio
> "h" ; similar to above but directrly proportional to height
  
  Remarks:
    Anchor must always be called within a GuiSize label where AutoHotkey assigns a real value to A_Gui.
    The only exception is when the second and third parameters are omitted to reset the stored positions for a control.
    For a complete example see anchor-example.ahk.
  
  License:
    - Version 4.56 by Titan <http://www.autohotkey.net/~Titan/#anchor>
    - GNU General Public License 3.0 or higher <http://www.gnu.org/licenses/gpl-3.0.txt>

*/

Anchor(i, a = "", r = false) {
  static c, cs = 12, cx = 255, cl = 0, g, gs = 8, z = 0, k = 0xffff, gx = 1
  If z = 0
    VarSetCapacity(g, gs * 99, 0), VarSetCapacity(c, cs * cx, 0), z := true
  If a =
  {
    StringLeft, gn, i, 2
    If gn contains :
    {
      StringTrimRight, gn, gn, 1
      t = 2
    }
    StringTrimLeft, i, i, t ? t : 3
    If gn is not digit
      gn := gx
  }
  Else gn := A_Gui
  If i is not xdigit
  {
    GuiControlGet, t, Hwnd, %i%
    If ErrorLevel = 0
      i := t
    Else ControlGet, i, Hwnd, , %i%
  }
  gb := (gn - 1) * gs
  Loop, %cx%
    If (NumGet(c, cb := cs * (A_Index - 1)) == i) {
      If a =
      {
        cf = 1
        Break
      }
      Else gx := A_Gui
      d := NumGet(g, gb), gw := A_GuiWidth - (d >> 16 & k), gh := A_GuiHeight - (d & k), as := 1
        , dx := NumGet(c, cb + 4, "Short"), dy := NumGet(c, cb + 6, "Short")
        , dw := NumGet(c, cb + 8, "Short"), dh := NumGet(c, cb + 10, "Short")
      Loop, Parse, a, xywh
        If A_Index > 1
          av := SubStr(a, as, 1), as += 1 + StrLen(A_LoopField)
            , d%av% += (InStr("yh", av) ? gh : gw) * (A_LoopField + 0 ? A_LoopField : 1)
      DllCall("SetWindowPos", "UInt", i, "Int", 0, "Int", dx, "Int", dy, "Int", dw, "Int", dh, "Int", 4)
      If r != 0
        DllCall("RedrawWindow", "UInt", i, "UInt", 0, "UInt", 0, "UInt", 0x0101) ; RDW_UPDATENOW | RDW_INVALIDATE
      Return
    }
  If cf != 1
    cb := cl, cl += cs
  If (!NumGet(g, gb)) {
    Gui, %gn%:+LastFound
    WinGetPos, , , , gh
    VarSetCapacity(pwi, 68, 0), DllCall("GetWindowInfo", "UInt", WinExist(), "UInt", &pwi)
      , NumPut(((bx := NumGet(pwi, 48)) << 16 | by := gh - A_GuiHeight - NumGet(pwi, 52)), g, gb + 4)
      , NumPut(A_GuiWidth << 16 | A_GuiHeight, g, gb)
  }
  Else d := NumGet(g, gb + 4), bx := d >> 16, by := d & k
  ControlGetPos, dx, dy, dw, dh, , ahk_id %i%
  If cf = 1
  {
    Gui, %gn%:+LastFound
    WinGetPos, , , gw, gh
    d := NumGet(g, gb), dw -= gw - bx * 2 - (d >> 16), dh -= gh - by - bx - (d & k)
  }
  NumPut(i, c, cb), NumPut(dx - bx, c, cb + 4, "Short"), NumPut(dy - by, c, cb + 6, "Short")
    , NumPut(dw, c, cb + 8, "Short"), NumPut(dh, c, cb + 10, "Short")
  Return, true
}
반응형
Comments