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