图片看不清楚?请点击这里查看原图(大图)
而原来VB是那么简单现在参量Sender和e是干什么用?那个Handles又是什么东东?还好有老师我立刻起身厚着脸把大李请过来把疑问说给他听
大李推了推眼镜反问我道:“你应该对Windows编程中事件驱动设计很熟悉吧?”(注:此处Windows是指Win9X及其以上操作系统)
“是呀!”看来反问是大李授课开篇词了但我也只好先往他圈套里跳“事件驱动就是说应用执行流程是由外界发生事件所确定也就是接受到任务才工作模式事件就是个信号它告知应用有重要情况要发生实际上执行情况是各个应用把负责区别工作对象在其运行期间送入Windows 操作系统让这些对象等待Windows产生事件然后加以处理”
“VB员般也只需要象你这样理解就行了”大李话真让我触动“应该说是Windows先产生消息应用中窗口window procedure能接收来自windows消息并将其转化为事件这个我们以后再说现在来看看事件驱动组成主要是有事件、对象和事件处理 3个要素对象就是完成任务主体比如你说Button1;事件么就是对象要执行任务比如单击就是click事件;那么事件处理就是 Button1_Click这段了”
“这个我知道呀!我只是想问下Sender……”我疑惑地回应道
大李哥摇摇手打断了我话“如果你真正清楚事件驱动话就明白了你看下Sender是什么类型变量?”
“object呀!”我无奈地问道着“但是……”我隐约感觉到了什么
大李微笑着说“sender as object就语道破它来源和用途object是支持 .NET 框架类层次结构中所有类并为派生类提供低级别服务这是 .NET 框架中所有类最终超类;它是类型层次结构根般来说sender在形参中表示引发事件源头就是我刚才所说 3要素中‘对象’如果在Control控件引发事件中写代码话般都不需要再重新指派它已经默认为是该Control控件了当自己写代码来某事件时就要注明sender是何物了”
“也就是说sender是提供给在事件处理代码内部或外部进行吗?”我仍有点不明白
“可以这样说你难道看不出VB.NET提供给我们是更全面、更直接控制吗?再说e表示是事件数据就是个事件激发所需要状态信息在事件引发时不向事件处理传递状态信息事件会将e设为Eventargs如果事件处理需要状态信息则应用必须从此类派生个类来保存数据比如 Mousedown事件系统需要判断mouse位置、判断是左中右哪个键点击了、判断点击了几下等等因此该e就必需是 .Windows.Forms.MouseEventArgs类例子”大李继续解说着
“哦也就是说e是和事件密切相关喽?”我开始用实际操作来证实下我在代码窗口“类名”下拉列表中选择了Button1在其右边“思路方法名称”下拉列表中选择了MosueDown思路方法出现就是Button1.MouseDown事件处理代码段:
Private Sub Button1_MouseDown(ByVal sender As Object, ByVal e As .Windows.Forms.MouseEventArgs)
Handles Button1.MouseDown
End Sub
果然看到e类型变为.Windows.Forms.MouseEventArgs我在代码段内写下e然后在其后打个点出现了个智能感知菜单(如图1所示):
和button1.click事件相比button1.Mosuedown事件中e属性和思路方法多出了 5个描述事件特征属性见表1所述
表1 多出e属性
“我明白了那么Handles关键字是不是就是用于声明代码是要处理哪个事件处理过程呢?”我终于开了点窍
“是可不要小看Handles好好利用它你会变得简洁和灵活”大李边说边给我写了段代码:
Private Sub Button1_Click(ByVal sender As .Object, ByVal e As .EventArgs) _
Handles Button1.Click, Button2.Click
Select Case sender.name
Case "Button1"
MsgBox("你点击是button1")
Case "Button2"
MsgBox("你点击是button2")
End Select
End Sub
“在Handles后面写了两个事件声明就可以在同段代码中对两个对象进行控制另外利用Sender和e我们还可以更方便地构建和自己事件处理“大李边写边说
“是吗?如何实现?”我不由被激发出了浓浓兴趣
最新评论