AHK Gui编程范式

AkiChase大约 2 分钟

介绍 Starter 中AHK Gui的编程范式,为使用Gui控件提供一个思路。

驱动方式

1. 事件驱动

传统的Gui编程是基于事件驱动

比如用户点击按钮、输入内容等事件触发回调,在回调中我们对需要改变的数据直接进行修改、对要需要改变的UI控件进行操作。

好处是简单粗暴,缺点也很明显,当某事件与很多控件、数据相关时,这个直接修改的代码写起来会非常痛苦,又臭又长。

2. 数据驱动

而数据驱动则是另一种思想:一切皆数据,我们的UI控件表现如此是因为我们的数据如此,当我们的数据修改后,UI界面就应该根据数据表现为新的状态。

缺点是代码写起来比较复杂,优点是对于复杂的事件回调,代码反而简洁许多。

ahk v2版本的新语法中支持了比较现代的classgettersetter,因此我们可以方便地使用数据驱动(相对v1版本)

数据驱动的关键是定义好数据(MVC中的Model)与视图(MVC中的View)的交互层(MVC中的Controller

由于 Starter 一开始也是使用事件驱动,后来才尝试改用数据驱动,因此没有很好的使用MVC规范,仅供参考

实现思路

  • 数据 -> UI:

用抽象的数据(AHK中称为动态属性)来实现。对抽象的数据进行修改可以触发抽象数据的setter,在其setter中修改真实数据(若关联到其他数据,也可以修改其他数据的抽象数据,进一步套娃触发),并且对当前数据直接关联的UI控件进行修改。如此,实现了改变数据后UI也随之变动。

  • UI -> 数据:

为UI控件设置事件回调OnEvent。用户的交互信息,如点击、输入内容等可以触发相应的事件回调,事件回调中修改对应抽象数据的值为当前控件的值(或其他值)。

  • 注意事项

因为代码层面上对AHK控件修改不会触发其OnEvent,所以用户操作引起UI -> 数据 -> UI就终止,并不会造成死循环。其他语言环境则需要考虑在数据->UI环节中鉴别是否需要中断(比如判断对应值无变化则中断)。

提示

具体用法可以参考Starter源码