Winapi 什么';从自定义控件通知父窗口的首选方式是什么?

Winapi 什么';从自定义控件通知父窗口的首选方式是什么?,winapi,Winapi,我有一个自定义的Windows控件,它将标准控件超类化。我希望自定义控件将某些事件通知其父窗口。这样做的最佳实践是什么 在WM_用户或WM_应用程序范围内向父窗口发送窗口消息。这将不起作用,因为如果另一个子控件尝试相同的操作,这些值可能会发生冲突 发送父窗口WM\u NOTIFY。这似乎是正确的做法,但既然我正在扩展一个标准Windows控件,如何确保我使用的通知代码不会与基类(现在或将来)通常发送的通知代码冲突 从RegisterWindowMessage向父窗口发送窗口消息。这应该足以避免

我有一个自定义的Windows控件,它将标准控件超类化。我希望自定义控件将某些事件通知其父窗口。这样做的最佳实践是什么

  • WM_用户
    WM_应用程序
    范围内向父窗口发送窗口消息。这将不起作用,因为如果另一个子控件尝试相同的操作,这些值可能会发生冲突

  • 发送父窗口
    WM\u NOTIFY
    。这似乎是正确的做法,但既然我正在扩展一个标准Windows控件,如何确保我使用的通知代码不会与基类(现在或将来)通常发送的通知代码冲突

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

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

我已经看到了,但唯一的答案是与MFC有关,并没有真正解决避免碰撞的问题

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


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

既然您正在对现有窗口类进行超分类并增强其行为,那么您担心与现有消息发生冲突是正确的。因此,我觉得您必须在
WM\u应用程序中使用消息。您也可以很好地使用
RegisterWindowMessage
,但我同意这是过分的。

因为您正在对现有窗口类进行超级分类并增强其行为,所以您担心与现有消息发生冲突是正确的。因此,我觉得您必须在
WM\u应用程序中使用消息。您也可以很好地使用
RegisterWindowMessage
,但我同意这是过分的。

因此我注意到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


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

因此我注意到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


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

您是指子类吗?或者您正在使用ATL?你想转发什么样的消息?为什么?@MikeKwan:超类还是子类,这并不重要。但是对于这个问题,您可以假设我正在超类(即注册一个新的窗口类)。假设我使用纯Win32,所以没有C++或ATL/WTL。任何类库都会通过将消息反射回原始控件来修复Bur肯C消息传递模型。因此,它可以由特定于控件实例的消息处理程序进行处理。通过C++基础类实现的通用行为,通过允许客户端代码派生来定制行为。在这里,没有理由追求老一套的方式,您只需不向家长发送消息,就可以轻松多了。自动解决了歧义问题。你是说子类吗?或者您正在使用ATL?你想转发什么样的消息?为什么?@MikeKwan:超类还是子类,这并不重要。但是对于这个问题,您可以假设我正在超类(即注册一个新的窗口类)。假设我使用纯Win32,所以没有C++或ATL/WTL。任何类库都会通过将消息反射回原始控件来修复Bur肯C消息传递模型。因此,它可以由特定于控件实例的消息处理程序进行处理。通过C++基础类实现的通用行为,通过允许客户端代码派生来定制行为。在这里,没有理由追求老一套的方式,您只需不向家长发送消息,就可以轻松多了。并自动解决歧义问题。