cwnd的窗體控制代碼,由cwnd負責訊息的響應。所以這類訊息必須同乙個cwnd類對應,更精確的說必須與乙個hwnd型別的窗體控制代碼相對應。這樣得出乙個重要的結論,就是從ccmdtarget中派生而沒有從cwnd派生的類沒有處理此類訊息的能力。
由此可見,我們自定義的類要想響應自定義訊息就只能從cwnd中派生(當然不響應任何訊息的類可以從cobject中派生)。先來看看如何自定義訊息:
在.h中做的工作:
第一步要宣告訊息:
#define wm_mymsg wm_user+8
第二步要在類宣告中宣告訊息對映:
declare_message_map()
第三步要在類宣告中定義訊息處理函式:
afx_msg lresult mymsghandler(wparam,lparam);
在.cpp中做的工作:
第四步要實現訊息對映:
begin_message_map(cmainframe, cmdiframewnd)
on_message(wm_mymsg,onmymsghandler)
end_message_map()
第五步要實現訊息處理函式(當然可以不實現):
lresult cmainframe::onmymsghandler(wparam w,lparam l)
在引發或發出訊息的地方只用寫上:
::sendmessge(::afxgetmainwnd()->m_hwnd,wm_mymsg,0,0);
到此,自定義訊息完畢,這是好多網上文章都寫的東西。大家會發現上面**是在cmainframe類中實現的,但是如果要用自定義類,就沒有那麼簡單了。顯然把第四步與第五步的cmainframe換成自定義的類名(這裡我用cmytestobject來代表自定義類)是不能正常工作的。原因在於在傳送訊息的sendmessage函式中的第乙個引數是
要響應訊息對應的hwnd型別的窗體控制代碼,而cmytestobject類中的m_hwnd中在沒有呼叫cwnd::create之前是沒有任何意義的,也就是沒有呼叫cwnd::create或cwnd::createex函式時,cwnd不對應任何窗體,訊息處理不能正常運作。
所以,又乙個重要的結論,在自定義類能夠處理任何訊息之前一定要確保m_hwnd關聯到乙個窗體,即便這個窗體是不可見的。那麼有人說,在自定義類的建構函式中呼叫create函式就行了,不錯,當然也可以在別處呼叫,只要確保在訊息傳送之前。但是,create的呼叫很有說法,要注意兩個地方,第乙個引數是類的名稱,我建議最好設為null;第五個引數是父窗體物件的指標,這個函式指定的物件一定要存在,我建議最好為整個程式的主窗體。還有很多人問第六個引數的意義,這個引數關係不大,是子窗體id,用於傳給父窗體記錄以便識別。如下是我
的自定義類的建構函式:
cmytestobject::cmytestobject()
//一定要在生成主窗體後使用,在主窗體完成oncreate訊息的處理後
cmytestobject::cmytestobject(cwnd *pparent)
不能如下呼叫create,因為此時cmytestobject不關聯任何窗體,所以this中的m_hwnd無效:
MFC自定義訊息
訊息機制是windows的典型執行機制,在mfc中有很多的訊息如wm btn 等。但是在有些情況下我們需要自定義一些訊息去做一些我們需要的功能,mfc的嚮導不能幫助我們做到這一點,我們可以通過新增相應的 去完成這個功能。新增自定義訊息操作如下 1.建立mfc工程,如基於對話方塊的應用程式,test。...
MFC自定義訊息
訊息機制是windows的典型執行機制,在mfc中有很多的訊息如wm btn 等。但是在有些情況下我們需要自定義一些訊息去做一些我們需要的功能,mfc的嚮導不能幫助我們做到這一點,我們可以通過新增相應的 去完成這個功能。新增自定義訊息操作如下 1.建立mfc工程,如基於對話方塊的應用程式,test。...
MFC自定義訊息
訊息機制是windows的典型執行機制,在mfc中有很多的訊息如wm btn 等。但是在有些情況下我們需要自定義一些訊息去做一些我們需要的功能,mfc的嚮導不能幫助我們做到這一點,我們可以通過新增相應的 去完成這個功能。新增自定義訊息操作如下 1.建立mfc工程,如基於對話方塊的應用程式,test。...