Elevate your AHK Gui development with extended methods and properties. This library provides a set of extended methods and properties to enhance your AutoHotkey Gui development experience.
🌍Other Language: ä¸ć–‡
#Requires AutoHotkey v2
#Include <GuiEnhancerKit>
To ensure proper functioning of VSCode's IntelliSence, you can:
- 替换
Gui
object withGuiExt
. (Recommended)
myGui := GuiExt("-Caption +Resize")
- Annotate the variable type as GuiExt above the line where you create a new Gui object instance.
/** @var {GuiExt} myGui */
myGui := Gui("-Caption +Resize")
This method sets the control's border style to rounded corners. The radius of the rounded corners is set to 9
in this case.
text.SetRounded(9)
These properties allow you to get or set the Gui or Gui Control's position and size.
/* Get the current gui position. */
myEdit.UpdatePos := ctrl => (ctrl.Value :=
(
"x: " myGui.X "
y: " myGui.Y "
w: " myGui.W "
h: " myGui.H
))
myGui.OnEvent("Size", Size)
/**
* @param {GuiExt|Gui} GuiObj
* @param {Integer} MinMax
* @param {Integer} Width
* @param {Integer} Height
*/
Size(GuiObj, MinMax, Width, Height) {
Critical("Off")
SetWinDelay(-1), SetControlDelay(-1)
/* Moving Controls */
myEdit.W := text.W := Width - (GuiObj.MarginX*2)
myEdit.H := Height - (GuiObj.MarginY*2)
text.SetRounded()
myEdit.UpdatePos()
}
This method registers a function or method to be called whenever the Gui or GuiControl receives the specified message. Learn more
WM_LBUTTONDOWN := 0x0201
WM_SETCURSOR := 0x0020
WM_MOVING := 0x0216
myGui.OnMessage(WM_LBUTTONDOWN, DragWindow)
myEdit.OnMessage(WM_SETCURSOR, SetCursor)
myGui.OnMessage(WM_MOVING, (*) => myEdit.UpdatePos())
/**
* Callback function for `GuiCtrl.OnMessage()`
* @param GuiCtrlObj
* @param wParam
* @param lParam
* @param msg
* @returns {Integer}
*/
DragWindow(GuiCtrlObj, wParam, lParam, msg) {
static WM_NCLBUTTONDOWN := 0x00A1
PostMessage(WM_NCLBUTTONDOWN, 2,,, GuiCtrlObj is Gui.Control ? GuiCtrlObj.Gui : GuiCtrlObj)
return 0
}
/**
* Callback function for `GuiCtrl.OnMessage()`
* @param GuiCtrlObj
* @param wParam
* @param lParam
* @param msg
* @returns {Integer}
*/
SetCursor(GuiCtrlObj, wParam, lParam, Msg) {
static hCursor := DllCall("LoadCursor", "ptr", 0, "ptr", 32512)
DllCall("SetCursor", "ptr", hCursor, "ptr")
return 0
}
This method sets the dark mode title bar for the window if the operating system version supports it.
myGui.SetDarkTitle()
This method calls the DwmSetWindowAttribute
function from the dwmapi library to set attributes of a window.
Requires Windows 11.
Learn more on MSDN
/* To set Rounded Corners for window. */
myGui.SetWindowAttribute(33, 2)
This method sets the title bar background color to match the GUI background and removes the window border.
myGui.SetWindowColor(, myGui.BackColor, myGui.BackColor)
This method sets the dark mode context menus.
myGui.SetDarkMenu()
Applies a specified theme to the window through the SetWindowTheme function from the uxtheme library.
/* This example sets dark mode edit control.*/
myEdit.SetTheme("DarkMode_Explorer")
This method sends a message to the gui or gui control.
EN_KILLFOCUS := 0x0200
myEdit.SendMsg(EN_KILLFOCUS)
Create a RECT
structure object that defines a rectangle by the coordinates of its upper-left and lower-right corners. This can be used directly with DllCall
.
/* Get RECT object from DllCall */
DllCall("GetWindowRect", "Ptr", WinExist("A"), "ptr", rc := GuiExt.RECT())
MsgBox(Format("{} {} {} {} {} {}", rc.left, rc.top, rc.right, rc.bottom, rc.Width, rc.Height))
/* Create a RECT object with values preset. */
rc := GuiExt.RECT({top: 10, bottom: 69})
MsgBox(Format("L{}/ T{}/ R{}/ B{}", rc.left, rc.top, rc.right, rc.bottom))
myGui.OnMessage(WM_NCCALCSIZE := 0x0083, NCCALCSIZE)
NCCALCSIZE(guiObj, wParam, lParam, msg) {
if !wParam {
/* Get the structure object from pointer address. */
rc := GuiExt.RECT(lParam)
ToolTip(Format("L{}/ T{}/ R{}/ B{}", rc.left, rc.top, rc.right, rc.bottom))
}
}
Retrieves the dimensions of the bounding rectangle of the specified window. The dimensions are given in screen coordinates that are relative to the upper-left corner of the screen. Learn more on MSDN
rc := myGui.GetWindowRect()
MsgBox(rc.left " " rc.top " " rc.right " " rc.bottom " " rc.Width " " rc.Height)
Retrieves the coordinates of a window's client area. The client coordinates specify the upper-left and lower-right corners of the client area. Because client coordinates are relative to the upper-left corner of a window's client area, the coordinates of the upper-left corner are (0,0)
.
rc := myEdit.GetClientRect()
MsgBox(rc.left " " rc.top " " rc.right " " rc.bottom " " rc.Width " " rc.Height)
Gui.SetBorderless(border := 6, dragWndFunc := "", cxLeftWidth?, cxRightWidth?, cyTopHeight?, cyBottomHeight?)
To create a borderless window with customizable resizing behavior. Creating a borderless resizable window with Mica (Alt) effect. background.
myGui := GuiExt("-Caption +Resize")
myGui.SetFont("cWhite s16", "Segoe UI")
myGui.SetDarkTitle()
myGui.SetDarkMenu()
myGui.OnEvent('Size', Size)
myGui.BackColor := 0x202020
text := myGui.Add("Text", "vTitlebar Backgroundcaa2031 cwhite Center R1.5 0x200 w280", "Titlebar Area")
text.SetRounded()
/* Set Mica (Alt) background. (Supported starting with Windows 11 Build 22000.) */
if (VerCompare(A_OSVersion, "10.0.22600") >= 0)
myGui.SetWindowAttribute(38, 4)
myGui.SetBorderless(6, (g, x, y) => (y <= g['Titlebar'].GetWindowRect().bottom), 500, 500, 500, 500)
myGui.Show("h500")
Size(g, minmax, width, height) {
SetControlDelay(-1)
/** Set titlebar's width to fix the gui. */
g["Titlebar"].W := (width - (g.MarginX*2))
}