我怎样才能清除TCanvas?或任何其他解决方案

时间:2010-07-12 06:24:43

标签: delphi cursor multiple-mice

我正在使用这个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;

问题不仅仅是显示单个游标,而是mouse trails。我可以清除整个Canvas evertime鼠标移动吗? (虽然听起来不是一个好主意)。也许我可以通过执行相反的代码来清除我之前的Canv.Draw(如果可能的话)?有关如何显示游标的任何建议吗?

编辑: 尝试在设置位图宽度和高度后插入另一个Canv.Draw(currentX,currentY,Bitmap); ...现在问题是我有一条白色的线索(而不是鼠标线),更清洁但仍然不好。

3 个答案:

答案 0 :(得分:4)

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

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


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

不要释放保存透明光标图像的位图,保留在应用程序的生命周期中:您将保存RAM和CPU。这对于需要对小鼠运动做出反应的事物至关重要。

答案 1 :(得分:2)

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

答案 2 :(得分:1)

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

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