Delphi 如何使TWinControl仅显示并让其父控件处理所有鼠标事件?

Delphi 如何使TWinControl仅显示并让其父控件处理所有鼠标事件?,delphi,Delphi,我正在创建一个用户组件,在按钮上添加一些额外的标签(使用代码),但是当单击标签时,按钮的onClick事件不会触发 为这些标签创建所有与鼠标相关的事件并将它们指向按钮的事件,既麻烦又无效 是否有更简单的方法让按钮处理所有这些鼠标事件,就像那些标签不存在一样 实际情况要复杂得多,标签是TJvLinkLabel,用于简单的标记呈现,因此简单地在按钮上绘制文本对于我来说不是一个好的选择 谢谢你的帮助 编辑: 更具体地说。有一个按钮数组,每个按钮显示一个表记录的信息。其中每一个都有2个TJvLinkLa

我正在创建一个用户组件,在按钮上添加一些额外的标签(使用代码),但是当单击标签时,按钮的onClick事件不会触发

为这些标签创建所有与鼠标相关的事件并将它们指向按钮的事件,既麻烦又无效

是否有更简单的方法让按钮处理所有这些鼠标事件,就像那些标签不存在一样

实际情况要复杂得多,标签是TJvLinkLabel,用于简单的标记呈现,因此简单地在按钮上绘制文本对于我来说不是一个好的选择

谢谢你的帮助

编辑: 更具体地说。有一个按钮数组,每个按钮显示一个表记录的信息。其中每一个都有2个TJvLinkLabel作为页眉和页脚,其中有简单的标记标题以显示各种字段信息,1个TJvLabel(alClient、shadow、wordwrap)以显示主要描述。每个按钮可以有不同的颜色,甚至有背景图片,这就是为什么需要阴影来显示文本。按钮自身的标题始终设置为空

实际上,我只需要视觉效果(标记渲染、阴影),不需要这些标签的任何交互。我只想让按钮的行为,好像没有其他组件托管

当我搜索stackoverflow时,我看到C#似乎将hittest设置为false或类似的设置,但在Delphi中找不到类似的设置

编辑2: 更简单地说,是否有一种方法可以让父级(本例中的按钮)处理所有鼠标消息,而不传递给其子级(本例中的标签)。谢谢

编辑3:
到目前为止,我已经继承了labels类,并将Click、DblClick、MouseDown、MouseUp过程路由到按钮,同时跳过了其他事件。我想知道是否有更好的解决办法。谢谢。

将标签的
Enabled
属性设置为
False

将标签的
Enabled
属性设置为
False

不要从TWinControl派生,或者如果无法从TWinControl派生,则处理所有鼠标事件并将其传递给父级。您可以在下面查看一些链接:

您可以查看TWinControl的代码:

TWinControl = class(TControl)
protected
  property DefWndProc: Pointer read FDefWndProc write FDefWndProc;
  procedure MainWndProc(var Message: TMessage);
public
  procedure DefaultHandler(var Message); override;

如果控件不是子代,则重写DefWndProc;如果控件不是子代,则重写MainWndProc。

不要从TWinControl派生,或者如果不可能,则重写DefWndProc处理所有鼠标事件并将它们传递给父代。您可以在下面查看一些链接:

您可以查看TWinControl的代码:

TWinControl = class(TControl)
protected
  property DefWndProc: Pointer read FDefWndProc write FDefWndProc;
  procedure MainWndProc(var Message: TMessage);
public
  procedure DefaultHandler(var Message); override;

如果控件不是后代,则重写DefWndProc;如果控件是后代,则重写MainWndProc。

是否在这些标签上使用超链接?你想让谁来处理这些,按钮还是标签。有没有可能用屏幕截图来帮助我们可视化?如果你不能分配一次标签。。可能您可以创建TJvLinkLabel子类,将
单击
覆盖到
父项。单击
,然后使用它?@DavidHeffernan他们没有使用超链接,我只想用标签的视觉效果来替换原始的单一普通标题。@teran我曾经想到过这种方法。这可以通过mousedown、mouseup、click、dblClick来实现,但是mouseenter和mouseleave呢?触发鼠标删除按钮,然后再次触发鼠标删除(通过标签路由)似乎不太好。您是否在这些标签上使用超链接?你想让谁来处理这些,按钮还是标签。有没有可能用屏幕截图来帮助我们可视化?如果你不能分配一次标签。。可能您可以创建TJvLinkLabel子类,将
单击
覆盖到
父项。单击
,然后使用它?@DavidHeffernan他们没有使用超链接,我只想用标签的视觉效果来替换原始的单一普通标题。@teran我曾经想到过这种方法。这可以通过mousedown、mouseup、click、dblClick来实现,但是mouseenter和mouseleave呢?将鼠标从按钮上移开,然后再次(通过标签路径)触发鼠标,这似乎不太好。感谢您的帮助。你的建议在TJvLinkLabel上很有效。伟大的但是,TJvLabel会变成灰色,并且仍然不会对onMouseDown(触发按下效果)做出响应。我最初认为会有一种通用的方法来跳过鼠标事件的处理,所以我没有提到TjvLabel。对不起,谢谢你的帮助。你的建议在TJvLinkLabel上很有效。伟大的但是,TJvLabel会变成灰色,并且仍然不会对onMouseDown(触发按下效果)做出响应。我最初认为会有一种通用的方法来跳过鼠标事件的处理,所以我没有提到TjvLabel。对不起,谢谢你的回答。我的Button组件是从现有Button类派生而来的,它肯定是TWinControl的后代。这两个标签控件的作用相同。当MainWndProc不是虚拟方法时,如何重写它?以及如何将信息传递给家长?坦白地说,我不熟悉消息系统。您可以访问DefWndProc属性(如果您是孩子)。在TWinControl的源代码中查找它,并将该属性更改为指向函数的指针。谢谢您的回答。我的Button组件是从现有Button类派生而来的,它肯定是TWinControl的后代。这两个标签控件的作用相同。当MainWndProc不是虚拟方法时,如何重写它?以及如何将信息传递给家长?坦白地说,我不熟悉消息系统。您可以访问DefWndProc属性(如果您是孩子)。在TWinControl的源代码中查找它,并将该属性更改为指向函数的指针。