按鈕事件之我見

2021-04-08 11:18:42 字數 3796 閱讀 8947

按鈕事件之我見

作者

jim

時間

2006-6-21

:虛函式(

virtual

)、覆蓋(

override

)、事件(

event

)、**(

delegate)

引言:在物件導向的程式設計中,主要涉及到的關鍵知識點就是以上列出的幾個,在學習過程中,往往是分散開來學習,可能會出現學前忘後的現象,本文主要通過

c#中對乙個按鈕(

button

)的繼承的例項說明,了解各自的用法和內部聯絡。由於本人知識有限,如若出現錯誤之處,還望各位大蝦指正。小弟在此先謝過。j

前言說明:相信各位在系統開發過程中,肯定使用過按鈕(

button

)。在使用過程中可能就是從工具箱中拖動乙個

button

到窗體中,在雙擊按鈕,自動編寫按鈕的

click

初步分析:當我們將乙個按鈕從工具箱中拖到我們的窗體中時,其實在窗體的

designer.cs

中則首先生成了一行此按鈕的引用:

private

system.windows.forms.button sysbtn;

sysbtn

是我的button

的名稱,請注意此時

sysbtn

的型別說明,後面說明中會涉及到。

當我們需要進行對該按鈕的單擊事件需要編碼時,我們只需要雙擊一下這個按鈕即可自動出現乙個函式供我們填寫。

private

void sysbtn_click(object sender, eventargs e)

其實在在窗體的

designer.cs

中,會自動生成事件的具體定義和說明

this

.sysbtn.click += new system.eventhandler(this.sysbtn_click);

現在對這一行文字進行解釋和說明:

首先是事件

this.sysbtn.click

,我們知道

click

是button

乙個事件,他只是

button類中n

個事件中的乙個,但他們都具有相同的性質和用法,即:事件都是由定義事件的類自生觸發,並在類的外部實現具體的事件處理。

然後是**(delegate,**其實就是乙個指標函式,他規定了事件的原型定義,如**名稱、**引數,對於以上的

button

的click

事件的**已經由

c#編譯系統預定義了,就是

system.eventhandler

(eventargs e

),**其實起了乙個橋梁的作用,通過**,將類內部事件與類外部處理銜接起來。

最後是外部事件處理

在本例中,外部處理即:

private

void sysbtn_click(object sender, eventargs e)

事件外部處理函式原型必須與**一致。此處單擊按鈕時,會顯示

"這是系統按鈕的事件委託

"訊息框。

深入分析:現在我們深入到

button

的內部,再次研究一下

click

事件的工作原理,通過前面的描述,我們了解到事件是在類內部觸發的,但是具體是什麼東西觸發了呢?

我們通過

msdn

幫助可了解到

button

類的所有成員的組成,會發現其中有個

protected

virtual void onclick( eventargs e)

函式,從函式名稱我們可以看出他與

click

事件有著必然的聯絡,其實,元凶就是他,是他觸發了

button

的click

事件,我們可以通過以下的例項進行驗證,下面我們來具體分析一下:

首先是虛函式(virtual),

虛函式的主要特點就是用來被繼承類覆蓋的,在後面的說明中,我們就會發現他的奧妙所在了。

然後我們通過繼承

button

類,生成我們自己的

button

類mybtn

class

mybtn :system.windows.forms.button

並在剛才的窗體中引用我們的

button

類,和事件定義以及實現函式

private

mybtn mybtn;

this

.mybtn.click += new system.eventhandler(this.mybtn_click);

private

void mybtn_click(object sender, eventargs e)

顯然,當單擊按鈕時,也會顯示

"這是我的按鈕的事件委託

"訊息框。

下一步,為了發掘

protected

virtual void onclick( eventargs e)

的奧妙,我們在

mybtn

類中覆蓋此函式,並實現了顯示

"mybtn

是從system.windows.forms.button繼承而來,觸發了click事件,但系統**已經失效"的功能。

class

mybtn :system.windows.forms.button }

現在我們再單擊我們的按鈕,猜猜,會發生什麼情況,是顯示幾個訊息框呢?

0個?乙個?二個?

答案是,只顯示了乙個訊息框,

"mybtn

是從system.windows.forms.button繼承而來,觸發了click事件,但系統**已經失效",他並沒有觸發到我們外部定義的訊息處理過程:

private

void mybtn_click(object sender, eventargs e)

由此我們就可以發現,

button

的click

事件是由

onclick

函式來觸發的,由此我們會產生乙個問題,當繼承了

button

類後,我們怎麼才能讓他也能觸發

click

事件呢?

很簡單,我們只需要在我們覆蓋的

onclick

函式中再呼叫一下基類中的

onclick

函式即可。

class

mybtn :system.windows.forms.button }

一切

ok了!

是由基類的

onclick

函式來觸發

click

事件,至於基類的

onclick

是怎麼觸發的,那就得問微軟的人了。j

總結:通過以上的例項我們可以對事件進行總結:類的某個事件是在其內部觸發,往往是由乙個虛函式觸發。類事件通過**與外部的處理函式相關聯,由使用者來實現自己的事件處理過程。 啊

as3按鈕事件

在剛開始學as3時,如果不知道按鈕的事件如onpress的話,實在是件很沒有頭緒的事情。在 as3.0中,所有的時間都已經被event統一管理了.相對as2.0來說,按鈕事件是在as3中變動最大的事件.在as3.0中例如onpress等以前的按鈕事件寫法已經基本退出了歷史的舞台.取而代之的是統一的管...

as3按鈕事件

在剛開始學as3時,如果不知道按鈕的事件如onpress的話,實在是件很沒有頭緒的事情。在 as3.0中,所有的時間都已經被event統一管理了.相對as2.0來說,按鈕事件是在as3中變動最大的事件.在as3.0中例如onpress等以前的按鈕事件寫法已經基本退出了歷史的舞台.取而代之的是統一的管...

as3按鈕事件

在剛開始學as3時,如果不知道按鈕的事件如onpress的話,實在是件很沒有頭緒的事情。在 as3.0中,所有的時間都已經被event統一管理了.相對as2.0來說,按鈕事件是在as3中變動最大的事件.在as3.0中例如onpress等以前的按鈕事件寫法已經基本退出了歷史的舞台.取而代之的是統一的管...