# GUI （界面）

该命令用来创建和管理一个窗体及窗体之上的控件。例如创建一个可以让用户输入数据的窗体或其他自定义界面。

Gui,子命令 [,参数2, 参数3, 参数4]

## 子命令列表

- Add 添加: 创建如文本、按钮、复选框等控件。
- Show 显示: 显示一个窗体。同时可以最小化最大化或移动窗体。
- Submit 提交: 保存用户输入的数据，同时可以选择隐藏窗体。
- Cancel(or Hide)取消或隐藏: 隐藏窗体。
- Destroy 销毁: 销毁窗体。
- Font 字体: 设置随后创建控件中字体的大小、样式、以及颜色。
- Color 颜色: 设置窗体、控件的背景色。
- Margin 边距: 在没有明确指定控件的大小位置时，设置控件之间的默认间距及空隙。
- Menu 菜单: 添加、删除菜单。
- Flash 闪烁: 对窗体及其在任务栏的按钮进行闪烁强调。
- Default 默认窗体: 改变当前线程操作的窗体编号。
- 窗体样式和选项
- 控件大小位置的布局设计
- 最小化、最大化、恢复窗口
- 保存和响应用户的输入: 参考 variables 和 g-labels
- 控件的样式和选项
- 窗体事件：关闭窗体 | 取消窗体 | 调整大小 | 窗体菜单 | 拖拽文件
- 创建多个界面
- 界面事件、线程、子过程
- 其他操作: 键盘导航 | 窗 体外观 | 概述
- 示例: 创建窗体界面以及控件的示例

## Gui, Add, ControlType [, Options, Text]

在窗体上增加一个控件（首先必须创建一个界面窗体）

ControlType 参数可以是以下的一种:

- Text 文字, Edit 编辑框, UpDown 增减按钮, Picture 图片框
- Button 按钮, Checkbox 复选框, Radio 单选框
- DropDownList, ComboBox 组合框
- ListBox 列表框, ListView 列表视图, TreeView 树形控件
- Hotkey 热键输入框, DateTime 日期控件, MonthCal 日历
- Slider 滑动条, Progress 进度 条
- GroupBox 分组框, Tab 属性页, StatusBar 状态栏, Internet Explorer Control IE控件

示例:

    Gui, Add, Text,, 请输入你的名字:
    Gui, Add, Edit, vName
    Gui, Show

## Gui, Show [, Options, Title]

如果没有在 Options 里明确指定，窗口一般会以可见，非最小化，激活状态运行。如果参数 Title 未设置，则窗体的标题和先前的窗体一致（如果没有先前的窗体，则以脚本的名字作为标题）。

若省略参数 X, Y, W，H 后面的数字，则窗体保持先前窗体的大小和位置。若无先前窗体位置且没有设置 X，Y，窗体则自动在屏幕居中。若无先前窗体的尺寸，则窗体会根据其包含的控件的大小和尺寸，自动调整窗体大小。

Options 参数可以省略，或包含以下字符

Wn: 指定n为窗体客户区（除去标题栏，菜单，和窗体的边框的区域）的宽度（以像素为单位）。

Hn: 指定n为窗体客户区的高度，以像素为单位。

Xn: 指定n为窗体在屏幕中的x坐标，0表示为屏幕 最左边第一列可见像素的位置。

Yn: 指定n为窗体在屏幕中的y坐标，0表示为屏幕 最上边第一行可见像素的位置。

Center: 使窗体在屏幕水平和垂直方向居中显示。

xCenter: 使窗体在屏幕的水平位置居中显示，例如: Gui, Show, xCenter y0

yCenter: 使窗体在屏幕的垂直方向居中显示。

AutoSize: 自动根据当前窗体上的控件来调整窗体的大小。这对于调整一个新加入控件的窗体，或控件移动，隐藏后的窗体的大小，是非常有用的。例如：Gui, Show, AutoSize Center

Options 中可以同时 包含以下参数：

Minimize: 最小化当前窗体并激活下一窗口

Maximize: 最大化并激活窗体

Restore: 还原，取消最小或最大化。窗体可能最小化后扔处于被取消激活状态。

NoActivate: 取消最大化最小化，并且不激活窗口。

NA: 显示窗体但不激活。如果窗体是最小化状态，可能会提升其 Z-Order 的数序（也就是在按下 alt-tab 时显示的顺序）。如果窗口原来为隐藏状态，他可能会显示在当前仍处于激活状态的窗体之上。

Hide: 隐藏窗体并激活下一窗口。除了允许移动，调整一个隐藏隐藏的窗体，设置窗体的标题外，这与 Gui Cancel 函数的效果相同。例如： Gui, Show, Hide x55 y66 w300 h200, New Title

## Gui, Submit [, NoHide]

保存每个控件的内容到与之关 联的变量 ，并且隐藏窗体（可以指定 NoHide 不隐藏）。对于那些可以产生多个变量的控件，如 多选列表框 ，可以利用窗口的数据分隔符来得到多个输出变量。如果之前调用了 Gui Destroy ，而使得窗口不存在，则该命令没有效果。

## Gui, Cancel

隐藏当前窗体，并且不保存控件的关联变量， 如果由于之前调用了 Gui Destroy 而使窗体不存在，则该命令没有效果。

## Gui, Destroy

移除一个存在的窗体和上面的所有控件，并且释放其所占用的内存及系统资源。如果脚本之后又需要显示窗体，则窗体的所有样式，如颜色和字 体都会以默认样式显示（就如窗体从未产生过）。如果在脚本结束时没有调用 Gui Destroy ， 则所有的窗体会被自动销毁。

## Gui, Font [, Options, FontName]

为该条语句之后创建的控件设置字体的样式，大小，样式，颜色。例如：

gui, font, s10, Verdana ; 设置为 Verdana 字体，大小10号

若省略最后的两个参数，则将字体、颜色、大小，设置 为系统默认的样式。
FontName 可以是任意字体的名字，如字体列表中的一个。如果 FontName 参 数被忽略，或是系统中不存在，则设置为之前所设置的字体样式（如果没有，则设置为系统默认的样式）。一些系统缺少所设置的首选字体，这种方式也可以让 窗体在不同的系统上具有相似的字体。例如，以下顺序的命令，Verdana 字体比 Arial 具有优先权，Arial 比 MS 字体具有优先权：

    gui, font,, MS sans serif
    gui, font,, Arial
    gui, font,, Verdana ; 首选字体

如果参数 Options 为空，则使用先前的字体属性。另外，你也可以指定下列关键字来设置字体的样式：

C: 后面可以跟颜色名称（参加颜色名称表）或使用 RGB 值，或这关键字 Default 来使用系统默认的颜色（大多数系统默认色为黑色）。例如：cRed, cFFFFAA, cDefault 注意：Buttons 不受自定义颜色的影响。如果单独创建一些带有颜色类型的控件时，它不会受到当前 C 关键字的影响！如：Gui, Add, Text, cRed, My Text

S: 设置大小 如: s12 表示字号为 12

