发生这个问题的关键是两个API的差异。
PtInRect会判断TRect的Left是否比Right大,Top是否比Bottom大,
而InsertClipRect却不进行判断。为了实现楼主的愿望,即响应鼠标动作,
需要修改 PtInRect,因为有一些技巧性,所以将方法讲得详细一些:
1.找到 Controls.pas ,并打开它,在Implementation部分的 Uses Consts,Froms,......
下面写入如下代码:
function PtInRect(R:TRect; P:TPoint):Boolean;
var
MyR:TRect;
begin
if R.Left<R.Right then begin
MyR.Left:=R.Left;
MyR.Right:=R.Right;
end else begin
MyR.Left:=R.Right;
MyR.Right:=R.Left;
end;
if R.Top<R.Bottom then begin
MyR.Top:=R.Top;
MyR.Bottom:=R.Bottom;
end else begin
MyR.Top:=R.Bottom;
MyR.Bottom:=R.Top;
end;
Result:=Windows.PtInRect(MyR,P);
end;
2.将Controls.pas,你的那个定义类的单元文件一起保存到你的那个工程文件所在的目录下面,
将这些文件重新编译(一定要真的从新编译!),
这样你就可以看到你的控件响应鼠标事件了,鼠标位置为负数。
btw:你的所谓“反转”是不准确的,因为用 MoveTo(0,0); LineTo(100,100);
这样的图形是显示不出来的,而只有MoveTo(0,0); LineTo(Width,Height);才好像反转了,
而实际上,是因为width,Height变成负数的原因,并非是真的反转了。