各種自定義訊息通訊

2021-04-19 05:21:03 字數 3074 閱讀 5632

一、普通的自定義訊息方法。

大家都很清楚使用者自定義訊息的範圍,不過,雖然說用會自定義訊息從wm_user開始,但是由於我們的工程裡面一般還有很多其他的控制項,他們也要占用一部分wm_user訊息範圍,所以我們必須為他們留出一部分範圍,這裡,我們保留100個訊息,一般情況下,這可以滿足我們的要求。

(1)定義訊息的值。在我們要發生訊息的地方(例如cmyview.cpp的開始部分)進行如下定義#define wm_msg_1  (wm_user+100)

接下來的工作其實很簡單,我們在前面說了,訊息正常工作有3個部分必須協調:訊息宣告、訊息對映、訊息體。我們就一次進行手工加入。

(2)首先在afx_msg塊中加入訊息宣告:在cmyview.h中,找到如下部分,並加入訊息宣告:

protected:       

// }afx_msg

(3)在message_map塊中新增on_message巨集指令:

begin_message_map(cmyview, cview)

file://}afx_msg_map

end_message_map()

(4)新增訊息函式體:

lpesult cmyview::onmymsg(wparam wparam, lparam lparam)

訊息至此就已經定義完畢,接下來我們就可以啟用訊息了,就可以用我們前面所說的postmessage/sendmessage,一切ok!

二、自定義訊息塊

訊息塊就以乙個range,主要是用來一次處理多個訊息,不過對訊息有乙個要求:訊息的值必須是連續的。這樣做的好處就是:簡化類,可以通過乙個函式來完成一組訊息的處理工作。

通常,訊息塊有4個:on_control_range、on_notify_range、on_command_range和on_update_command_ui_range,他們的使用方法差不多,我就找個比較常用的來談談吧:on_command_range和on_update_command_ui_range

步驟如下:

1. 使用命令範圍巨集

on_command_range巨集接收所有id在某一範圍之內的命令訊息(wm_command訊息)。使用這個巨集可以在乙個函式中處理多條命令。

1) 在類的. h 檔案的}之後定義命令處理函式,以便不受cl0asswizard的干擾。

protected:

file://}afx_msg

afx_msg void ontestcommandrange(uint nid);

declare_message_map()

2) 同樣在}之後,加入on_command_range巨集到類的訊息映像。頭兩個引數定義了要處理的命令id的範圍。這些id有序列大小,且最後乙個id比第乙個大。最後乙個引數是在第一步中定義的訊息處理函式的名稱。

begin_message_map(ctestview,cview)

file://}afx_msg_map

on_command_range(id_test_1,id_test_4,ontestcommandrange)

end_message_map()

3) 用下面的語句新增訊息處理函式。引數nid是要處理命令的id。

void ctestview::ontestcommandrange(uint nid)

}2. 使用使用者介面命令範圍巨集

on_update_command_ui_range巨集擷取一定範圍內的訊息中更新使用者介面的請求。使用這個巨集,可以啟用所有的選單命令或者處理一組工具欄按鈕。

1) 在類的.h 檔案映像的}之後定義使用者介面命令處理函式,以便不受classwizard 的干擾。

protected:

file://}afx_msg

afx_msg void onupdatetestcommandrange(ccmdui* pccmdui);

2) 同樣,在}之後,加入on_update_command_ui_range巨集到使用者類的命令映像中。頭兩個引數定義了要處理的訊息i d 的範圍。這些id有序列大小,最後乙個id值比第乙個大。最後乙個引數是第一步中定義的使用者介面命令處理函式的名字。

begin_message_map(ctestview,cview)

file://}afx_msg_map

on_update_command_ui_range(id_test_1,id_test_4,onupdatetestcommandrange)

end_message_map()

3) 處理介面命令訊息的語句如下:

void ctestview::onupdatetestcommandrange(ccmdui *pcmdui)

}在前面,我們討論了自身類中訊息的傳遞方法和成組的訊息傳遞,接下來的問題就是如何向不同的類中傳遞訊息。其實在《解析vc++6中的指標 》中,我們討論了如何在不同的類中獲取其他類的指標的方法,,我們借用這種獲取指標的方法就可以輕鬆的隨心所欲的在各個類中傳遞訊息了。

首先,定義訊息的方式和我們在上面所說的是一樣的(例如在框架類中向檢視類傳送訊息):

(1)在檢視類.cpp中定義訊息值: #define wm_msg    (wm_user+101)

(2)首先在afx_msg塊中加入訊息宣告:在cmyview.h中,找到如下部分,並加入訊息宣告:

protected:       

// }afx_msg

(3)在message_map塊中新增on_message巨集指令:

begin_message_map(cmyview, cview)

file://}afx_msg_map

end_message_map()

(4)新增訊息函式體:

lpesult cmyview::onmymsg(wparam wparam, lparam lparam)

(5)在主框架中加入測試函式

void cmainframe::ontestmsg()

這裡,我們看到了,只要我們有辦法獲得傳送訊息的目標類的指標,我們就可以任意的傳送訊息,參考我在《解析vc++6中的指標 》一文中的方法,let''s go!

三.本帖 來自於 「http://dev.csdn.net/develop/article/19/19438.shtm」

程序間通訊 自定義訊息

自定義訊息wm copydata,使用sendmessage傳送訊息 最近想實現程序間通訊,遇到一些問題記錄一下。傳送方 dllimport user32.dll entrypoint sendmessage private static extern int sendmessage int hwn...

自定義訊息

自定義訊息的響應和資源訊息的響應有很多類似之處 資源訊息的響應是以資源的id號作為標識的 自定義的訊息要自己宣告訊息id。一 定義 第一步要宣告訊息 definewm mymsgwm user 200 第二步要在類宣告中宣告訊息對映 declare message map 第三步要在類宣告中定義訊息...

c 自定義訊息 程序間通訊

using system using system.collections.generic using system.linq using system.text using system.runtime.interopservices using system.diagnostics namesp...