从自定义控件通知父窗口的首选方法是什么?

时间:2012-02-25 10:34:38

标签: winapi

我有一个自定义的Windows控件,可以超级标准的控件。我希望我的自定义控件通知其父窗口某些事件。这样做的最佳做法是什么?

  • 向父窗口发送WM_USERWM_APP范围内的窗口消息。这是行不通的,因为如果另一个子控件尝试相同的操作,则值可能会发生冲突。

  • 发送父窗口WM_NOTIFY。这似乎是正确的做法,但由于我正在扩展标准Windows控件,我如何确保我使用的通知代码不会与通常由基类(现在或将来)发送的通知代码发生冲突?

  • 向父窗口发送RegisterWindowMessage的窗口消息。这应该足以避免无意的冲突,但Microsoft建议仅将其用于进程间消息。

  • 让控件为应用程序提供一种机制,以指定用于通知的WM_APP消息。这似乎是唯一可靠的方法,但它也有点像矫枉过正。 (或者,我认为应用程序可以传递一个函数指针,而不是指定一个窗口消息。)

我见过a similar question,但唯一的答案与MFC有关,并没有真正解决避免碰撞的问题。

其他人通常做什么?他们是否使用前三种方法中的一种而不担心它?我希望我的控件适合我应用程序之外的更广泛的使用,所以我也更喜欢使用标准的Win32。

编辑:试图澄清我在寻找什么。

2 个答案:

答案 0 :(得分:1)

由于您正在对现有窗口类进行超类并增强其行为,因此您可以担心与现有消息发生冲突。因此,我觉得您必须使用WM_APP范围内的邮件。你同样可以使用RegisterWindowMessage,但我同意这是过度的。

答案 1 :(得分: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)

因此,Microsoft的常用控件至少具有已定义的范围(并且可能始终是大的无符号值)。因此,如果我对标准控件进行超级或子类化并使用从0递增的通知代码,我认为我应该对当前和未来版本的Windows安全。

(如果我是从第三方控件派生的,那么这些第三方控件需要定义自己的保留范围。否则所有投注都将关闭。)