W: 设置粗细, W后面可以跟一个 1 到 1000 之间的数字 （400 为标准，700 为粗体）例如: w600

同时在 Option 中也可以跟以下这些关键字：bold（表示粗 体）, italic （表示斜体）, strike （表示删除线）, underline（表示下划线），norm（表示正常粗细，并关闭斜体选项），这些关键字不会改变字体颜色和大 小。如果出现关键字 norm 则关闭所有的其他字体样式，如，指定 Option 为 norm italic 则设置字体为默认样式而忽略 italic 斜体属性。

想要设置多种样式的话，只用在每个样式之间加入空格即可，如：cBlue s12 bold

如果脚本创建了多窗口界面的话，每个窗口都会在他创建控件时，使用自己的“当前字体”。

另外，操作系统为用户提供了标准的系统对话框，可以让用户选择字体，颜色，图标等。这些对话框都可以通过调用 DllCall() 来创建，更多示例请参看 www.autohotkey.com/forum/topic17230.html

## Gui, Color [, WindowColor, ControlColor]

该命令是用来设置窗口或其控件的背景颜色。WindowColor 用来设置窗体的背景 颜色。ControlColor 用来设置当前窗口上的控件，或之后创建的控件的颜色（除了少数几个不支持自定义颜色的控件）。ControlColor 可 以定义 ListViews 和 TreeViews 的初始颜色，但之后如果使用 ControlColor 来改变他们的颜色则无效，在这 种 情况下，可以使用 GuiControl +BackgroundFF9977 来精确 定义并改变他们的颜色！

如果参数 WindowColor 和 ControlColor 为空，则保留当前颜色；否则可以指定为16种HTML颜色名称中的一个，或是一个6 位的RGB值（前缀 0x 可以忽略），或者指定为关键词 Default 设置为当前系统默认颜色。
例如，选项 WindowColor 和 ControlColor 的值可以是：Silver, FFFFAA, 0xFFFFAA, Default
如果不使用该命令，则窗口的背景颜色为系统的按钮的颜色，控件的背景颜色为系统默认颜色（一般为白色）。

菜单颜色和子菜单也可以改变颜色。例：Menu, MyMenuBar, Color, White

如果想使窗体的背景透明（只能在 Windows 2000/XP 或之后的系统中），可以使用 WinSet TransColor 命令。然而，如果你在使用该命令之前没有调用 "Gui, Color" 为窗体指定一个颜色，则窗口上的按钮也会变得透明。你可以事先通过设置窗体的颜色来解决这个问题。例：

    Gui, Color, EEAA99
    Gui +LastFound ; 指定 GUI 窗体为 last found window .
    WinSet, TransColor, EEAA99

你会发现以上代码可使窗体透明，但仍保留窗体 的边框及标题栏，想要去除他们，可以在调用窗体透明命令之前使用以下命令：
Gui -Caption ; 我们修改了第一个窗体, 如果要设置第二个窗体则可以写为 Gui,2:-Caption

如想了解该命令的更多介绍，请参见本页最后的 display (OSD) 示例

## Gui, Margin [, X, Y]

该命令用来设置当窗体上的控件没有指定相应的X和Y坐标时，控件自动排列时距离窗体边框的距离。X 为控件距离窗体左右边框的距离，单位为像素。Y 是距离窗体上下边框的距离。该命令同样会影响控件自动排列时彼此之间的水平和垂直间距。最后，当显示窗体 Gui Show 时边距是会被计算到窗体的大 小中去。（当窗体的大小没有明确指定时）

如果没有使用该命令，则当第一个控件在窗体上添加时，则窗体会根据控件的字体 font 来计算边距。（使用字体高度的 0.75 倍作为上下边距，字体高度的 1.25 倍作为左右边距）

虽然在添加控件的过程中有可能改变边距，但这只影响之后创建的控件，而不是已经存在的。如果X和Y都未指定，则保持边距一致。

## Gui, +/-Option1 +/-Option2 ...

该命令可以为窗口指定更多的选项，在 GUI 后面可以跟一个或多个选项。考虑到效率的原因，最好将所有的选项都写在一行里面，并且在窗体创建之前调用（也就是，在使用任何子命令如，Gui Add 前调用）

这个命令的效果是可以堆积的，也就是说，他只改变明确设置的选项，并保留其他没有改变的。

在选项前指定一个加号表明增加改选项，指定一个减号表明去除该效果，例如：

    Gui +Resize -MaximizeBox ; 改变默认窗体 default 的设置
    Gui 2:+Resize -MaximizeBox ; 改变第二个窗体的设置

Option 可以为以下选项：

AlwaysOnTop: 使窗体置顶，这个和 "WinSet AlwaysOnTop" 效果相 同。

Border: 在窗体的周围增加一个细边框。该选项不经常用。

Caption (默认具有改选项): 为窗体增加标题栏，并且填充窗体的边距。如果想使用 WinSet TransColor 命令使窗体透明，请在调用 TransColor 命令后再使用该命令去除标题栏。

Delimiter: 当 调用 Gui Add ，GuiControl ，Gui Submit ，GuiControlGet 命令后，当与控件关联的变量中可能包含有多个数据时，包含在变量里的数据会以 (|) 符号隔开。该命令可以用来改变分隔数据的分隔符 (|) 为其他的符号。在关键词 Delimiter 后加一个字符，来指定该字符为窗体数据的分隔符，如：Gui +Delimiter`n 表示用换行符（`n）来分隔变量中的数据。这对于一个连续部分的数据是非常适合的！同样，Gui +Delimiter| 可以重新使用 (|) 来作为数据分隔符。如果想使用“空格”或“制表符”来作为分隔符，可 以写为：Gui +DelimiterSpace 或 Gui +DelimiterTab 。 一旦数据分隔符改变，他将影响到在当前窗体上正在运行以及之后运行的 线 程。

Disabled: 使窗口不可以用，阻止用户和控件的交互。该命令常用于包含有其他子窗体的窗体（参见 Owner ）

Label [v1.0.44.09+]: 为窗体的特定标签指定一个自定义的名称。如 Gui 2:+LabelMyGui 表 示使用 MyGuiClose 和 MyGuiSize 标签（如果存在）来替代默认的 2GuiClose 和 2GuiSize 标签。也就是说，在这些 特殊标签 中，默认的字符串“2Gui”被“ MyGui”替换。这样可以让多窗体的GUI使用一个共同的标签（可以根据脚本内置变量 A_Gui 来判断是那个窗体调用了该标签）。

LastFound: 设置窗体为 last found window （虽然这对于界 面线程有些多余， 因为他自动设置为 Last Found），该命令允许如 WinSet 命令对该窗口进行操作，即使该窗口为隐藏状态（可以不用 DetectHiddenWindows 命令来设置）。这对于在窗口还没有显示之前，改变他的属性是非常有用的。例如：

    Gui +LastFound
    WinSet, TransColor, %CustomColor% 150
    Gui Show

