我通过自己的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);
//.….
答案 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);
}
注意:
在rw-designer上找到光标: