首 页 | 新 闻 | 技术中心 | 第二书店 | 《程序员》 | 《开发高手》 | 社 区 | 黄 页 | 人 才
移 动专 题SUNIBM微 软微 创精 华Donews人 邮
我的技术中心 
我的分类 我的文档
全部文章 发表文章
专栏管理 使用说明



 RSS 订阅 
最新文档列表
Windows/.NET
.NET  (rss)    
Visual C++  (rss)    
Delphi  (rss)    
Visual Basic  (rss)    
ASP  (rss)    
JavaScript  (rss)    
Java/Linux
Java  (rss)    
Perl  (rss)    
综合
其他开发语言  (rss)    
文件格式  (rss)    
企业开发
游戏开发  (rss)    
网站制作技术  (rss)    
数据库
数据库开发  (rss)    
软件工程
其他  (rss)    

积极原创作者 
goodboy1881 (13)
wangchinaking (58)
iiprogram (67)
fancyhf (1)
harrymeng (41)
yjz0065 (113)
coofucoo (105)
Drate (69)
lphpc (30)
smallnest (61)
CSDN - 文档中心 - .NET 阅读:7851   评论: 6    参与评论
标题   Henry的VB.NET之旅(十二)—事件驱动     选择自 Latitude 的 Blog
关键字   Henry,VB.NET
出处  

       HenryVB.NET之旅(十二)事件驱动

                                    韩睿

 

“可视继承原来这么方便!”我心中默默地感叹一声。一会儿之后,我抬头扫了一眼屏幕上的代码后,突然发现了一个新问题,按钮的单击事件程序现在已经变成了:

VB.NET程序

VB程序

Private Sub btnProtected_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnProtected.Click

        MsgBox("派生的保护按钮")

End Sub

 

Private Sub Command1_Click()

……

End Sub

 

 

而原来的VB程序是那么的简单。现在的参量Sendere是干什么用的?那个Handles又是什么东东?还好有老师,我立刻起身,厚着脸把大李请过来,把疑问一一说给他听。

大李推了推眼镜,反问我道:“你应该对Windows编程中的事件驱动程序设计很熟悉吧?”(注:此处的Windows是指Win9X及其以上的操作系统

“是呀!”看来反问是大李授课的开篇词了,但我也只好先往他的圈套里跳,“事件驱动就是说应用程序的执行流程是由外界发生的事件所确定的。也就是接受到任务才工作的模式。事件就是一个信号,它告知应用程序有重要情况要发生。实际上的执行情况是,各个应用程序把负责不同工作的对象在其运行期间送入Windows操作系统,让这些对象等待Windows产生的事件,然后加以处理。”

VB程序员一般也只需要象你这样理解就行了。”大李的话真让我触动,“应该说是Windows先产生消息,应用程序中的窗口程序window procedure能接收来自windows的消息,并将其转化为事件,这个我们以后再说。现在来看看事件驱动程序的组成,主要是有事件对象事件处理程序三个要素。对象就是完成任务的主体,比如你说的Button1;事件么,就是对象要执行的任务,比如单击,就是click事件;那么事件处理程序就是Button1_Click这段程序了。”

“这个我知道呀!我只是想问一下Sender……”我疑惑地回应道。

大李哥摇摇手,打断了我的话。“如果你真正清楚事件驱动的话,就明白了。你看一下,Sender是什么类型的变量?”

object呀!”我无奈地问道着,“但是,……”我隐约感觉到了什么。

大李微笑着说,“sender as object,就一语道破它的来源与用途。object是支持 .NET 框架类层次结构中的所有类,并为派生类提供低级别服务。这是 .NET 框架中所有类的最终超类;它是类型层次结构的根。一般来说,sender在形参中表示引发事件的源头,就是我刚才所说的三要素中的‘对象’。如果在控件引发的事件中写代码的话,一般都不需要再重新指派,因为它已经默认为是该控件了。当自己写代码来调用某事件程序时,就要注明sender是何物了。”

“也就是说,sender是提供给在事件处理程序代码内部或外部进行调用的吗?”我仍有点不明白。

“可以这样说,你难道看不出VB.NET提供给我们的是更全面、更直接的控制吗?再说e,表示的是事件数据,就是一个事件激发所需要的状态信息。在事件引发时不向事件处理程序传递状态信息的事件会将e设为Eventargs。如果事件处理程序需要状态信息,则应用程序必须从此类派生一个类来保存数据。比如Mousedown事件,系统需要判断mouse的位置、判断是左中右哪个键点击了、判断点击了几下等等,因此该e就必需是System.Windows.Forms.MouseEventArgs类的实例。”大李继续解说着。

“哦,也就是说e是和事件密切相关的喽?”我开始用实际操作来证实一下,我在代码窗口的“类名”下拉列表中选择了Button1,在其右边的“方法名称”下拉列表中选择了MosueDown方法,出现的就是Button1.MouseDown事件处理程序代码段:

Private Sub Button1_MouseDown(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles Button1.MouseDown

End Sub

 

果然,看到e的类型变为System.Windows.Forms.MouseEventArgs。我在代码段内写下e,然后在其后打一个点,出现了一个智能感知菜单(如图1所示):

 

   与button1.click事件相比,button1.Mosuedown事件中的e的属性和方法多出了五个描述事件特征的属性,见表1所述。

Button

获取曾按下的是哪个鼠标按钮。

Clicks

获取按下并释放鼠标按钮的次数。

Delta

获取鼠标轮已转动的制动器数的有符号计数。制动器是鼠标轮的一个凹口。

X

获取鼠标单击的 x 坐标。

Y

获取鼠标单击的 y 坐标。

 

 

 

 

 

 

 

 

          

         1 多出的e的属性

“我明白了,那么Handles关键字是不是就是用于声明代码是要处理哪个事件的处理过程呢?”我终于开了点窍。

“是的,可不要小看Handles,好好利用它,你的程序会变得简洁和灵活。”大李边说边给我写了一段代码:

Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) _

        Handles Button1.Click, Button2.Click

        Select Case sender.name

            Case "Button1"

                MsgBox("你点击的是button1")

            Case "Button2"

                MsgBox("你点击的是button2")

        End Select

End Sub

 

 

“在Handles后面写了两个事件的声明,就可以在同一段代码中对两个对象进行控制。另外,利用Sendere我们还可以更方便地构建与调用自己的事件处理程序。“大李边写边说。

“是吗?怎么实现?”我不由被激发出了浓浓的兴趣。

(未完待续)

---------------------------------------------------------------

声明:本文版权与解释权归韩睿所有,如需转载,请保留完整的内容及此声明。

QQ: 18349592

E-Mail: henry7685@hotmail.com

    请访问本人专栏:http://www.csdn.net/develop/author/netauthor/Latitude/


相关文章
对该文的评论
booolee ( 2005-12-28)
连续品读12篇到这里,我心中对henry的敬佩如TTJS LMBJ,技术人品都是一流的!!!今天要把剩下的几篇读完,真是欲罢不能~~
xlla ( 2004-03-17)
“是的,可不要小看Handles,好好利用它,你的程序会变得简洁和灵活。”大李边说边给我写了一段代码:

大力写的那段所谓“简洁灵活”的代码好像正是java中笨重而失败的awt事件处理方法 :)
fredlin ( 2004-02-27)
高!
写的真好!
dreamflycool ( 2004-02-22)
请问怎么样判断一个文件从头到尾的过程呢!
cym110_78 ( 2004-02-15)
这么热心的人世上少有,在网络上就更难得了。敬佩!!!