簡體   English   中英

WinForms中的按鈕具有CLICK事件。 但是誰告訴按鈕對象已被單擊呢?

[英]The Button in WinForms has a CLICK event. But who tells the Button object that it has been clicked?

我正在學習C#。 我正在瀏覽語言的“事件和代表”部分。 我正在使用WinForms應用程序進行自我教育。 我試圖深入了解Buttons及其工作方式。 我發現以下內容:

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); 

該語句將一個自定義函數添加到委托Click。 在Control類(System.Windows.Forms.dll)中聲明此委托,如下所示:

 public event EventHandler Click; 

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

5)Button類繼承了Control類,因此可以訪問Click EventHandler。

6)一旦知道有人單擊了Button類,它就具有處理該流的所有邏輯。 我看了一下Mono中用於了解內部細節的Button類。 我對幾乎所有我想學習的課程都這樣做。

7)這一切都非常美麗。 但是我不知道Button對象如何知道它已被單擊,這一事實使我感到困擾。

8)我經歷了VC ++及其如何處理事件。 我發現了很多有關消息循環,事件隊列等的信息。

問題:

1)VC ++處理事件的方式是否與.NET相同?

2)如果是這樣,是否有辦法研究這些細節?

任何幫助,將不勝感激。 謝謝。

從技術上講,按鈕是窗口。 它具有窗口句柄。

這意味着分派器將在適當的時候將鍵盤和鼠標事件路由到按鈕。 Button具有內部邏輯,可以確定MouseDown和MouseUp事件何時構成有效的單擊,然后引發Click事件。

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

    是的,顯然,處理是相同的,它是通過捕獲窗口消息並做出相應的響應來完成的。 達網絡提供圍繞窗口句柄“NativeWindow類”,這是一個低電平封裝的封裝Window Handle ,System.Windows.Forms.Control的是所有控件的基類,其在內部使用的decendant NativeWindow命名ControlNativeWindow其傳遞所有消息來控制。

  2. 如果是這樣,是否有辦法研究這些細節?

    是的,通過Reflector進入Control類

希望這可以幫助

在WinForm應用程序中,您具有帶有Main方法的Program類。 那里總是有一行:

Application.Run(new YourMainForm());

它開始在當前線程上運行標准應用程序消息循環。 這是事件的“起點”。

這個問題的答案很好地解釋了它,並且還鏈接到一些資料來源

WinForms Button是圍繞非托管Windows類型的托管包裝,該Windows類型是通過.NET在其上執行P / Invoke的一組Win32 API調用創建和管理的。

在最深處,該按鈕訂閱了相同的窗口事件循環(或消息泵,如果您願意的話),該窗口事件循環驅動您可能在VC ++示例中看到的Win32 API調用。 非托管Windows運行時會將事件(例如“已單擊此按鈕”)放入事件隊列。 當循環執行時,排隊的事件由相關控件拾取,並傳播到“托管”事件中,即您能夠觀察到的事件。

本質上,Windows運行時提供了許多基礎結構,.NET僅提供了一組方便的包裝器,這使使用笨拙的舊Win32庫變得容易。

如果您使用Reflector並深入研究Button and Control以查看.NET代碼在何處結束,以及不受托管的Win32調用開始,您會發現很多事情。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM