使用 C#;
我正在尝试使用 Leap Motion 传感器创建一个应用程序,将手指移动映射到光标移动。在屏幕上,我想在光标周围画一个圆圈。
经过一番搜索,我发现有人试图做同样的事情(Leap Motion 除外)Want a drawn circle to follow my mouse in C# 。 那里提供的代码:
private void drawCircle(int x, int y)
{
Pen skyBluePen = new Pen(Brushes.DeepSkyBlue);
Graphics graphics = CreateGraphics();
graphics.DrawEllipse(
skyBluePen, x - 150, y - 150, 300, 300);
graphics.Dispose();
this.Invalidate();
}
我做了一些更改以使其适用于我的应用程序:
private void drawCircle(int x, int y, int size)
{
Pen skyBluePen = new Pen(Brushes.DeepSkyBlue);
Graphics graphics = Graphics.FromHwnd(IntPtr.Zero);
graphics.DrawEllipse(
skyBluePen, x - size / 2, y - size / 2, size, size);
graphics.Dispose();
}
我必须进行一些更改的原因是因为我的应用程序从控制台运行并且不使用表单。这意味着我无法使用其他问题中提供的解决方案。
上面的代码确实绘制了圆圈,但它们并没有消失,如下图所示:
需要注意的其他事情是,即使我的应用程序的控制台不是事件窗口(现在可以使用),我的应用程序也需要运行。
现在,我对 C# 非常陌生,因此解决方案可能非常简单,但我找不到它。
简而言之:我希望只有最后绘制的圆圈可见。
最佳答案
您需要一个面板、一个表单或从 Control 继承的东西。 然后您可以重写 OnPaint 或绑定(bind)到 Paint Event。
基于此处的答案:draw on screen without form
此方法有效,您只会在屏幕上看到您的圆圈,您无法按 ALT + TAB 键将其移出,因为它位于最顶部。
此外,事件正在进行中,这意味着 Windows 始终可用。
一个异常(exception)是,它当前仅使用主屏幕来显示圆圈。
如果计时器太慢,您可以在绘图后调用 Invalidate();
,但我不确定这是否可能是性能问题。
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
this.DoubleBuffered = true;
BackColor = Color.White;
FormBorderStyle = FormBorderStyle.None;
Bounds = Screen.PrimaryScreen.Bounds;
TopMost = true;
TransparencyKey = BackColor;
timer1.Tick += timer1_Tick;
}
Timer timer1 = new Timer() { Interval = 15, Enabled = true};
protected override void OnPaint(PaintEventArgs e)
{
DrawTest(e.Graphics);
base.OnPaint(e);
}
private void DrawTest(Graphics g)
{
var p = PointToClient(Cursor.Position);
g.DrawEllipse(Pens.DeepSkyBlue, p.X - 150, p.Y - 150, 300, 300);
}
private void timer1_Tick(object sender, EventArgs e)
{
Invalidate();
}
}
关于c# - 围绕光标绘制一个圆圈 (C#),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31610878/