LastFoundExist [v1.0.43.09+]: LastFoundExist不同于其他选项，是唯一一个不能和其他选项同时出现的选项。+LastFoundExist 和 +LastFound 的效果一样，除了如果窗口不存在则不创建窗口。该选项 主要是判断指定窗口是否已经存在！例如：

    Gui 2:+LastFoundExist
    IfWinExist
     MsgBox 窗体 #2 已经存在

MaximizeBox: 使标题栏上的最大化按钮可 用，Resize 也同时包含该效果。

MinimizeBox (默认): 使标题栏上的最小化按钮可用。

MinSize and MaxSize [v1.0.44.13+]: 当用户拖动窗体的边框，限定窗口的最小尺寸和最大尺寸。在关键字 MinSize 或 MaxSiz 后面没有任何数字，则使用当前窗体的尺寸作为最小或最大限制（如果当前还没有窗口的尺寸，则以窗体第一次显示时的大小为限制尺寸！）。也可以在后面加上 “宽带X高度”例如：Gui +Resize +MinSize640x480 以像素为单位指定客户区（去除标题栏，边框以及窗口菜单）的大小。

如果省略宽度或高度表示不改变高度和宽度，如 +MinSize640x 或 +MinSizex480 ，此外，可以使用窗口的当前尺寸，调用多次 Min/MaxSize 来指定窗口的大小。例如，+MinSize +MinSize640x 表示使用窗口当前的高度，并限定窗口最小宽度为640。

如果 和 选项没有使用，则使用操作系统默认的大小（同样 Gui -MinSize -MaxSize 也可以使窗体返回默认大小）。
注意：窗体必须具有 +Resize 选项，以便用户 可以调整窗体的大小。

OwnDialogs: 命令 Gui +OwnDialogs 可以指定窗体上的每个线程（例如 ButtonOK 子过程）为子窗体，可以使窗体上激活的如 MsgBox, InputBox, FileSelectFile, 和 FileSelectFolder 对话框为当前窗体的子窗体。这些对话框都为模式对话框，也就是说用户必须先关闭这些对话框才能和他们的父窗体进行交换。相比之下，ToolTip, Progress, 和 SplashImage 窗体即使设置了为子窗体，他们仍为非模式，他们仅仅只是显示在其父窗体之上。不管是模式或是非模式，当起对话框销毁 destroyed 时，其子窗体会自动销毁。

该命令不需要写在代码行的末尾，因为他不会影响到其他的线程 。但如果一个线程需要显示两个对话框，或是想要取消 owned 设置，可以通过命令 Gui -OwnDialogs 来关闭子窗体设置。

如果在 Gui 后面没有指定一个数字，如使用命令 Gui +OwnDialogs 而不是 Gui 2:+OwnDialogs ，则对默认窗体进行设置！

Owner: 使用 +owner 选项可以设置该窗体为其他窗体的子窗体（一旦窗体创建，选项 -owner 则没有效果）。一个子窗体不会在任务栏中显示按钮，并且子窗体永远显示在其父窗体之上。当父窗体销毁时，子窗体自动销毁。使用选项 +Owner 时，确保其父窗体已经创建（也就是说要在命令 Gui Add 之后使用该选项）。以下有两种使用 +owner 选项的示例：

    gui, 2:+owner1 ; 设置窗体#2 为窗体#1 的子窗体。
    gui, 2:+owner ; 设置窗体#2 为脚本主窗体 script's main window 的子窗体，并且不显示任务栏按钮。

如果在子窗体显示时需要防止用户和父窗体进行交互，可以通过 Gui +Disabled 命令来使父窗体无效。当子窗体取消或销毁前，调用 Gui -Disabled 命令，则当子窗体销毁后，父窗体自动恢复为有效。

Resize: 指定该选项则允许用户改变窗体的大小，并且使标题栏上的最大化按钮可用。如果想避免，可以指定 +Resize -MaximizeBox 来取消最大化按钮。

SysMenu (默认): 指定 -SysMenu 表示删除系统菜单和点击窗体左上角的图片所弹出的菜单。同时也删除标题栏上的最小化最大化按钮。

Theme: 指定 -Theme ，则之后所有创建的控件将以 WindowsXP 经典主题的样式显示。如果想让创建的控件遵循当前的系统主题，则指定 +Theme 即可。注意：该选项对 WindowsXP 之前的系统无效。当前 XP 的主题为经典样式时，该选项无效。对于个别的控件，也可以在控件的 options 中指定 +Theme 或 -Theme 来改变其样式。

ToolWindow: 使标题栏变成细长状，同时不显示任务栏按钮。

(未命名样式): 在表示样式的10进制或16进制的数字 style number 前，增加加号或减号，表示添加或删除此样式。

(未命名扩展样式): 在表示样式的10进制或16进制数字前加字母 E 表示扩展样式，可以通过加号和减号添加和删除该扩展样式。例如+E0x40000 表示增加 WS_EX_APPWINDOW 样式，该样式可以提供任务栏按钮。虽然这里没有给出其他扩展样式的代码，但可以通过在 www.microsoft.com 搜索 WS_EX_APPWINDOW 得到相关的文档说明。

## Gui, Menu [, MenuName]

为窗体增加一个菜单栏。使用 Menu 命令创建一个普通的菜单，再调用此命令。例：

    Menu, FileMenu, Add, &Open Ctrl+O, MenuFileOpen ; 关于 Ctrl+O 见下面说明
    Menu, FileMenu, Add, E&xit, MenuHandler
    Menu, HelpMenu, Add, &About, MenuHandler
    Menu, MyMenuBar, Add, &File, :FileMenu ; 添加以上创建的两个菜单
    Menu, MyMenuBar, Add, &Help, :HelpMenu
    Gui, Menu, MyMenuBar

注意第一行中，&Open 后面的 Ctrl+O（中用制表符分开）。这是一个热键的标识，用户可以通过该快捷键选择相应的菜单。如果启用该功能，请使用以下上下文热键：

    #IfWinActive GUI Window's Title ahk_class AutoHotkeyGUI
    ^o:: ; 热键 Ctrl+O
    MenuFileOpen:
    Gui +OwnDialogs ; 在用户回到主界面前必须对 FileSelectFile 对话框作出响应。
    FileSelectFile, SelectedFile
    MsgBox 你选择的文件：%SelectedFile%.
    return

    ; 以下部分代码仅在 Windows 95/98/Me 系统上需要
    #IfWinActive
    $^o::Send ^o

如果想要删除窗体的菜单，使用 Gui Menu 命令（后一个参数留空）

一旦菜单被设置为窗体的菜单栏，就不能应用于弹出菜单或是其他子菜单。这是因为菜单栏其内部是一种不同的格式（但这只是限定于菜单 栏本身，而对其子菜单没有影响）。如果你非要实现，你可以先创建一个与菜单栏完全相同的另一个菜单，这样就可以作为其他的用途。

如果对一个正在用于窗体的菜单，使用类似 Delete 和 DeleteAll 的菜单子命令，会无效并且会弹出错误的对话框（除非使用 UseErrorLevel 来避免）。如果想改变窗体菜单可使用以下步骤：1) 先通过 Gui Menu (省略菜单名) 来使菜单和窗体分离; 2) 改变菜单; 3) 通过 Gui, Menu, MyMenuBar 重现将菜单附加到窗体;

## Gui, Hide / Minimize / Maximize / Restore

Gui Hide 等同 Gui Cancel 。其他三个命令在不隐藏窗体的条件下对窗体进行最小化、最大化、恢复操作。如果窗体不存在--可能由于调用 Gui Destroy 而使窗体销毁，则改命令无效。

## Gui, Flash [, Off]

使窗体在任务栏上的按钮闪烁。通过改变窗体的标题栏和任务栏上按钮的颜色来完成该效果。如果选项后加关键字 OFF 则标题栏和任务栏按钮恢复其原来的颜色（但实际上取决与操作系统的版本）。下面的例子中，窗体将闪烁三次，因为每一对闪烁都会使其回复原来的外观：

    Loop 6
    {
     Gui Flash
     Sleep 500 ; 该变量比较敏感，改变他它可能会引起异常
    }

## Gui, 2:Default

改变当前线程默认的窗 体标识，该标识不能指定为 GuiControl, GuiControlGet,和窗体命令本 身。以下语句将默认窗体标识被改变为 2 ：Gui 2:Default 参考 thread's default window 了解关于默认窗体的更多信息。

## 通过SmartGUI创建窗体布局

虽然在下一段详细描述了简单的界面布局选项，但你会发现使用 Rajat 的 SmartGUI 来创建则更为简单。由于它完全的可视化可以让你所见即所得。 SmartGUI 是免费的，可以在 www.autohotkey.com/docs/SmartGUI/ 下载。

## 控件的位置和大小

如果控件的大小或坐标没有指定，则控件的位置会以上一个控件的位置和大小自动的进行排列，控件的大小则由控件的类型和内容决定。

同时也支持下列选项：

R: 指定文本有多少行（后面可以加小数，如 R2.5）。使用 R 通常比 使用 H（高度）更加合适。如果同时指定了 R 和 H选项，则 R 具 有更高的优先级。对于组合框 GroupBox，这个设置将设置可以容纳多少个控件。对于 DropDownLists, ComboBoxes, and ListBoxes,这个设置在控件的列表内显示多少个列表项目（但是在 XP 及之后的系统中，推荐省略 DropDownList 和 ComboBox 控件的 R 和 H 选 项，这样弹出列表框会自动设置为系统桌面的高度）。R 对于其他的类型的控件，表示在控件 内，文字可以显示多少行。

W: 宽度，单位像素。如果省略该选项，宽度则根据控件的内容和类型进行计算。根据控件的类型默认的宽度定义如下:
属性页控件：30倍的当前字体的大小，加上 3 倍的边距 X-margin
垂直进度条：2倍的当前字体大小。
水平进度条，水平滑动条，下拉列表, ComboBoxes, ListBoxes, GroupBoxes, Edits, and Hotkeys：15倍的当前字体的大小（ GroupBoxes 为 18 以便能够显示边距）。

H: 高度，单位像素。H 和 R 选项如果省略，DropDownLists, ComboBoxes, ListBoxes,和多行 Edit 控件默认为 3 行；GroupBoxes 默认为 2 行；垂直滑动条和进度条默认为 5 行；水平滑动条默认为 30 像素（除了指定了他的厚度）；水平进度条默认高度为字体的2倍大小；热键控件默认为 1 行；Tab 控件默认为 10 行。对于其他类型控件，其高度由他们所包含的内容所决定。注意，对于 DropDownLists 和 ComboBoxes 控件， H 表示为控件下拉列表部分的高度（即使高度设为很小，下拉列表也会至少显示一个列表项目）。同样，对于所有控件，设定选项 R 通常比设置 H 更有效，这样可以有效防止控件显示字体不完 整的问题。

wp+n, hp+n, wp-n, hp-n (其中 n 可为任意数字) 该选项可用于设置控件的高和宽等于之前的控件，加号和减号可以进行调整。例如 wp 表示设置控件的宽度和之前的一样，wp-50 则表示设置为之前宽度减去 50 个像素。

X: 控件的X坐标，例如指定 "x0 y0" 表示设置控件位置是客户区的左上角，（客户区不包括标题栏和菜单栏）。如果 X 忽略而 Y 未忽略，则控件的X坐标等于上一个控件的左边的位置。可以 理解为该控件与上一个控件在一行。

Y: 控件的Y坐标，如果省略 Y 指定 X ，则控件将置于上一个控件下方，也可理解为与之前的在一列中。

如果 X, Y 其中一个被省略，则窗口会根据之前的控件或字体自动布局。相比之下，如果你指定了每个控件的详细坐标，你需要手动调整所有控件的坐标，来使他们对齐。

如果 X, Y 都被省略，则使用标准的填充间距将控件置于上一个控件的下方。

在 X 和 Y, 选项后跟一个加号表示增加控件的相对位置，表示控件相对于上一个控件的右端和底端的距离。例如，指定 Y+10 表示控件的Y坐标距离上个控件的右端为10个像素，而不是使用标准的填充距离。类似，指定 X+10 表示在控件的X坐标距离上一个控件的距离为10个像素。对于负数如 X-10 这样的写法是用来表示设置控件的绝对位置。所以指定负数的写法是在负号之前再加一个正号。例如： X+-10

xp+n, yp+n, xp-n, yp-n (其中 n 为任意数字) 该选项用于设置控件的位置为以上一个控件的左上端为0点的坐标内。该选项多用于 GroupBox 控件以方便封装控件。

xm 和 ym 表示把控件放置在窗体边框的最左边和最上边（可以在后面加上正号或符号再加数字）。指定 ym而忽略X坐标，控件则被放置在最上面并且在所有之前创建控件的右边，可是看作为是重新开始的新的一列。反之亦然。

xs 和 ys: 他们与 xm 和 ym 类似，区别在于相对坐标是相对于上一个具有关键字 Section （Section 表示之后创建的控件为一个新的区域）的控件来说的（第一个控件被视为一个新的区域，即使他没有指定关键字 Section）。指定 ys 而省略任何X坐标，控件将被放置于上一个控件的Y坐标，切在之前最近创建的具有具有 Section 选项控件的右边，这可以理解为控件被放置于上一个控件区域的右边一列。例如：

    gui, add, edit, w600 ; 在窗体的顶部增加一个宽度适当的 Edit 控件
    gui, add, text, section, First Name: ; 保存当前控件的位置并且新定义一个区域
    gui, add, text,, Last Name:
    gui, add, edit, ys ; 在该区域创建新的一列
    gui, add, edit
    gui, show

反过来 (指定 xs 而省略Y坐标) 是一样的。

xs 和 ys 后跟正号或负号再加上一个数字，该选项为可选项。他是与关键词 Section 一同使用的，表示使用之前定义的区域并且为只有创建的控件定义一个新区域。

## 储存和响应用户的输入

