2012-03-01 17 views
2

我正在创建一个用户组件,在按钮上添加一些额外的标签(使用代码),但当点击标签时,按钮的onClick事件不会触发。如何仅使TWinControl显示并让其父级处理所有鼠标事件?

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

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

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

感谢您的善意帮助。

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

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

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

编辑2: 更简单地说,有没有办法让父母(在这种情况下,按钮)处理所有的鼠标消息,并不传递给它的孩子(在这种情况下标签)。谢谢。

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

+0

您是否在这些标签上使用超链接?你想要处理那些人,按钮或标签。任何屏幕截图的帮助我们可视化的机会? – 2012-03-01 17:14:32

+1

如果你不能分配OnClick的标签..可能你可以创建TJvLinkLabel后代类,重写'Click'到'parent.click',并使用它? – teran 2012-03-01 20:15:38

+0

@DavidHeffernan他们没有使用超链接,我只希望标签的视觉效果能够替换原始单个素描标题。 – Justmade 2012-03-01 23:49:18

回答

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如果是。

+0

谢谢你的回答。我的按钮组件从现有的按钮类下降,这肯定是TWinControl后裔。两个标签控件也一样。当它不是虚拟方法时如何覆盖MainWndProc?以及如何将消息传递给父项?坦率地说,我不熟悉Message系统。 – Justmade 2012-03-02 01:46:23

+0

你可以访问DefWndProc属性(如果你是一个孩子)。在TWinControl的源代码中查找它,并将该属性更改为指向您的函数的指针。 – Mihaela 2012-03-03 20:35:33

1

将标签的Enabled属性设置为False

+0

感谢您的帮助。您的建议在TJvLinkLabel上运行良好。大!但是,TJvLabel变灰,仍然不响应onMouseDown(触发按下的效果)。我认为会有一种通用的方法来跳过鼠标事件的处理,所以我没有提到TjvLabel。抱歉。 – Justmade 2012-03-02 00:08:28