C 委託本質探索 五 點選事件的真實原理

2022-03-23 22:07:46 字數 1944 閱讀 7485

// 研究控制項點選事件的真實原理

// 這裡定義了乙個控制項,編譯後,將這個控制項放到窗體上,找到myclick事件,自己加點**就可以測試

using system;

using system.collections.generic;

using system.text;

using system.componentmodel;

using system.windows.forms;

#region " 字    段    聲    明 "

eventhandlerlist _myevents;

object _eventclick = new object();

#endregion

#region " 屬    性    定    義 "

public eventhandlerlist myevents

return this._myevents;}}

#endregion

#region " 事    件    定    義 "

public event eventhandler myclick

remove

//asynccallback

//activator

}#endregion

#region " 私    有    方    法 "

private void myonclick(eventargs e)

}private void wmmouseup(ref message m, system.windows.forms.mousebuttons button, int clicks)

private int signedloword(intptr n)

private int signedhiword(intptr n)

#endregion

#region " 公    有    方    法 "

protected override void wndproc(ref message m)

}#endregion

// mybutton.myclick的真實處理情況是這樣的:

// 首先,向外公布乙個myclick方法變數,對這個變數的操作支援add和remove操作.

// 當add操作時(也就是從外邊作+=操作時),將傳入值寫入乙個列表,起個名字叫做事件列表.

// 在mybutton內部的訊息處理過程wndproc中,當截獲到wm_lbuttonup訊息時,呼叫wmmouseup方法處理.

// 在wmmouseup實體中呼叫myonclick方法.

// 在myonclick實體中,從事件列表中取到方法例項handler並呼叫方法.

// mybutton.myclick的工作原理與例4所描述的不同

// 1.方法變數myclick沒有直接用來存放外部的方法例項,而是象屬性那樣,存放在乙個欄位_myevents中.

// 2.訊息處理過程wndproc也沒有myclick的呼叫,而是在myonclick中呼叫方法欄位.

// 從本質上講wndproc還是處理了myclick的,但實現思路上區別很大.

// 好像少了乙個環節,myclick在內部沒例項化過.myonclick中進行了方法字段是否為空的判斷.

// 這說明方法變數在內部不一定需要傳入例項,只要內部呼叫時進行非空判斷就可以了.

// 以上研究都是把方法變數當做一般變數來處理.

// delegate與訊息迴圈結合,這就是我們看到的事件.

// 事件帶來的效果,實現了乙個物件將自己的方法公布給別人,並由別人進一步完善這個方法.

// 這又繞回到最開始舉的例子:領導委託下屬做某件事!

// 最初的例子委託用錯了地方,把下屬的方法定義了乙個變數來呼叫.

// 應該是把領導這個物件內定義乙個方法變數,由下屬具體實現.

// 下一例重構最初的例子.

}

委託和事件再探索

一直以為張子陽是位功力深厚的長者,今天才知道他比 我大一歲!功力深厚也就罷了,還長得那麼帥!汗顏!張老師 在技術上不分輩分 的文章我一直關注,由淺及深,能跟著學不少東西非常棒!我看技術從來不做筆記的,以為自己腦子好使,最近 發現老是忘事,看來到了該做筆記的年齡了!具體的關於c 中的委託和事件我就不再...

C 物件模型簡介(二) 深入底層,探索本質

叄 多重繼承 注意 在多重繼承下,若有n個基類,則派生類中有n個virtual table.針對每乙個virtual table,派生類物件中有對應的vptr。這些vptrs將在建構函式中被設立初值。派生類的虛函式會覆蓋 改寫 其每個基類virtualtable中相應的虛函式索引值。多重繼承最左端的...

C 中的委託和事件 五

委託 事件與observer設計模式 範例說明 上面的例子已不足以再進行下面的講解了,我們來看乙個新的範例,因為之前已經介紹了很多的內容,所以本節的進度會稍微快一些 假設我們有個高檔的熱水器,我們給它通上電,當水溫超過95度的時候 1 揚聲器會開始發出語音,告訴你水的溫度 2 液晶屏也會改變水溫的顯...