aardio 事件驱动

事件驱动编程

今天开始学习事件驱动编程,突然觉得编程就像一场音乐会------每个程序组件都是乐器,而"事件"就像指挥棒的挥动,只有被触发时才会演奏。这种编程模式让程序能根据用户操作、系统状态变化做出响应。

一、事件绑定基础:给"乐器"安排演奏顺序

事件绑定的关键是把事件和处理函数关联起来,我在aardio里试了两个例子:

示例1:按钮点击事件绑定

lua 复制代码
import win.ui;
/*DSG{{*/
var winform = win.form(text="事件绑定示例";right=759;bottom=469)
winform.add(
button={cls="button";text="点击我";left=327;top=202;right=432;bottom=241;z=1}
)
/*}}*/

// 定义按钮点击事件处理函数
winform.button.oncommand = function(id,event){
    win.msgbox("按钮被点击啦!")
}

winform.show();
win.loopMessage();

运行后点击按钮真的弹出了消息框!原来通过oncommand属性就能绑定点击事件,匿名函数里的逻辑就是事件触发后的动作。

示例2:窗口关闭事件绑定

lua 复制代码
import win.ui;
/*DSG{{*/
var winform = win.form(text="窗口关闭事件示例";right=759;bottom=469)
winform.add(
edit={cls="edit";text="关闭窗口试试";left=9;top=11;right=747;bottom=170;edge=1;multiline=1;z=1}
)
/*}}*/

winform.onClose= function(hwnd,message,wparam){
    select(message) {
        case 0x10{
            if(win.msgboxTest("你要关闭窗口么?") ===false){
                return wparam;
            }
        } 
    }
}
winform.show();
win.loopMessage();

这个例子让我学会了拦截系统事件------当点击窗口关闭按钮时,程序会先弹出确认框,选"否"就不关闭窗口。这里用onClose绑定事件,通过message参数判断是否为关闭事件(0x10是Windows消息中的WM_CLOSE)。

二、自定义事件"

系统事件不够用?那就自己定义!试了两个例子:

示例1:自定义事件触发

lua 复制代码
import win.ui;
/*DSG{{*/
var winform = win.form(text="自定义事件示例";right=759;bottom=469)
winform.add(
button={cls="button";text="触发自定义事件";left=327;top=202;right=432;bottom=241;z=1}
)
/*}}*/

// 定义自定义事件处理函数
var customEvent = function(){
    win.msgbox("自定义事件被触发啦!")
}

// 按钮点击时触发自定义事件
winform.button.oncommand = function(id,event){
    customEvent()
}

winform.show();
win.loopMessage();

先定义一个customEvent函数,再通过按钮点击事件调用它------这就像自己写了一段旋律,让按钮成为触发演奏的开关。

示例2:带参数的自定义事件

lua 复制代码
import win.ui;
/*DSG{{*/
var winform = win.form(text="带参数的自定义事件示例";right=759;bottom=469)
winform.add(
button={cls="button";text="触发带参数的自定义事件";left=327;top=202;right=432;bottom=241;z=1}
)
/*}}*/

// 定义带参数的自定义事件处理函数
var customEventWithParam = function(param){
    win.msgbox("自定义事件被触发,参数是:" + param)
}

// 按钮点击时触发带参数的自定义事件
winform.button.oncommand = function(id,event){
    customEventWithParam("Hello, aardio!")
}

winform.show();
win.loopMessage();

带参数的事件更灵活!比如可以让不同按钮传递不同文本,事件函数根据参数显示不同内容,这让程序逻辑更动态了。

三、事件队列管理

事件太多时,需要按顺序执行------这就是事件队列的作用。

示例1:简单的事件队列

lua 复制代码
import win.ui;
/*DSG{{*/
var winform = win.form(text="事件队列示例";right=759;bottom=469)
winform.add(
button={cls="button";text="触发事件队列";left=327;top=202;right=432;bottom=241;z=1}
)
/*}}*/

// 定义事件队列
var eventQueue = {}

// 定义事件处理函数
var event1 = function(){
    win.msgbox("事件 1 被执行")
}
var event2 = function(){
    win.msgbox("事件 2 被执行")
}
// 将事件添加到队列
table.push(eventQueue,event1)
table.push(eventQueue,event2)

// 按钮点击时依次执行队列中的事件
winform.button.oncommand = function(id,event){

   for(i=1;#eventQueue;1){
   	eventQueue[i]()
   } 
}
winform.show();
win.loopMessage();

