C# 如何在运动中画椭圆?

C# 如何在运动中画椭圆?,c#,.net,graphics,C#,.net,Graphics,我从外部控制器通过自己的SDK获取X和Y坐标 所以,我想把这个坐标变换成一个半透明的圆,并模拟鼠标光标 我有下面的代码,但我只能画半透明的圆,我不能“擦除”以前的圆 我想画半透明的圆,并删除他们,当我画下一个圆。我应该在一个坐标和下面的坐标之间画一些过渡来模拟“运动”。 我发现的另一个问题是,我不能在按钮、文本框等标准组件上画圆圈 //... System.Drawing.Graphics g = this.CreateGraphics(); g.SmoothingMode = System.D

我从外部控制器通过自己的SDK获取X和Y坐标

所以,我想把这个坐标变换成一个半透明的圆,并模拟鼠标光标

我有下面的代码,但我只能画半透明的圆,我不能“擦除”以前的圆

我想画半透明的圆,并删除他们,当我画下一个圆。我应该在一个坐标和下面的坐标之间画一些过渡来模拟“运动”。 我发现的另一个问题是,我不能在按钮、文本框等标准组件上画圆圈

//...
System.Drawing.Graphics g = this.CreateGraphics();
g.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.AntiAlias;

System.Drawing.Color translucentYellow = System.Drawing.Color.FromArgb(128, Color.Yellow);
System.Drawing.SolidBrush aBrush = new System.Drawing.SolidBrush(translucenYellow);

g.CompositingQuality = system.Drawing.Drawing2D.CompositingQuality.GammaCorrected;

g.FillEllipse(aBrush, X, Y, width, height);
//.….

将静态椭圆绘制到一个简单控件,例如
面板
。将面板移到屏幕上。这样,您可以控制重叠的其他窗口和控件。您也不必一直重新绘制椭圆

如果要重叠其他窗口或应用程序,则需要使用
TopMost=true
将此椭圆绘制成
形式。可以从窗体中删除边框


您还可以为
表单设置透明度。

当系统为您做得更好时,不要绘制光标

理想情况下,您需要做的就是:

Cursor = new Cursor("D:\\circle1.cur");
不幸的是,这将不适用于许多版本的cur文件。精确地说,任何超过32x32像素的颜色

因此,您将希望使用更灵活的例程,我发现,请参见下文

像这样使用它

Cursor = CreateCursorNoResize(bmp, 16, 16);
并按如下方式设置光标位置:

Cursor.Position = new Point(yourX, yourY);
每当控制器提出更改时

下面是经过轻微修改的例行程序:

using System.Runtime.InteropServices;
// ..

public struct IconInfo
{
    public bool fIcon;
    public int xHotspot;
    public int yHotspot;
    public IntPtr hbmMask;
    public IntPtr hbmColor;
}
[DllImport("user32.dll")]
[return: MarshalAs(UnmanagedType.Bool)]
public static extern bool GetIconInfo(IntPtr hIcon, ref IconInfo pIconInfo);
[DllImport("user32.dll")]
public static extern IntPtr CreateIconIndirect(ref IconInfo icon);

public static Cursor CreateCursorNoResize(Bitmap bmp, int xHotSpot, int yHotSpot)
{
    IntPtr ptr = bmp.GetHicon();
    IconInfo tmp = new IconInfo();
    GetIconInfo(ptr, ref tmp);
    tmp.xHotspot = xHotSpot;
    tmp.yHotspot = yHotSpot;
    tmp.fIcon = false;
    ptr = CreateIconIndirect(ref tmp);
    return new Cursor(ptr);
}
注:

  • 这家公司有更多的选择
  • 光标将在具有自己的光标的控件(如文本框)上变为不同的光标
光标位于:


更改实际鼠标光标以显示该图像可能更容易些?至于另一个问题:无论你画什么,都应该在绘画事件中绘制或触发;这将处理“旧”的像素。但是在窗体上绘制不会在控件上绘制。。那么,回到我的第一个建议。@TaW那么,您建议我将光标移动到此坐标并更改其外观,不是吗?嗯,这实际上取决于您的用例。它应该仍然充当光标还是仅在外部移动?在后一种情况下,请参考usr的答案:将面板移动到窗体顶部,或者可能移动到另一个窗体。。!实际上,这些坐标是从凝视控制器获得的,其想法是用凝视代替鼠标光标,因此,这应该充当光标。在这种情况下,我想我会将光标设置为图标,然后按代码移动它。
cursor=new cursor(“…”)这次不起作用(无效图像)。所以我想尝试第二个选项,但我不知道我必须把代码放在哪里…在我的表单之外?在同一名称空间中?提前谢谢。表格上的任何地方都可以。上面的using子句与其他子句一起,其余的与函数一起,我想说。。clrify:包含的游标不是游标而是png文件,因此不应与游标的构造函数一起使用。我已将该链接中的原始.cur文件保存在Greenfish图标编辑器(推荐)中为png。这是否意味着用户在动画进行时不能使用鼠标?可以使用鼠标,但如果两者同时尝试移动它,则会发生冲突;这就是为什么我在第一次评论中问这个问题。。多久更新一次?用户多久干预一次?如果一个事件很少发生,可以尝试使用计时器保护用户移动不受控制器干预。您需要将其转换为png文件。有很多工具可以做到这一点。我使用了免费的绿鱼图标编辑器。。