VC中自定義訊息的處理

2021-04-20 21:02:55 字數 1189 閱讀 3013

由於在實際的專案中一直沒用用過自定義訊息完成某功能,所以雖然以前看書了,知道怎麼做但是早還給課本了。

今天想實現這樣乙個功能,查了查資料記錄下來。

另外vcbase上有個簡單的示例。

開始時要明白windows訊息投遞有2種方式:

postmessage   和sendmessage的區別主要在於是否等待其他程式訊息處理。postmessage只是把訊息放入佇列,不管其他程式是否處理都繼續執行,而 sendmessage必須等待其他程式處理訊息後才繼續執行。這兩個函式的返回值也不能,postmessage的返回值表示postmessage函 數執行是否正確,而sendmessage的返回值表示其他程式處理訊息後的返回值。   

1、肯定是定義訊息了這個很easy。 #define wm_*** wm_user+100 建議從100開始,因為可能有些新的控制項用了wm_user+1

2、在將要處理的對話方塊類中加入對應的訊息響應函式。

在.h 中加入函式宣告 afx_msg bool ondo(wparam wp); 

然後再.cpp的begin_message_map和end_message_map中加入on_message(wm_***, ondo)

最後實現這個函式。

這裡需要說明的是如果像上面那樣寫的話,vc7、8以後的編譯器都會報錯,好像vc6不會。

錯誤資訊如下:

error   c2440:   「static_cast」   :   無法從「lresult   (__thiscall   ondo::*   )(wparam)」轉換為「lresult   (__thiscall   cwnd::*   )(wparam,lparam)」 

這裡需要這麼做:

將函式的返回值修改為lresult,同時將引數改為wparam,lparam 。也就是這麼實現

afx_msg lresult ondo(wparam wparam, lparam lparam);

3,最後在子對話方塊裡必須知道該自定義訊息傳送到哪個視窗中,如果你在父對話方塊中採用

domodal();的話,雖然子視窗的建構函式有引數是父視窗的cwnd,但是它是null。所以可以這麼做

在子視窗中調this->getparent();如果有多個子視窗,可以一直掉他的getparent直到得到該訊息的目的視窗。

雖然簡單的問題,但是2和3都是我遇到的,解決了2、3程式就順利的完成了我要實現的功能。

VC 對於自定義訊息處理

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

VC自定義訊息

示例 主對話方塊a edit控制項 副對話方塊b edit控制項 將b中edit內容在其銷毀後,顯示在a中edit中 1 自定義訊息 define wm mymsg wm user 100 2 b cpp afxgetmainwnd sendmessage wm mymsg,wparam 0,lpa...

VC中自定義訊息實現

在vc專案開發中,很多時候需要自己定義訊息進行事務處理。上次也剛好有同學問及,這裡綜合網路上的一些資料,集中起來供參考。u 自定義訊息 我們可以通過一下兩種方法來自定義乙個訊息 1 方法一 step 1 使用wm taskbarcreated來確定乙個沒有被windows本身搶占 的訊息值,在想新增...