WinForms中的Button有一个CLICK事件。但谁告诉Button对象它已被点击?

时间:2013-07-15 07:52:06

标签: c# .net events

我正在学习C#。我正在阅读该语言的事件和代表部分。我正在使用WinForms应用程序来教育自己。我试着深入了解按钮及其工作原理。我找到了以下内容:

  

1)我的默认Form1.cs文件中有一行public partial class Form1 : Form。这是一个部分类。

     

2)我还有一个Form1.Designer.cs类文件,其中包含一行partial class Form1。现在1)和2)中提到的文件组合形成一个   全班。

     

3)From1.Designer.cs文件最终有很多语句   创建按钮对象。它也有一个声明   对我特别感兴趣:

this.btn_BaseBuildLocation.Click += new System.EventHandler(this.btn_BaseBuildLocation_Click);
     

此语句将自定义函数添加到委托单击。这个   委托在Control类(System.Windows.Forms.dll)中声明如下:

public event EventHandler Click;
     

4)EventHandler是System.EventHandler.cs中定义的委托   (mscorlib.dll中)。

     

5)Button类继承Control类,因此可以访问   单击EventHandler。

     

6)Button类具有一旦知道就处理流的所有逻辑   有人点击了它。我看了一下使用的Button类   单声道用于理解内在细节。我这几乎都是这样做的   我想学习的课程。

     

7)这一切都非常美丽。但我对这个事实感到不安   我不知道Button对象是如何知道的   点击。

     

8)我经历了VC ++以及它如何处理事件。我发现了很多   关于消息循环,事件队列等......

问题:

  

1)VC ++处理事件的方式与.NET相同吗?

     

2)如果是这样,有没有办法研究这些细节?

任何帮助将不胜感激。 谢谢。

4 个答案:

答案 0 :(得分:2)

从技术上讲,Button是一个Window。它有一个窗口句柄。

这意味着Dispatcher会在适当的时候将键盘和鼠标事件路由到Button。 Button具有内部逻辑,用于确定MouseDown和MouseUp事件何时构成有效点击,然后引发Click事件。

答案 1 :(得分:2)

  1. 1) Is the VC++ way of handling events the same as .NET's?

    很明显,处理是一样的,它是通过捕获窗口消息并相应地做出响应来完成的。 .Net提供了一个围绕窗口句柄'NativeWindow类'的包装器,它是Window Handle的低级封装,System.Windows.Forms.Control是所有控件的基类,内部使用名为NativeWindow的后代命名ControlNativeWindow将所有消息传递给控件。

  2. 如果是这样,有没有办法查看这些细节?

    是的,深入了解Control class Through Reflector

  3. 希望这会有所帮助

答案 2 :(得分:1)

在WinForm appplicatio中,您有使用Main方法的Program类。 那里总有一条线:

Application.Run(new YourMainForm());

它开始在当前线程上运行标准的应用程序消息循环。 这是事件的“起点”。

this question的回答解释得非常好并且还链接到某些来源

答案 3 :(得分:1)

WinForms Button是非托管Windows类型的托管包装,它通过.NET执行P / Invoke的一组Win32 API调用创建和管理。

在内心深处,该按钮可以订阅同一个窗口事件循环(如果您愿意,还可以订阅消息泵),它可以驱动您在VC ++示例中看到的Win32 API调用。非托管Windows运行时将事件(例如“已单击此按钮”)放入事件队列。当循环执行时,相关控件将拾取排队事件,并将其传播到“托管”事件中,此时您可以观察它。

从本质上讲,Windows运行时提供了大量的基础结构,.NET只提供了一组方便的包装器,可以轻松使用笨重的旧Win32库。

如果您使用Reflector并深入了解ButtonControl,您可以自己发现很多内容,只是看看.NET代码的结束位置和非托管的Win32调用的开始。