如何處理視窗疊加時的自定義訊息路由

2021-06-08 20:06:59 字數 1094 閱讀 1915

先看乙個

目的: a可能希望接收b,c,d,d1等各個控制項的訊息。

情況:目前b為一自定義控制項,且在b.h向外提供一通知訊息wm_b_notify(wm_user+101)。

但是a也想要接收c,d的通知訊息,那麼你可能想要setbwndnotify,setcnotify。

但是你需要注意不能使你自定義的訊息id和wm_user+101相同。這樣你可能去b.h裡面找那個wm_b_notify定義的值,倘若控制項繁多,你就難以完成這一任務了。

解決:b和其他控制項要保持一致性。

note1: 不主動向外提供訊息。

當前視窗類的.h檔案不要定義向外部通知的訊息。

note2: 向外部僅提供乙個介面,外部告訴自己訊息傳送的目的地。

外部告訴控制項訊息通知的目的地。

示例:加入d控制項和d1控制項都定義在d.h檔案中,我們的d1控制項會向d通知訊息wm_d1_notify,並且d也會向外通知訊息wm_d_notify,那麼d必須提供乙個介面給使用d類的物件(假設a類)呼叫,這樣d的訊息就通過該介面向外傳送。

a.h裡面有:

dm_d;

a.cpp裡面有:

#define user_message_base(wm_user + 500)

#define um_d_notify(user_message_base + 1)

on_message(um_d_notify, ondnotify)

m_d.setnotifywindow(getsafehwn(), um_d_notify);

a::ondnotify()

{}千萬不要在d.h定義d的通知訊息,像下面這種用法不可取。

如:在d.h裡面有wm_d_notify

在d.cpp裡面有getparent()->postmessage(wm_d_notify, wparam, lparam);

在a.cpp裡面直接

on_message(wm_d_notify, ondnotify)

a::ondnotify()

下面是講解:

VC 如何處理自定義訊息

在sdk程式設計中,對訊息的獲取與分發是通過訊息迴圈來完成。而在mfc程式設計中則是通過採取訊息對映的方式對其進行處理。相比而言,這樣的處理方式要簡單得多,這也是符合物件導向程式設計中盡可能隱含實現細節的原則。乙個完整mfc訊息對映包括對訊息處理函式的原型宣告 實現以及存在於訊息對映中的訊息入口。一...

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 在響應該訊息的對話方塊標頭檔案中找到...