V: 要使一个控件和一个变量相关联。在字母 V 后面加上变量名，该变量将是全局变量（或是引用类型变量，或一个静态变量）。例如，指定 vMyEdit;则表示当调用提交命令 Gui Submit 后，将控件的内容保存到变量 MyEdit 中。可能控件是不可输入型变量，如 Text 控件或 GroupBox 控件，但与之关联的变量仍可以用于GuiControl, GuiControlGet, 和 A_GuiControl 命令。则这些命令中可以直接用控件的关联变量名替代控件的唯一标识。注意：Gui Submit 不会改变非输入型控件的关联变量，如 Text 和 GroupBox 控件，也不会记录其片段内容（如 ListView 和 TreeView 控件）。

G: 字母G后面加上标签名，表示当当用户点击或改变一个变量，脚本会自动跳转到关联的子过程。gCancel 可以表示 Gui Cancel 事件运行的子过程（如果脚本中存在一个 "Cancel" 标签，则会调用该子过程），子过程可能使用以下内置变量： A_Gui, A_GuiControl, A_GuiEvent,和 A_EventInfo

## 控件：一般样式以及其他选项

注意：如果省略前面的符号，则默认为加号；例如，Wra 就等于 +Wrap 而 -Wrap 则表示去除自动换行属性。

AltSubmit: 在提交后改变控件关联变量的值w为选项的顺序而不是选项名称。对于窗体上的 DropDownList, ComboBox, 和 ListBox 控件，在使用 Gui Submit 命令后可将用户选择的选项储存为该项目的位置而不是该选项的名称。如果没有选择项目，对于 ComboBox 将储存编辑框中的文字；对于 DropDownList 或 ListBox 则输出变量为 空。注意：AltSubmit 同时也影响 GuiControlGet 命令的输出值。

C: 文字的颜色（对于 buttons 控件无效）。在字母 C 后面加上一个颜色的名称（可参考颜色名称表） 或是个一个RGB值（0x前缀可省略）。例如： cRed, cFF2211, c0xFF2211, cDefault

Disabled: 使一个输入型的控件处于灰色禁用状态，这样可以防止用户的焦点和输入。使用 "GuiControl Enable" 命令重新使控件为可用。注意：可添加 ReadOnly 选项，设置 Edit 控件为只读。同样，在 Disable 后面加上 0 或 1 表示可用和禁用。也就是说 Disabled 和 Disabled %变量% 是一样的。

Hidden: 使控件创建时不可见。使用 "GuiControl Show" 可使其显示，Hidden 后可加上 0 或 1 表示可见和隐藏。也就是说Hidden 和 Hidden%变量% 相同。

Left: 使控件上可见文字部分左对齐。

Right: 使控件上可见文字部分右对其。对于 checkboxes 和 radio buttons 控件，该选项会使选择框放在文字的右边而不是左边。

Center: 使控件上可见文字部分居中对齐。

Section: 创建一个新的控件区域，并且保存该控件的坐标。之后创建的具有 xs 和 ys 选项控件则会以该坐标作为控件坐标的0点，可参考上文描述。

Tabstop: 当用户使用 Tab 键切换焦点控件时，可跳过输入型控件。

Wrap: 可以使控件中的内容自动换行。在所有类型的控件中加入 Wrap 选项使其自动换行，使用 -Wrap 禁用该功能。

VScroll: 如果该控件支持，为该控件提供一个垂直的滚动条。

HScroll: 如果改控件支持，为该控件提供一个水平的滚动条。只有 ListBox 支持该选项。水平滚动条的宽度默认为 ListBox 宽度的3倍。如果想要指定不同的宽度，在 HScroll后加上需要指定的宽度即可。例如 HScroll500 表示在 ListBox 中加入一个宽度为 500 像素的水平滚动条。但，如果指定的宽度比 ListBox 的宽度小，则滚动条则不会显示（但是要在窗体创建后随后再添加滚动条，只能使用 GuiControl, +HScroll500, MyScrollBar, 来添加！）。

## 控件：特殊样式及其他选项

BackgroundTrans: 使用透明的背景，允许任何在一个 Text, Picture, 或 GroupBox 控件之下的控件也可以正常显示。例如，一个透明的 Text 控件显示在一个 Picture 控件之上让文字看起来好像是图片的一部分。可以使用 "GuiControl +background" 来移除该文字。参考图 片控件的提交了解更多关于图片透明的信息。已知的局限性：背景透明选项不能够正确的应用于含有 ListView 的 Tab 控件中。

-Background (减去背景): 使用标准的背景颜色而不是用"Gui Color"命令来设置的颜色。这个经常被用于设置 Tab 控件单独的标准颜色。可以通过 "GuiControl +background" 命令来移除该效果。

Border: 为控件添加一个稍细的边沿。大多数控件不需要设置该选项，因为他们本身就提供了明确的类型边沿。当向一个已有控件添加一个边沿，该控件的高和宽增加 1 个像素。

Hwnd 输出变量 [v1.0.46.01+]: 当使用 Gui Add 时，该选项会保存新建控件的句柄（HWND）到 输出变量 中。例如：Gui, Add, Edit, vMyEdit HwndMyEditHwnd (如果是在函数内部, MyEditHwnd 将视为一个函数动态变量)。 一个控件的句柄经常被使用于 PostMessage, SendMessage, 和 DllCall。也可以直接用于ahk_id WinTitle (即使在指定了 DetectHiddenWindows 为关闭的情况下也可以使用)。如 果设置了子窗口，父窗口的句柄可以通过 Gui 2:+LastFoundExist 跟 WinExist() 得到。

Theme: 该选项可以忽略窗体当前的主题设置。参见 Gui +/-Theme 了解更多信息。

(未命名样式): 在一个代表样式的十六进制的样式数字前加一个正号或负号，来表示增加或去除改样 式。

(未命名扩展样式): 在一个代表扩展样式的十六进制数字前面加一个字母 E 再添加正号或负号来表示增加或去除该扩展样式。如果前面的符号被省略则默认为正号。例如，E0x200 表示添加 WS_EX_CLIENTEDGE 样式。它可以为图片控件或其他控件提供一个下沉的边沿样式。尽管其他的样式没有在本帮助文档中给出，但你可以在 www.microsoft.com 查找 WS_EX_CLIENTEDGE 得到更多信息。

## Window Events 窗体事件

如果在脚本中存在以下标签（子过程），则将自动与对应的窗体事件相关联：

GuiClose: 当窗口被以下事件关闭后会自动调用该子过程：点击标题栏上的关闭按钮，在窗体的系统菜单上选择“关闭& rdquo;，用 WinClose 命令关闭窗体。如果该标签不存在，关闭窗体后仅仅是将窗体隐藏，与 Gui Cancel 的效果一样。该命令最常用的就是在窗体关闭后退出脚本，代码如下：

    GuiClose:
    ExitApp

GuiEscape: 当窗体在激活状态时，用户点击了 ESC 键，会调用改子过程。如果该标签不存在，则点击ESC后无效果。局限性：如果在窗体中的第一个控件被禁用（可能与控件的类型有关），则 GuiEscape 标签不会运行。但有一些情况可以产生这个效果。

