我正在学习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)如果是这样,有没有办法研究这些细节?
任何帮助将不胜感激。 谢谢。
答案 0 :(得分:2)
从技术上讲,Button是一个Window。它有一个窗口句柄。
这意味着Dispatcher会在适当的时候将键盘和鼠标事件路由到Button。 Button具有内部逻辑,用于确定MouseDown和MouseUp事件何时构成有效点击,然后引发Click事件。
答案 1 :(得分:2)
1) Is the VC++ way of handling events the same as .NET's?
很明显,处理是一样的,它是通过捕获窗口消息并相应地做出响应来完成的。 .Net提供了一个围绕窗口句柄'NativeWindow类'的包装器,它是Window Handle
的低级封装,System.Windows.Forms.Control是所有控件的基类,内部使用名为NativeWindow
的后代命名ControlNativeWindow
将所有消息传递给控件。
如果是这样,有没有办法查看这些细节?
是的,深入了解Control class Through Reflector
希望这会有所帮助
答案 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并深入了解Button
和Control
,您可以自己发现很多内容,只是看看.NET代码的结束位置和非托管的Win32调用的开始。