如何在运动中绘制椭圆?

时间:2014-10-08 10:05:03

标签: c# .net graphics

我通过自己的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);
//.….

2 个答案:

答案 0 :(得分:1)

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

如果要与其他窗口或应用程序重叠,则需要将此椭圆绘制为Form TopMost = true。您可以从表单中删除边框。

您也可以为Form设置透明度。

答案 1 :(得分:1)

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

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

Cursor = new Cursor("D:\\circle1.cur");

不幸的是,这不适用于许多版本的cur文件。准确地说,超过32x32像素和颜色。

所以你会想要使用一个更灵活的例程,我发现on this post,见下文..!

像这样使用

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);
}

注意:

  • full code有更多选项
  • 光标将变为与具有自己的光标的控件不同的光标,如文本框..

rw-designer上找到光标:

A_Circle