GuiSize: 当用户调整大小时、最大化、最小化、或者恢复时调用该子过程。内建的变量将储存新的窗体客户区大小（区域包括标题栏、菜单栏、窗体边框）。A_EventInfo 和 ErrorLevel 包含以下一种数字：

0: 窗体恢复大小，或者用户拖拽窗体的边沿
1: 窗体为最小化
2: 窗体为最大化

当用户改变窗体大小时，会相应该事件，你可以通过 GuiSize 来调整控件的位置及大小来适应窗体的大小。该功能可以通过 #Include 加载 Titan的 Anchor脚本

GuiContextMenu: 当用户在窗体上（除去标题栏及菜单栏）鼠标右击或点击 Apps 按键或 Shift+F10 时，将调用改子过程。不同于其他窗体标签，GuiContextMenu 可以有多于一个的线程。以下内置变量可以在该标签中使用：

1. A_GuiControl, 包含收到事件消息的控件的文字或变量名（如 果没有则为空）。
2. A_EventInfo: 当右键点击到一个 ListBox, ListView, 或 TreeView 时（可以通过A_GuiControl变量得到），A_EventInfo 表示控件中的哪个项目被选中：
   ListBox 或 ListView: A_EventInfo 为当前具有焦点的行号（如果没有则为0）。
   TreeView: 对于右击，A_EventInfo 表示被点击项目的ID号（如果用户没有点击到项目上则为0）。对于 AppsKey 和 Shift-F10 ， A_EventInfo 表示当前选中项目的ID号。
3. A_GuiX 和 A_GuiY,表示菜单显示的X和Y坐标（例如，Menu, MyContext, Show, %A_GuiX%, %A_GuiY%）以窗口的左上角为坐标0点。
4. A_GuiEvent,如果用户点击右击，则 A_GuiEvent 为 RightClick 字符，如果用户点击 AppsKey或 Shift+F10，则 A_GuiEvent 为 Normal 字符。

注意: 由于 Edit 和 MonthCal 控件有他们自己的右键菜单，所以右击在这些控件中不会调用 GuiContextMenu 子过程。

GuiDropFiles: 当拖拽文件或文件夹到窗体上时，则调用该子过程（但如果该子过程已经在运行，则拖拽事件将忽略）。以下内置变量可用。

