GUI 概论

AutoIt 有能力创建简单的用户图形界面(GUI), GUI 由窗口和控件组成.

 

GUI 概念

GUI 由一或多个窗口组成, 每个窗口都包含一或多个控件.

GUI 靠 "事件驱动", 意味着你对事件作出的反应 - 如按钮点击.

你要花费大部分闲置时间等待事件发生 - 当事件发生时, 则根据事件执行相关操作!

您可以想象自己在门前等邮差 - 你坐在那里,直到有信被送进来为止.
这就是 GUI 的工作状态. 您等待的是邮差,而 GUI 则等待事件

当然,在 GUI 运行时您也可以选择要做的其它任务,比如使用 GUI 函数创建一个自动更新的动态的进度条,
同时还可执行其它复杂的任务.

 

GUI 控件

所有用户应该都对控件非常了解了, 在窗口上能被点击或进行其它交互的部分都是控件的一种.

AutoIt 可创建的控件类型有如下几种(您肯定已在其它 Windows 程序中见过它们了):

  • Label
纯文字控件(标签控件).
  • Button
按钮控件.
  • Input
单行编辑控件,可供输入文字.
  • Edit
多行编辑控件,可供输入文字.
  • Checkbox
复选框控件,可选中或取消选.
  • Radio
单选框控件, - 通常几个一组,每次只能激活/选中其中一个.
  • Combo
组合控件,带有下拉列表.
  • List
列表框控件.
  • Date
日期控件.
  • Pic
图片控件.
  • Icon
图标控件.
  • Progress
进度条控件.
  • Tab
标签页控件,包含多个标签.
  • UpDown
具有上下箭头的控件,具有调控功能.
  • Avi
显示 AVI 格式剪辑的控件.
  • Menu
位于窗口顶部的菜单控件.
  • ContextMenu
右键菜单控件.
  • TreeView
类似 Windows 文件资源管理器的树型视图控件.
  • Slider
类似 Windows 的音量调整控件.
  • ListView
单列显示项目信息的列表控件.
  • ListViewItem
多列显示项目信息的列表控件.
  • Graphic
图形控件 使用 GUICtrlSetGraphic 函数绘制图形.
  • Dummy
虚拟的用户控件.

 

下面是一个 GUI 示例, 它包含许多 AutoIt 支持的控件. 从中我们可以看到 AutoIt 确实可以创建内容非常丰富的 GUI!

 

控件是由 GUICtrlCreate... 类函数创建的. 在创建时函数会返回 控件ID .

关于控件 ID 有几个注意事项:

 

GUI 基本函数

下面这些是用于创建 GUI 的基本函数. 如果您已经准备好创建更高级的 GUI,则还有其它高级的函数.

函数名称 函数说明
GUICreate 创建一个窗口.
GUICtrlCreate... 创建窗口各种控件.
GUISetState 显示或隐藏窗口.
GUIGetMsg 查询 GUI, 检测是否有事件发生 (仅用于消息循环模式)
GUICtrlRead 读取控件的数据.
GUICtrlSetData 设置或修改控件的数据.
GUICtrlUpdate... 更改控件的各种选项 (颜色, 样式, 等等.)

 

在编写 GUI 脚本之前,需先将 #include <GUIConstantsEx.au3> 代码写到脚本开头位置.
该文件包含 GUI 的相关常数.

其他包含文件 包含创建 GUI 各种不同控件的相关常数.

 

下例先创建一个窗口, 把它命名为"您好,世界", 设置其长宽分别为200和100个象素.

当窗口被创建时它是隐藏的, 所以我们还要先把它给显示出来.

#include <GUIConstantsEx.au3>

GUICreate("您好,世界", 200, 100)
GUISetState(@SW_SHOW)
Sleep(2000)

 

运行上面的脚本您会看到出现一个窗口并在两秒后消失. 看来还不是很有意思哦...

那让我们尝试增加一些文字和一个"确定"按钮到窗口上吧!

我们把文字加到 30, 10 这个位置, 并把按钮放到 70, 50 这个位置,按钮宽度设为 60 个象素

#include <GUIConstantsEx.au3>

GUICreate("您好,世界", 200, 100)
GUICtrlCreateLabel("您好,世界! 你过得怎么样?", 30, 10)
GUICtrlCreateButton("确定", 70, 50, 60)
GUISetState(@SW_SHOW)
Sleep(2000)

 

好, 现在看来相当不错, 但是怎样使这个 GUI 能响应我们点击按钮的事件呢?

这时我们必须先决定究竟如何处理事件:

要么通过消息循环(MessageLoop);要么通过事件模式(OnEvent) 函数.

 

GUI 事件模式

如上所述有两个基本的 GUI 模式: 消息循环(MessageLoop)模式与事件(OnEvent)模式.

这两种模式是响应 GUI 事件的不同实现方式.

具体选择哪一种模式主要看您的个人喜好,并在一定程度上取决于创建的 GUI 类型,

只不过某些时候使用其中一个会比另外一个要好用些.

消息循环是默认的模式, 若要切换为 OnEvent 事件模式, 请使用 Opt("GUIOnEventMode", 1).

 

消息循环模式(Message-loop) (默认)

在消息循环模式下, 脚本大部分时间都在执行一个周期非常短的循环, 这个循环通知 GUI 使用GUIGetMsg 函数截获消息.

当某个事件发生时, GUIGetMsg 函数的返回值将显示事件的详细信息(如按钮点击, GUI 关闭, 等等.).

在此模式下, 只有频繁地使用 GUIGetMsg 函数时才有可能接收到事件,

因此您必须确保每秒时间内多次调用该函数,否则您的 GUI 将无法响应事件.

这一模式最适合用于那些以 GUI 为重点的脚本中, 并且您最关心的就是等待用户事件.

查看这里 了解关于 消息循环模式 更详细的解释.

 

事件模式(OnEvent)

在OnEvent模式下, 脚本并不需要频繁地要求 GUI 检查是否有任何事件发生(并根据返回信息处理事件),

而是仅当某个事件发生时, GUI 才临时性暂停脚本, 并调用一个用户预定义的函数来处理该事件.

例如, 假定用户点击了按钮1, 则 GUI 将暂停主脚本并调用某个预定义的用户函数来处理按钮1事件.

当该函数完成处理操作后才回到主脚本继续执行.这个模式比较类似 Visual Basic 的窗体方法.

这一模式最适合用于那些 GUI 处于次要地位,并且需要优先执行其它任务的的脚本中

查看这里 了解关于 事件模式 更详细的解释.

 

provider with jb51.net (unicode)