1

我正在使用这个 TCanvas 为我的鼠标绘制光标

Canv := TCanvas.Create;
Canv.Handle := GetWindowDC(0);

.... 对于每个老鼠事件,请执行以下操作

Bitmap:=TBitmap.Create;
CursorInfo.cbSize := sizeof(CursorInfo);
GetCursorInfo(CursorInfo);

Bitmap.Width := 32;
Bitmap.Height := 32;
Bitmap.Transparent:=true;

DrawIconEx(Bitmap.Canvas.Handle, 0,0, CursorInfo.hCursor, 32,32, 0,0, DI_NORMAL) ;

Bitmap.Canvas.Brush.Color := RGB(250,250,250);
Bitmap.Canvas.FloodFill(31,0, clWhite, fsSurface);
Bitmap.Canvas.FloodFill(0,0, clWhite, fsSurface);

currentX:=getcurrentxpos;
currentY:=getcurrentypos;

Canv.Draw(currentX,currentY,Bitmap);
Bitmap.Free;

问题不只是显示单个光标,而是显示鼠标轨迹。我可以在鼠标移动时清除整个画布吗?(虽然听起来不是一个好主意)。也许我可以Canv.Draw通过执行该代码的反向来清除我以前的代码(如果可能的话)?关于如何显示光标的任何建议?

编辑:尝试Canv.Draw(currentX,currentY,Bitmap);在设置位图宽度和高度后插入另一个……现在的问题是我有一条白色的轨迹(而不是鼠标轨迹),干净得多,但仍然没有好处。

4

3 回答 3

4

你在桌面上绘图,这是你永远不应该做的事情,因为它不可靠。据我了解,您希望找到一种在桌面上绘制鼠标光标的方法,当鼠标再次移动时,“撤消”您的最后一次绘制并在新坐标处重新绘制鼠标。想象一下:您将鼠标移动到备忘录框上的某个位置,将您的手移到键盘上,键入一些内容,然后再次移动鼠标。老鼠下的形象变了!

你可以做什么:创建一个鼠标光标形状的表格,有已知的技术可以做到这一点。让你的伪光标保持在顶部(你也会遇到一些问题,因为 Windows 不再喜欢保持在顶部的东西)。这不会是一件容易的事,但它是可以管理的,而且是按照规则来玩的。


对你到目前为止所获得的内容进行一点代码审查,因为我发现了我认为这是一个错误的地方,你应该知道。修复此问题不足以解决您的问题,您需要停止在桌面上绘图:

不要释放保存透明光标图像的位图,如果在应用程序的生命周期内保留:您将节省 RAM 和 CPU。这对于需要对老鼠的运动做出反应的东西至关重要。

于 2010-07-12T08:08:31.260 回答
2

我将向您展示一种方式,这与我之前建议您的方式不同。
您将画布存储Canvas.CopyRect在一些临时画布中。当您的鼠标第一次悬停在画布上时。
然后,当您移动鼠标时,首先将临时画布复制到目标画布,然后绘制光标。

于 2010-07-12T07:04:04.683 回答
1

有一个参考图像(这是您的画布在没有鼠标光标的情况下应该看起来的样子),将其复制到一个临时位图,然后在该临时位图上绘制您的光标。最后,在画布上绘制图像。

它还允许您非常轻松地拥有更复杂的临时叠加层:您只需根据它们的 Z 顺序将它们绘制在参考位图的顶部。由于它们没有接触背景,因此您不必担心清除鬼影。

于 2010-07-12T08:00:48.337 回答