这个问题有点麻烦:因为落在 Lable 和 Image 上的 WM_LBUTTONDOWN 消息都传到 Application 那个该死的东西上去了,主 Form 根本不会接到这一消息,因此即使得到了鼠标坐标也无济于事...
解决办法还是有的,在 Form 上放一个 ApplicationEvents,然后:
procedure TForm1.ApplicationEvents1Message(var Msg: tagMSG;
var Handled: Boolean);
var
i: Integer;
begin
if (Msg.message = WM_LBUTTONDOWN) and (Msg.hwnd = Handle) then
for i := 0 to ComponentCount - 1do
if (Components.ClassName = 'TShape') and PtInRect(TControl(Components).BoundsRect, ScreenToClient(Msg.pt)) then
TShape(Components).Brush.Color := TShape(Components).Brush.Color xor clWhite;
end;
上面的代码,无论鼠标点在 Lable 还是 Image 上,都能正确运行;如果想更精确,例如 Shape 是圆形,在圆形区域外点击无效,可以用 PtInRegion 代替 PtInRect,不过这时需要判断 Shape 的形状;体力活,我懒的写了,凑合用吧...