從vc入門程式設計的,相信大家都很熟悉pretranslatemessage和windowproc兩個函式,前者是預處理windows發給控制項的訊息,後者是處理剩餘的控制項訊息。對於pretranslatemessage函式,一般來說,我們是這樣處理控制項訊息的:
bool test::pretranslatemessage(msg* pmsg) } return cdialog::pretranslatemessage(pmsg);}}
分為兩層,先判斷該訊息是屬於那個控制項視窗的,再判斷這個訊息的型別。
對於windowproc函式,我們通常是這樣處理控制項訊息的:lresult test::windowproc(uint message, wparam wparam, lparam lparam) 這個函式對控制項訊息的處理方法是先把訊息發給當前控制項,如果不處理,則發給其父視窗,如果其父視窗也不處理,則發給當前程式處理。
而在c#中,訊息處理函式有所改變。對於preprocessmessage函式:我們必須在需要預處理訊息的控制項中過載這個函式,而不能僅在父視窗過載這個函式。 public override bool preprocessmessage(ref message msg)
return base.preprocessmessage(ref msg); }可以看到,此函式第一步不再需要判斷此訊息是屬於那個控制項的,每個控制項(包括父視窗本身),它只處理屬於自己的訊息,不再沿用vc中的訊息機制,在某個訊息傳送到乙個類前,允許其它類試著處理它。
對於wndproc(跟vc中的windowproc名字稍有改變)函式來說:
protected override void wndproc(ref message msg) base.wndproc(ref msg); }
和vc中的windowproc沒有什麼形式上的變化,只不過實質上,c#已不再採用訊息傳送順序的機制,只要當前控制項沒有相應訊息處理入口,則訊息被丟棄。
如果我們在c#裡面想再實現在listbox控制項中,點右鍵彈出選單,就不能再用bool test::pretranslatemessage(msg* pmsg) } }呵呵,那怎麼辦呢,^_^其實c#中,不再和vc那樣只提供少數幾種事件,c#中豐富的事件,已經不再經常需要程式設計師特製某種事件的訊息處理函式,只要在listbox控制項的mousedown響應函式中,區分出左右鍵,然後根據情況彈出不同的選單即可!
但比如你要自定義乙個編輯框,可是想攔截某些特定的鍵(如delete),這時,c#豐富的事件,就不再有用了,必須要我們先自定義乙個從textbox繼承下來編輯框控制項,然後在其preprocessmessage函式中預處理它!
public override bool preprocessmessage(ref message msg)
return base.preprocessmessage(ref msg); }
剩餘幾點,我現在還沒搞清楚:preprocessmessage函式能處理的訊息很有限:wm_keyup,wm_keydown之類的訊息可以處理,可是wm_close,wm_lbuttondown等訊息無法處理。但wndproc函式卻可以處理它們! 不知道是微軟故意遮蔽掉那些訊息的預處理,還是有什麼其它的蹊蹺!
VC 中的訊息處理
messagebox 並沒有什麼多少功能,但是能夠在螢幕上顯示乙個視窗,提出乙個問題,並且等候使用者的輸入。下面是messagebox 的原型 int messagebox hwnd hwn,handle of owner window lpctstr lptext,address of text ...
vc 訊息 C 中訊息的種類
3.4 三種型別的訊息 在mfc應用程式中傳輸的訊息有三種型別 視窗訊息 命令訊息和控制項通知。3.4.1 視窗訊息 視窗訊息 window message 一般與視窗的內部運作有關,如建立視窗 繪製視窗和銷毀窗 口等。通常,訊息是從系統傳送到視窗,或從視窗傳送到視窗。當用sendmessage 或...
C 中訊息處理
對於處理所有訊息.net 提供了wndproc進行重寫 wndproc ref message m protected override void wndproc ref message m base.wndproc ref m 在.net中,程式驅動採用了事件驅動而不是原來的訊息驅動,雖然.net...