用数组eventQueue存储事件函数,点击按钮后通过循环依次执行------就像音乐会按节目单逐个演奏曲目,顺序不会乱。

示例2:动态管理事件队列

lua 复制代码
import win.ui;
/*DSG{{*/
var winform = win.form(text="动态管理事件队列示例";right=759;bottom=469)
winform.add(
button1={cls="button";text="添加事件到队列";left=200;top=202;right=305;bottom=241;z=1},
button2={cls="button";text="执行队列中的事件";left=400;top=202;right=505;bottom=241;z=2}
)
/*}}*/

// 定义事件队列
var eventQueue = {}

// 定义事件处理函数
var event1 = function(){
    win.msgbox("事件 1 被执行")
}

// 按钮 1 点击时添加事件到队列
winform.button1.oncommand = function(id,event){
    table.push(eventQueue,event1)
    win.msgbox("事件已添加到队列")
}

// 按钮 2 点击时执行队列中的事件
winform.button2.oncommand = function(id,event){
    for(i=1;#eventQueue;1){
    	eventQueue[i]()
 
    } 
}
winform.show();
win.loopMessage();

这个例子更实用!可以随时添加事件到队列,再统一执行。比如用户连续点击"添加事件"按钮,程序会按顺序记录所有事件,最后一次性处理。

四、综合习题:我的第一个事件驱动程序

题目要求做一个带事件队列的窗口,我试着写了代码:

lua 复制代码
import win.ui;
/*DSG{{*/
var winform = win.form(text="综合习题示例";right=759;bottom=469)
winform.add(
button1={cls="button";text="添加事件到队列";left=200;top=202;right=305;bottom=241;z=1},
button2={cls="button";text="执行队列中的事件";left=400;top=202;right=505;bottom=241;z=2}
)
/*}}*/

// 定义事件队列
var eventQueue = {}
var eventCount = 0

// 按钮 1 点击时添加事件到队列
winform.button1.oncommand = function(id,event){
    eventCount = eventCount + 1
    var newEvent = function(){
        win.msgbox("事件 " + eventCount + " 被执行")
    }
    table.push(eventQueue,newEvent)
    win.msgbox("事件 " + eventCount + " 已添加到队列")
}

// 按钮 2 点击时执行队列中的事件
winform.button2.oncommand = function(id,event){
    for(i=1;#eventQueue;1){
    	eventQueue[i]()
    } 
    eventQueue = {}
}

winform.show();
win.loopMessage();

运行后发现,每次点击"添加事件"按钮,程序会生成一个带编号的事件并加入队列;点击"执行事件"按钮,会按顺序弹出消息框。这里我用eventCount记录事件编号,每次添加事件时动态创建函数 !

今日总结

  • 事件驱动编程的核心是"事件触发-函数响应"模式。
  • 事件绑定、自定义事件、事件队列是三大基础模块,通过oncommandonClose等属性实现交互逻辑。

aardio 新手交流学习群,一起学习的进

qq群号:697197055 微信群加我 _825720xw 拉你

相关推荐
iceiceiceice2 天前
iOS 26 适配 | 使用 `hidesSharedBackground` 保持导航栏按钮原有样式
ios·objective-c·编程语言
IT老小子6 天前
【c语言】linux下静态库和动态库制作
编程语言
m0_488633326 天前
C语言学习笔记:探索简洁灵活且具多种特性的编程语言
c语言·学习笔记·编程语言·简洁性·灵活性
荔枝吻10 天前
【AI总结】【技术总结】深入剖析编程语言的分类:运行时语言 vs 编译型语言
编程语言·运行时语言·编译型语言
CoovallyAIHub10 天前
Agency-Agents(52k+ Stars):140+ 个角色模板,让 AI 编程助手变成一支专业团队
前端·算法·编程语言
平常心cyk11 天前
Python基础快速复习——while循环和for循坏
编程语言
土豆125012 天前
Rust宏编程完全指南:用元编程解锁Rust的终极力量
rust·编程语言
IT老小子13 天前
【C++ STL】bind适配器详解
编程语言
逻辑君15 天前
技术逆向英语|202602022
编程语言·haskell
悦心无谓17 天前
C++负载均衡式在线OJ测试报告
开发语言·c++·selenium·测试工具·负载均衡·编程语言·后端开发