# FScript 的 widget 扩展函数 ## 1. 介绍 [FScript](fscript.md) 的 widget 扩展函数只能在 widget 的事件处理函数中使用,包括传统的 AWTK 应用程序和 AWTK-MVVM 应用程序的事件处理函数。 FScript 和其它主流脚本 (lua/js) 相比,最大的优势就是体积小巧,而且 AWTK 本身依赖于 fscript,所以使用 fscript 增加额外代码可以忽略不计数。 FScript 并不是要取代 C 或 JS 来开发 AWTK 应用程序,而是一个有益的补充,加快应用程序的开发,在 AWTK 的 UI 文件中直接嵌入 FScript, 有如下优势: * 1. 在特定情况下,可以极大简化程序的实现。 > 比如下面的代码,点击按钮时打开指定的窗口就非常简洁。 ```xml ``` > 如果处理逻辑太复杂,请不要用 FScript 实现,否则不好调试。要善用 FScript 的优点而回避它的缺点。 ## 3. 目前支持的事件 * global\_key\_up * global\_key\_down * global\_key\_long\_press * key\_up * key\_down * key\_long\_press * key\_down\_before\_children * key\_up\_before\_children > 按键事件处理函数可以从 key 变量获取当前的键值。可以从 alt, ctrl, cmd 和 menu 变量中获取相应控制键的状态。如: ```xml print("global keydown:", key, "alt=", alt, "ctrl=", ctrl, "cmd=", cmd, "menu=", menu); print("global keyup:", key, "alt=", alt, "ctrl=", ctrl, "cmd=", cmd, "menu=", menu); print("global key_long_press:", key, "alt=", alt, "ctrl=", ctrl, "cmd=", cmd, "menu=", menu); print("keydown:", key, "alt=", alt, "ctrl=", ctrl, "cmd=", cmd, "menu=", menu); print("keyup:", key, "alt=", alt, "ctrl=", ctrl, "cmd=", cmd, "menu=", menu); print("keyup:", key, "alt=", alt, "ctrl=", ctrl, "cmd=", cmd, "menu=", menu); ``` * pointer\_up * pointer\_down * pointer\_move * click > 指针事件处理函数可以从 x/y 变量获取当前指针的位置。可以从 alt, ctrl, cmd 和 menu 变量中获取相应控制键的状态。如: ```xml print("pointerdown:", x, y, "alt=", alt, "ctrl=", ctrl, "cmd=", cmd, "menu=", menu); print("pointerup:", x, y, "alt=", alt, "ctrl=", ctrl, "cmd=", cmd, "menu=", menu); print("click:", x, y, "alt=", alt, "ctrl=", ctrl, "cmd=", cmd, "menu=", menu); ``` * timer > 定时器,示例: ```xml ``` * window\_close * window\_open * window\_will\_open > 窗口事件只适用于窗口。 ```xml print("window_open") print("window_will_open") print("window_close") ``` * value\_changed > 控件的值变化事件。 ```xml ``` * focus * blur > 控件得到焦点与失去焦点事件,示例: ```xml ``` * value\_changed\_by\_ui (仅 MVVM 支持) > 在 MVVM 中,除了支持以上方式编写 FScript,也可以通过 v-on: 和 v-data: 的方式使用 FScript,请参考 MVVM 的文档。 ## 4. 事件的返回值 通过 return 返回 RET\_XXX 常量,示例: ```js return RET_OK; return RET_FAIL; return RET_STOP; return RET_REMOVE; ``` ## 5. widget 相关的扩展函数 ### 5.1 open > 打开窗口。 > 相关函数:window_open、window_close_and_open。 ---------------------------- #### 原型 ```js open(name, close_current, switch_to_if_exist) => obj_widget window_open(name, close_current, switch_to_if_exist) => obj_widget window_close_and_open(name, close_current) => obj_widget; ``` * name 窗口的资源名称(字符串) * close\_current 可选。为 true 时关闭当前窗口。 * switch\_to\_if\_exist 可选。为 true 时,如果同名窗口存在,直接切换到指定窗口。 * 返回打开的窗口对象。 #### 示例 ```xml ``` ### 5.12 stop_timer > 停止指定控件的定时器 ---------------------------- #### 原型 ```js stop_timer() => bool stop_timer(widget) => bool ``` * 不指定 widget 是停止当前控件的定时。 * widget 可以是 widget 对象,也可以是 widget 的路径。 #### 示例 ```js stop_timer('parent.timer') ``` ### 5.13 reset_timer > 重置指定的timer,重置之后定时器重新开始计时。 ---------------------------- #### 原型 ```js reset_timer() => bool reset_timer(widget) => bool ``` * 不指定 widget 是重置当前控件的定时。 * widget 可以是 widget 对象,也可以是 widget 的路径。 #### 示例 ```js reset_timer('parent.timer') ``` ### 5.14 modify_timer > 修改指定的timer的duration,修改之后定时器重新开始计时。 ---------------------------- #### 原型 ```js modify_timer(duration) => bool modify_timer(widget, duration) => bool ``` * 不指定 widget 是设置当前控件的定时器。 * widget 可以是 widget 对象,也可以是 widget 的路径。 * duration 为定时器时间间隔。 #### 示例 ```js modify_timer('parent.timer') ``` ### 5.15 suspend_timer > 挂起指定的timer,一般用于不断循环触发的计时器。 ---------------------------- #### 原型 ```js suspend_timer() => bool suspend_timer(widget) => bool ``` * 不指定 widget 是挂起当前控件的定时。 * widget 可以是 widget 对象,也可以是 widget 的路径。 #### 示例 ```js suspend_timer('parent.timer') ``` ### 5.16 resume_timer > 唤醒挂起指定的timer,并且重置定时器重新开始计时。 ---------------------------- #### 原型 ```js resume_timer() => bool resume_timer(widget) => bool ``` * 不指定 widget 是唤醒当前控件的定时。 * widget 可以是 widget 对象,也可以是 widget 的路径。 #### 示例 ```js resume_timer('parent.timer') ``` ### 5.17 send_key > 向指定控件发生按键事件 > 相关函数:widget_send_key。 ---------------------------- #### 原型 ```js send_key(widget, key_name) => bool widget_send_key(widget, key_name) => bool ``` * widget 可以是 widget 对象,也可以是 widget 的路径。 #### 示例 ```js