我创建了一个VCL表单,其中包含一个tframe的多个副本,每个副本包含多个tlabel组件。标签占据了框架内部的大部分区域,几乎没有暴露的框架区域用于专门选择框架。当用户选择框架组件并在各种标签标题中显示特定文本时,该程序必须采取措施。问题是,如果用户单击标签组件之一而不是框架中的开放区域,则不会触发onclick事件。如果用户指向并单击框架中的任何位置,如何生成框架的onclick事件?
也将相同的OnClick
事件处理程序也分配给内部的每个标签。多个控件可以共享同一事件处理程序,只要它们具有相同的签名即可。
如果您不介意Label的文本为灰色,则只需将Labels的Enabled
属性设置为False
。这将防止您的标签捕获任何键盘或鼠标事件,因此所有这些事件都将到达底层框架。
VCL在确定控件是否为有效目标之前,先测试控件对鼠标事件的响应。您可以使用专门的标签来修改此响应。如果期望所有标签的行为相同,最简单的方法是在帧单元中使用插入器类。
type
TLabel = class(vcl.stdctrls.TLabel)
protected
procedure CMHitTest(var Message: TCMHitTest); message CM_HITTEST;
end;
TMyFrame = class(TFrame)
...
...
procedure TLabel.CMHitTest(var Message: TCMHitTest);
begin
Message.Result := HTNOWHERE;
end;