1. A_GuiControl, 当用户拖拽文件到控件上时，该变量保存有控件的变量名或文字（如果没有则为空）
2. A_EventInfo 和 ErrorLevel, 保存用户拖拽的文件数量
3. A_GuiX 和 A_GuiY, 保存拖拽的x和y坐标（相对于窗体，以左上角为零点）
4. A_GuiEvent, 包含拖拽文件的名称，每个文件末尾以换行符(`n)结束。

要分别获取每个文件的名称，可以使用 parsing loop 命令，例如：

    ; 示例 #1:
    Loop, parse, A_GuiEvent, `n
    {
    MsgBox, 4,, File number %A_Index% is:`n%A_LoopField%.`n`nContinue?
    IfMsgBox, No, Break
    }
    ; 示例 #2: 只想获取第一个文件的文件名
    Loop, parse, A_GuiEvent, `n
    {
    FirstFile = %A_LoopField%
    Break
    }
    ; 示例 #3: 把文件按照字母顺序排列
    FileList = %A_GuiEvent%
    Sort, FileList
    Loop, parse, FileList, `n
    MsgBox File number %A_Index% is:`n%A_LoopField%.

如想临时关闭窗口的拖拽功能，可通过 Gui -E0x10 将窗体的 WS_EX_ACCEPTFILES 样式移除。恢复拖拽使用 use Gui +E0x10

检测和响应其他的事件:其他的窗体事件可以通过 OnMessage() 来检测和响应。例如 ，当用户移动鼠标到相应的控件上时，脚本可以通过 ToolTip 来显示相关的帮助，详细信息可查看这个例子：GUI ToolTip example

## 创 建多窗体界面

对于多于一个窗体的界面，在第N个窗体中，会使用特定的前缀来区分以上提到的特殊标签。如，2GuiEscape 和 2GuiClose 是第二个窗体的默认标签。如果要使用自定义标签，请参考 Gui +Label

每一个脚本可以同时创建 99 个窗体。若要对非默认窗体进行操作，可在逗号后面加上窗体序号，例如：

    Gui, 2:Add, Text,, Text for about-box.
    Gui, 2:Show

Gui 2:Default 若该命令调用后，则可以不要写 "2:" 前缀，因为已经设置为窗体 #2 为默认的窗体

脚本的性能会随着窗体数量的增多而下降。

## 界面的事件、线程、和子过程

一个窗体的线程用来执 行窗体的动作。窗体的动作包括：选择窗体上的菜单， 或触发了一个 g-labels（如点击了一个按 钮）。

一个界面线程的默认窗体数目是该窗体能够激活的线程数目，而非界面线程则默认为一个线程。

每当一个界面线程启 动，窗体本身被视为该线程最后发现的窗口 。这允许如 WinMove, WinHide, WinSet, WinSetTitle, 和 ControlGetFocus 这些命令对脚本创建的窗体操作时，可以省略 WinTitle 和 WinText （即使窗体处于隐藏状态）。

如果点击控件的时候，其对应的 g-label 已经由于之前的点击而正在运行，则当前的点击没有效果，所产生的事件也将丢弃。如果想要防止这种情况发生，可以在子过程的第一行声明 Critical（这样会延时热键点击等其他线程的启动）。

内置变量 A_Gui 和 A_GuiControl 分别表示窗体的序号，和当前运行线程操作的控件 ID。可以点击链接查看详细信息。

如果想要让多个事件运行同一个子过程，可以在子过程上方连续写下事件标签即可，如：

    GuiEscape:
    GuiClose:
    ButtonCancel:
    ExitApp ; 以上的所有标签都会执行该语句

所有的界面线程会以脚本的默认设置启动，如发送模式SendMode。这些默认的设置可以在自动运行片段来改变。

## 键盘导航

一个界面窗体可以通过 TAB 键来使焦点切换到下一个控件（如果控件去除了 Tabstop 样式，则会跳过该控件）。导航的顺序则是由控件添加的顺序所决定。当一个窗体第一次显示时，可输入的控件默认具有 Tabstop 样式（大多数控件默认具有该样式）以便能够通过 Tab 键来进行控件焦点的切换。

控件可以添加字符 (&) 来创建该控件的快捷键，同时在控件的名称上会出现一个下划线（取决于系统设置）。用户可以通过 ALT + 相应的字母来完成点击的功能。对于 buttons, checkboxes, 和 radio buttons 控件，点击快捷键与点击该控件效果相同。对于 GroupBoxes 控件，点击快捷键则会把焦点自动跳转到 GroupBoxes 之后创建的第一个具有 tabstop 样式的控件上。然而如果有多个控件具有相同的快捷键时，点击该快捷键会把轮流点击或激活这些控件。

如果想在控件中显示 & 地址符，可以连续输入两个 & 来表示，如：Save && Exit

## 窗体外观

当一个窗体创建后，他使用托盘图标作为窗体图标。如果需要不同的图标，可以在创建窗体前改变托盘图标。例如：Menu, Tray, Icon, MyIcon.ico 。 他还可以有不同尺寸的图标（大图标可以用来显示在 alt-tab 菜单中）。这个功能可以通过 DllCall 和 SendMessage 来完成；例如：

    hIcon32 := DllCall("LoadImage", uint, 0
     , str, "My Icon.ico" ; 图标文件，该文件可以包含多尺寸的图标
    , uint, 1 ; 图像的类型: IMAGE_ICON
    , int, 32, int, 32 ; 图像的高度和宽度，可以帮助 LoadImage 来确定那个是最佳尺寸。
    , uint, 0x10) ; 标志: LR_LOADFROMFILE
    Gui +LastFound
    SendMessage, 0x80, 1, hIcon32 ; 0x80 是 WM_SETICON; 1 表示 ICON_BIG ， 0 表示 ICON_SMALL).
    Gui Show

由于操作系统的限制，在WindowsXP 及以上版本中，Checkboxes, Radio buttons, 和 GroupBoxes 使用非默认颜色时，他们将变为经典样式。

相关主题: window's margin.

## 概述

可使用 GuiControl 和 GuiControlGet 来操作窗体上的每个控件。

每个窗体可以包含 11,000 个控件。但当控件超过 5000 个时，请谨慎使用，这可能会因为系统的不稳定产生不确定的控件类型。

任一脚本如果包含了窗体命令，则脚本会自动永久运行 persistent（即 使窗体命令没有执行过）。同时默认以只允许一个实例运行，不过用户可以通过 #SingleInstance 来设定。

## 相关命令

GuiControl, GuiControlGet, Menu, Control Types, ListView, TreeView, Control, ControlGet, SplashImage, MsgBox, FileSelectFile, FileSelectFolder

## 相关示例

    ; 示例: 完成一个输出文字的窗口：
    Gui, +AlwaysOnTop +Disabled -SysMenu +Owner ; +Owner 避免出现任务栏窗口
    Gui, Add, Text,, AHKBBS.CN
    Gui, Show, NoActivate, Title of Window ; NoActivate 选项可以不改变当前激活窗口。

    ; 示例: 使用 input-box 的简单例子，要求用户输入姓和名:
    Gui, Add, Text,, 姓:
    Gui, Add, Text,, 名:
    Gui, Add, Edit, vFirstName ym ; The ym option starts a new column of controls.
    Gui, Add, Edit, vLastName
    Gui, Add, Button, default, OK ; 如果标签 ButtonOK 存在，则当用户点击 OK 按钮时会自动调用该标签。
    Gui, Show,, 简单的输入框例子
    return ; 自动运行片段结束。脚本保持空闲直到用户对窗口操作。
    GuiClose:
    ButtonOK:
    Gui, Submit ; 保存用户输入后每个控件的数据
    MsgBox 你输入了 "%FirstName% %LastName%".
    ExitApp

    ; 示例: 属性页例子
    Gui, Add, Tab2,, 第一页|第二页|第三页 ; 该控件需要 v1.0.47.05 版本
    Gui, Add, Checkbox, vMyCheckbox, 一个复选框
    Gui, Tab, 2
    Gui, Add, Radio, vMyRadio, 单选框1
    Gui, Add, Radio,, 单选框2
    Gui, Tab, 3
    Gui, Add, Edit, vMyEdit r5 ; r5 表示总共有5行
    Gui, Tab ; 表示之后创建的控件不属于属性页控件
    Gui, Add, Button, default xm, OK ; xm 表示把该控件显示在窗体的左下角
    Gui, Show
    return
    ButtonOK:
    GuiClose:
    GuiEscape:
    Gui, Submit ; 保存每个与控件相关联的变量
    MsgBox 你选择了:`n%MyCheckbox%`n%MyRadio%`n%MyEdit%
    ExitApp

    ; 示例: 用 ListBox 显示一个包含文件名的列表
    Gui, Add, Text,, 双击列表执行该文件，按 ESC 或关闭窗体退出程序
    Gui, Add, ListBox, vMyListBox gMyListBox w280 r10
    Gui, Add, Button,Default,Ok
    Loop, C:\*.* ; 可修改为你想要显示的文件夹以及文件通配符
    {
    GuiControl,, MyListBox, %A_LoopFileFullPath%
    }
    Gui, Show
    return
    MyListBox:
    if A_GuiEvent <> DoubleClick
    return
    ; 否则，用户双击列表中的项目，它和点击按钮的效果一样
    ; 如果 So fall through to the next label.
    ButtonOK:
    GuiControlGet, MyListBox ; 活动列表框中的选中项目
    MsgBox, 4,, 你想要运行下面的文件么 ?`n`n%MyListBox%
    IfMsgBox, No
    return
    ; 否则，运行该文件
    Run, %MyListBox%,, UseErrorLevel
    if ErrorLevel = ERROR
    MsgBox 不能够运行该文件。可能是找不到和该文件关联的程序
    return
    GuiClose:
    GuiEscape:
    ExitApp

    ; 示例: 当鼠标移动到控件上，显示帮助提示
    Gui, Add, Edit, vMyEdit
    MyEdit_TT := "这是一个为 MyEdit 控件显示的提示"
    Gui, Add, DropDownList, vMyDDL, Red|Green|Blue
    MyDDL_TT := "从下拉列表中选择一个颜色"
    Gui, Add, Checkbox, vMyCheck, 这个控件没有提示.
    Gui, Show
    OnMessage(0x200, "WM_MOUSEMOVE")
    return

    WM_MOUSEMOVE()
    {
     static CurrControl, PrevControl, _TT ; _TT 在下面的TooTip中用到
    CurrControl := A_GuiControl
    If (CurrControl <> PrevControl and not InStr(CurrControl, " "))
    {
    ToolTip ; 关闭之前的 tooltip.
    SetTimer, DisplayToolTip, 1000
    PrevControl := CurrControl
    }
    return
    DisplayToolTip:
    SetTimer, DisplayToolTip, Off
    ToolTip % %CurrControl%_TT ; 第一个百分号表示后面是一个表达式
    SetTimer, RemoveToolTip, 3000
    return
    RemoveToolTip:
    SetTimer, RemoveToolTip, Off
    ToolTip
    return
    }
    GuiClose:
    ExitApp

    ; 示例: 利用透明窗体进行屏幕显示 (OSD)
    CustomColor = EEAA99 ; 可以是任何 RGB 值，他将用于后面的透明设置
    Gui +LastFound +AlwaysOnTop -Caption +ToolWindow ; +ToolWindow 可以避免在任务栏显示按钮，并且不会出现在 alt-tab 菜单中
    Gui, Color, %CustomColor%
    Gui, Font, s32 ; 选择32号字体
    Gui, Add, Text, vMyText cLime, XXXXX YYYYY ; XX & YY 可以用来让窗体自动调整大小
    ; 使指定颜色的像素变得透明，并且使字体本身透明度为150
    WinSet, TransColor, %CustomColor% 150
    SetTimer, UpdateOSD, 200
    Gosub, UpdateOSD ; 使第一次更新立即运行，而不需要等待计时器来运行
    Gui, Show, x0 y400 NoActivate ; 不激活窗体避免改变当前激活的窗口
    return
    UpdateOSD:
    MouseGetPos, MouseX, MouseY
    GuiControl,, MyText, X%MouseX%, Y%MouseY%
    return

    ; 示例: 一个带背景图像的进度条
    Gui, Color, White
    Gui, Add, Picture, x0 y0 h350 w450, %A_WinDir%\system32\ntimage.gif
    Gui, Add, Button, Default xp+20 yp+250, Start the Bar Moving
    Gui, Add, Progress, vMyProgress w416
    Gui, Add, Text, vMyText wp ; wp 表示使用之前的宽度
    Gui, Show
    return
    ButtonStartTheBarMoving:
    Loop, %A_WinDir%\*.*
    {
    if A_Index > 100
    break
    GuiControl,, MyProgress, %A_Index%
    GuiControl,, MyText, %A_LoopFileName%
    Sleep 50
    }
    GuiControl,, MyText, Bar finished.
    return
    GuiClose:
    ExitApp

    ; 示例: 一个简单的图像浏览窗体
    Gui, +Resize
    Gui, Add, Button, default, &Load New Image
    Gui, Add, Radio, ym+5 x+10 vRadio checked, Load &actual size
    Gui, Add, Radio, ym+5 x+10, Load to &fit screen
    Gui, Add, Pic, xm vPic
    Gui, Show
    return
    ButtonLoadNewImage:
    FileSelectFile, file,,, Select an image:, Images (*.gif; *.jpg; *.bmp; *.png; *.tif; *.ico; *.cur; *.ani; *.exe; *.dll)
    if file =
    return
    Gui, Submit, NoHide ; 保存单选按钮的值
    if Radio = 1 ; 按照实际尺寸显示图片
    {
    Width = 0
    Height = 0
    }
    else ; 第二个选项: 按照屏幕的固定尺寸显示
    {
    Width := A_ScreenWidth - 28 ; 减去28为了足够的空间显示边框和内边沿
    Height = -1 ; 保持高宽比例
    }
    GuiControl,, Pic, *w%width% *h%height% %file% ; 加载图片
    Gui, Show, xCenter y0 AutoSize, %file% ; 调整窗口大小以适合图片尺寸
    return
    GuiClose:
    ExitApp

    ; 示例: 一个带菜单栏的文本编辑窗体
    ; 创建菜单栏
    Menu, FileMenu, Add, 新建文件 (&N), FileNew
    Menu, FileMenu, Add, 打开文件 (&O)..., FileOpen
    Menu, FileMenu, Add, 保存 (&S), FileSave
    Menu, FileMenu, Add, 另存为 (&A)..., FileSaveAs
    Menu, FileMenu, Add ; 增加一个分隔符
    Menu, FileMenu, Add, 退出 (&X), FileExit
    Menu, HelpMenu, Add, 关于 (&A), HelpAbout
    ; 把上面的菜单作为下面的子菜单
    Menu, MyMenuBar, Add, 文件 (&F), :FileMenu
    Menu, MyMenuBar, Add, 帮助 (&H), :HelpMenu
    ; 把上面的菜单作为窗体的菜单
    Gui, Menu, MyMenuBar
    ; 创建编辑框控件并显示在窗体上
    Gui, +Resize ; 使用户可以调整窗体大小
    Gui, Add, Edit, vMainEdit WantTab W600 R20
    Gui, Show,, Untitled
    CurrentFileName = ; 当前文件为空，表示没有选择文件
    return
    FileNew:
    GuiControl,, MainEdit ; 清空编辑框
    return
    FileOpen:
    Gui +OwnDialogs ; 强制用户在关闭选择文件对话框后才能使用主窗体
    FileSelectFile, SelectedFileName, 3,, Open File, Text Documents (*.txt)
    if SelectedFileName = ; 如果没有选择文件
    return
    Gosub FileRead
    return
    FileRead: ; 读取并调用用户选择的文件
    FileRead, MainEdit, %SelectedFileName% ; 把文件的内容读取到变量中
    if ErrorLevel
    {
    	MsgBox Could not open "%SelectedFileName%".
    	return
    }
    GuiControl,, MainEdit, %MainEdit% ; 在控件中显示文本
    CurrentFileName = %SelectedFileName%
    Gui, Show,, %CurrentFileName% ; 在标题栏中显示文件名
    return
    FileSave:
    if CurrentFileName = ; 如果没有选中文件，执行另存为
    Goto FileSaveAs
    Gosub SaveCurrentFile
    return
    FileSaveAs:
    Gui +OwnDialogs ; 强制用户在在关闭选择文件对话框后才能使用主窗体
    FileSelectFile, SelectedFileName, S16,, Save File, Text Documents (*.txt)
    if SelectedFileName = ; 用户没有选中文件
    return
    CurrentFileName = %SelectedFileName%
    Gosub SaveCurrentFile
    return
    SaveCurrentFile: ; 判断当前的文件不为空
    IfExist %CurrentFileName%
    {
    	FileDelete %CurrentFileName%
    	if ErrorLevel
    	{
    	MsgBox The attempt to overwrite "%CurrentFileName%" failed.
    	return
    	}
    }
    GuiControlGet, MainEdit ; 获取当前 Edit 控件中的内容
    FileAppend, %MainEdit%, %CurrentFileName% ; 保存当前的内容到文件
    ; 如果成功，在标题栏中显示文件名，与 FileSaveAs 相同
    Gui, Show,, %CurrentFileName%
    return
    HelpAbout:
    Gui, 2:+owner1 ; 设置窗体#1 的子窗体为 Abuot Box 即窗体#2
    Gui +Disabled ; 使主窗体无效
    Gui, 2:Add, Text,, 欢迎访问 AHKBBS.CN
    Gui, 2:Add, Button, Default, OK
    Gui, 2:Show
    return
    2ButtonOK: ; 该标签用于
    2GuiClose:
    2GuiEscape:
    Gui, 1:-Disabled ; 重新使主窗体有效，必须在下一步前执行改命令
    Gui Destroy ; 销毁关于对话框
    return
    GuiDropFiles: ; 使窗体支持拖拽
    Loop, parse, A_GuiEvent, `n
    {
    	SelectedFileName = %A_LoopField% ; 如果拖拽了多个文件的话，获取第一个文件
    	break
    }
    Gosub FileRead
    return
    GuiSize:
    if ErrorLevel = 1 ; 窗体是最小化状态则返回
    return
    ; 否则是用户在调整大小或最大化窗体，则调整Edit控件的大小
    NewWidth := A_GuiWidth - 20
    NewHeight := A_GuiHeight - 20
    GuiControl, Move, MainEdit, W%NewWidth% H%NewHeight%
    return
    FileExit: ; 用户从菜单中选择了 Exit
    GuiClose: ; 用户关闭了窗体
    ExitApp

翻译：BLooM.2 FantasyOnLine 2008年9月21日