如何仅制作TWinControl显示并让其父级处理所有鼠标事件?

时间:2012-03-01 17:09:13

标签: delphi

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

为这些标签创建所有与鼠标相关的事件并将它们指回按钮的事件是很麻烦且无效的。

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

实际情况要复杂得多,标签是TJvLinkLabel,用于简单的标记渲染,因此只需在按钮上绘制文本就不适合我的情况。

感谢您的帮助。

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

我实际上只需要视觉效果(标记渲染,阴影),并且不需要这些标签的任何交互。我只是希望按钮就像没有托管其他组件一样。

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

Edit2: 更简单的说,有没有办法让父(本例中的按钮)处理所有鼠标消息而不传递给它的子节点(在这种情况下是标签)。感谢。

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

2 个答案:

答案 0 :(得分:3)

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

Handling mouse events

您可以查看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。

答案 1 :(得分:1)

将标签的Enabled属性设置为False