我有一个带有控件(myControl)和一个子控件(myChildControl)的表单。
我想管理myControl上的鼠标出口,以便采取一些措施。
问题在于,即使鼠标仍物理位于myControls内,但仍超过myChildControl时,都会触发“离开鼠标”事件,而在这种情况下,我不需要触发该事件。
我无法在子控件中设置HitTest属性,因为我也需要对其上的鼠标事件进行一些操作。
从概念上讲,“鼠标离开”事件可以正确触发,但是处理这种情况的最干净的方法是什么?
答案 0 :(得分:0)
为子控件设置HitTest = False
。然后,在父控件的OnMouseDown
中,使用PtInRect()
检查是否在子控件上发生了鼠标按下事件。
如果需要,您也可以对其他鼠标事件执行相同的操作。
编辑。
我不太同意您的凌乱。下面的示例针对父控件(此示例中为TPanel)上可能需要响应鼠标按下事件的任意数量的子控件。 IMO,将最后两行添加到其他最终事件也没什么大不了的。
procedure TForm20.Panel1MouseDown(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Single);
var
ctrl: TControl;
begin
for ctrl in (Sender as TControl).Controls do
if PtInRect(ctrl.ParentedRect, PointF(X, Y)) then
if assigned(ctrl.OnMouseDown) then
ctrl.OnMouseDown(ctrl, Button, Shift, x-ctrl.Position.X, y-ctrl.Position.Y);
end;
一种完全不同的方法是使用父控件所在的控件的OnMouseEnter
事件(或者如果放置在没有OnMouseEnter
的窗体上,请使用OnMouseMove
),以触发OnExit
替代项。由于这很可能会触发,因此可以通过声明ActionRequired