2012-02-25 71 views
1

我有一個超級標準的自定義Windows控件。我想我的自定義控件通知其父窗口的某些事件。這樣做的最佳做法是什麼?從定製控件通知父窗口的首選方式是什麼?

  • 發送父窗口的窗口消息中的WM_USERWM_APP範圍。這是行不通的,因爲如果另一個子控件嘗試同樣的事情,這些值可能會相互衝突。

  • 發送父窗口WM_NOTIFY。這似乎是正確的做法,但由於我擴展了一個標準的Windows控件,我如何確保我使用的通知代碼不會與基類(現在或將來)發送的通知代碼相沖突?

  • RegisterWindowMessage向父窗口發送窗口消息。這應該足以避免無意的衝突,但Microsoft建議僅將它用於進程間消息。

  • 該控件是否爲應用程序提供了一種機制來指定用於通知的消息。這似乎是唯一可靠的方法,但它也有點像矯枉過正。 (或者,而不是指定窗口消息,我想,應用程序可以傳下一個函數指針。)

我見過a similar question,但唯一的答案有依賴於MFC,並不真的避免碰撞的地址。

其他人通常做什麼?他們是否使用前三種方法之一而不擔心?我希望我的控件適用於我的應用程序之外的更廣泛的消費,所以我也更喜歡使用標準的Win32。

編輯:試圖澄清我在找什麼。

+0

你的意思是繼承?或者你在使用ATL嗎?你想轉發什麼類型的消息,爲什麼? – 2012-02-25 11:21:03

+0

@MikeKwan:超類或子類,它並不重要。但爲了這個問題的目的,你可以假設我是超類(即註冊一個新的窗口類)。假設我使用的是純Win32,所以沒有C++或ATL/WTL。 – jamesdlin 2012-02-25 11:45:15

+0

任何類庫通過將消息反射回原始控件來努力修復borken C消息傳遞模型。所以它可以通過特定於控件實例的消息處理程序進行處理。通過C++基類實現的常見行爲,通過允許客戶端代碼派生自定義行爲。沒有理由在這裏追求古老的方式,通過簡單地不發送消息給父母就可以更容易。並自動解決模糊問題。 – 2012-02-25 15:39:28

回答

0

所以我注意到,所有CommCtrl.h定義的通知碼範圍內的樣子:

#define NM_FIRST    (0U- 0U)  // generic to all controls 
#define NM_LAST     (0U- 99U) 
... 
#define TRBN_FIRST    (0U-1501U)  // trackbar 
#define TRBN_LAST    (0U-1519U) 

所以微軟的共同控制至少已定義的範圍(並且很可能永遠是無符號的大值)。因此,如果我使用超級或子類標準控件並使用從0遞增的通知代碼,我認爲我應該對Windows的當前版本和未來版本安全。

(如果我是來自第三方控件獲得,那麼這些第三方控件需要定義自己的保留範圍,否則所有的賭注將關閉。)

1

由於您超類現有的窗口類並增強其行爲,因此您擔心與現有消息發生衝突是正確的。因此,我覺得你必須使用WM_APP範圍內的信息。你也可以使用RegisterWindowMessage,但我同意這是過度殺傷。

相關問題