VC 如何處理自定義訊息

2021-05-25 06:29:28 字數 1838 閱讀 3643

在sdk程式設計中,對訊息的獲取與分發是通過訊息迴圈來完成。而在mfc程式設計中則是通過採取訊息對映的方式對其進行處理。相比而言,這樣的處理方式要簡單得多,這也是符合物件導向程式設計中盡可能隱含實現細節的原則。乙個完整mfc訊息對映包括對訊息處理函式的原型宣告、實現以及存在於訊息對映中的訊息入口。一般情況下出了對自定義的訊息響應外,對於標準windows訊息的對映處理可以借助classwizard嚮導來完成。

自定義訊息可分為四步:

第一步:定義訊息。開發windows95應用程式時,microsoft推薦使用者自定義訊息至少是wm_user+100,因為很多新控制項也要使用wm_user訊息。

第二步:實現訊息處理函式。該函式使用wpram和lparam引數並返回lpesult。

lpesult cmainframe::onmymessage(wparam wparam, lparam lparam)

第三步:在類標頭檔案的afx_msg塊中說明訊息處理函式:

class cmainframe:public cmdiframewnd

}afx_msg

declare_message_map()

}第四步:在使用者類的訊息塊中,使用on_message巨集指令將訊息對映到訊息處理函式中。

begin_message_map(cmainframe, cmdiframewnd)

//}afx_msg_map

end_message_map()

如果使用者需要乙個整個系統唯一的訊息,可以呼叫sdk函式registerwindowmessage並使用on_register_message巨集指令取代on_message巨集指令,其餘步驟同上。

附: 訊息迴圈結構一般入下:

while (getmessage(&msg, (hwnd) null, 0, 0)) }

2. mfc還提供了其他一些用於訊息對映的巨集,詳情可參見下表:

巨集名 說明

declare_message_map 在標頭檔案宣告原始檔中所含有的訊息對映

begin_message_map 標記原始檔訊息對映的開始

end_message_map 標記原始檔訊息對映的結束

on_command 將特定命令的處理委派給類的乙個成員函式

on_control 對映乙個函式到乙個定製控制通知訊息。其中,定製控制通知訊息是從乙個控制傳送到其父視窗的訊息。

on_control_range 將乙個控制id的範圍對映到乙個訊息處理函式

on_control_reflect 對映乙個由父視窗反射回控制的通知訊息

on_message 將乙個使用者自定義訊息對映到一訊息處理函式

on_notify  對映乙個控制訊息到乙個函式

on_notify_range 對映乙個控制id範圍內的控制訊息到乙個函式

on_notify_ex 對映乙個控制訊息到乙個函式,該成員函式返回false或true來表明通知是否應被傳送到下乙個物件以進行其他反應。

on_notify_ex_range 對映乙個控制id範圍內的控制訊息到乙個函式,該成員函式返回false或true來表明通知是否應被傳送到下乙個物件以進行其他反應

on_notify_reflect 對映乙個控制訊息到乙個函式。該訊息將會被控制的父視窗反射回來。

on_registered_message 對映乙個唯一的訊息到乙個將要處理該註冊訊息的函式上。該訊息是由registerwindowmessage()函式註冊的。

on_update_command_ui  對映乙個函式來處理乙個使用者介面更新命令訊息

on_update_command_ui_range 對映乙個命令id的範圍到乙個更新訊息處理函式

3. 巨集工作原理

VC 如何處理自定義訊息

classwizard不允許增加使用者自定義訊息,所以你必須手工輸入。輸入後,classwizard就可以象處理其它訊息一樣處理你自定義的訊息了。下面是增加自定義訊息的步驟 第二步 實現訊息處理函式。該函式使用wpram和lparam引數並返回lpesult。lpesult cmainframe o...

MFC中如何處理自定義訊息

假設自定義訊息號是wm test,訊息處理函式是ontest,處理該訊息的對話方塊指標是m ptestdlg,則進行自定義訊息處理的步驟主要有以下 1 定義訊息號,建議在stdafx.h中進行定義 define wm test wm user 1 自定義訊息 2 在響應該訊息的對話方塊標頭檔案中找到...

VC 對於自定義訊息處理

無模式對話方塊與有模式對話方塊不同的是在建立後其他視窗都可以繼續接收使用者輸入,因此無模式對話方塊有些類似乙個彈出視窗。建立無模式對話方塊需要呼叫 bool cdialog create uint nidtemplate,cwnd pparentwnd null 之後還需要呼叫 bool cdial...