Delphi 为什么不';t表单是否为TFrame的子级接收WM_NOTIFY消息?

Delphi 为什么不';t表单是否为TFrame的子级接收WM_NOTIFY消息?,delphi,winapi,tframe,window-messages,Delphi,Winapi,Tframe,Window Messages,WM_NOTIFY消息通常用于就地“工具提示”(消息气球)和其他控件通知,但如果我将控件放置在TFrame上,则这些控件永远不会出现WM_NOTIFY消息。为什么这些消息不再发送到我的表单,我能做些什么?WM\u NOTIFY被发送到控件的父窗口。这意味着t帧,而不是它自己的父级t表单(或另一父级),将接收其直接子控件的消息 您不应该直接处理WM\u NOTIFY。子类化子控件本身,例如为其分配一个新的WindowProc处理程序,然后处理CN\u NOTIFY消息。VCL将接收原始的WM_NO

WM_NOTIFY消息通常用于就地“工具提示”(消息气球)和其他控件通知,但如果我将控件放置在TFrame上,则这些控件永远不会出现WM_NOTIFY消息。为什么这些消息不再发送到我的表单,我能做些什么?

WM\u NOTIFY
被发送到控件的父窗口。这意味着
t帧
,而不是它自己的父级
t表单
(或另一父级),将接收其直接子控件的消息

您不应该直接处理
WM\u NOTIFY
。子类化子控件本身,例如为其分配一个新的
WindowProc
处理程序,然后处理
CN\u NOTIFY
消息。VCL将接收原始的
WM_NOTIFY
消息,并将其作为
CN_NOTIFY
消息自动转发给它所属的特定控件


这同样适用于
WM_命令
(作为
CN_命令
转发)和许多其他转发的系统消息。Controls.pas单元定义了为转发的系统消息定义的所有可用
CN.
消息。

我无法复制您的问题。工具提示窗口样式=0,TToolInfo.uFlags:=TTF_IDISHWND或TTF_子类,Info.hwnd:=Form.Handle,Info.uId:=Control.Handle,表单本身接收WM_NOTIFY,例如TTN_SHOW和TTN_POP,而不是框架或其他任何东西(当然是窗口控件)。我认为你在设置工具提示本身时出错了。这是一个概括的答案,不适用于这个特定的问题。如果设置正确,工具提示控件将与其所有者窗口交互。这是有意义的,因为通知的是工具提示控件,而不是单个的子控件。这可能是一个广义的答案,但Alfa000提出了一个广义的问题。在不知道他/她如何实际创建和显示工具提示的具体细节的情况下,
TForm
很可能不是工具提示的所有者窗口,这将解释为什么
TForm
没有接收放置在
TFrame
上的控件的
WM\u NOTIFY
消息。我猜他/她实际上使用的是
Control.Handle
Control.Parent.Handle
(后者将允许
WM\u NOTIFY
发送到
TForm
窗口,用于放置在
TForm
本身上的控件)。我不反对你的评论,但答案仍然不适用。它表示“WM_NOTIFY被发送到控件的父窗口”,工具提示控件的窗口没有父窗口,它是一个弹出窗口。Alfa000还提到了控件通知,而不仅仅是工具提示。我的评论肯定适用于控制通知。啊,事实上他没有。在Rob修改后,我没有重新阅读这个问题,“其他控制”是他的解释。此外,修改后的标题现在会询问您的答案。。。好吧,很抱歉给您添麻烦:)。让我们看看阿尔法有什么要说的。。