【发布时间】:2012-03-15 15:21:31
【问题描述】:
我有一个超类标准控件的自定义 Windows 控件。我希望我的自定义控件通知其父窗口某些事件。这样做的最佳做法是什么?
向父窗口发送
WM_USER或WM_APP范围内的窗口消息。这将不起作用,因为如果另一个子控件尝试相同的操作,值可能会发生冲突。发送父窗口
WM_NOTIFY。这似乎是正确的做法,但由于我正在扩展标准 Windows 控件,如何确保我使用的通知代码不会与基类(现在或将来)通常发送的通知代码冲突?从
RegisterWindowMessage向父窗口发送窗口消息。这应该足以避免意外冲突,但 Microsoft 建议仅将其用于进程间消息。让控件为应用程序提供一种机制来指定用于通知的
WM_APP消息。这似乎是唯一稳健的方法,但也感觉有点矫枉过正。 (或者,我认为应用程序可以传递一个函数指针,而不是指定窗口消息。)
我见过a similar question,但唯一的答案与 MFC 相关,并没有真正解决避免冲突的问题。
其他人通常会做什么?他们是否使用前三种方法之一而不担心它?我希望我的控件适合在我的应用程序之外更广泛地使用,所以我也更喜欢使用标准 Win32。
编辑:试图澄清我在寻找什么。
【问题讨论】:
-
你的意思是子类吗?或者你正在使用ATL?您要转发什么样的消息?为什么?
-
@MikeKwan:超类或子类,这并不重要。但是出于这个问题的目的,您可以假设我正在超类化(即注册一个新的窗口类)。并假设我使用的是纯 Win32,所以没有 C++ 或 ATL/WTL。
-
任何类库都努力通过将消息反射回原始控件来修复 borken C 消息传递模型。因此它可以由特定于控件实例的消息处理程序进行处理。通过 C++ 基类实现的通用行为,通过允许客户端代码派生来定制行为。没有理由在这里追求旧的方式,您只需不向父母发送消息就可以轻松得多。并自动解决歧义问题。
标签: winapi