围绕光标画一个圆圈 (C#)

Draw a circle around cursor (C#)

使用 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();
}

我必须进行一些更改的原因是 我的应用程序从控制台运行并且不使用表单。这意味着我无法使用其他问题中提供的解决方案。

上面的代码确实绘制了圆圈,但是它们并没有消失,正如您在这张图片中看到的那样:

其他需要注意的是,我的应用程序需要运行,即使它的控制台未处于活动状态 window(现在可以正常工作)。

现在,我是 C# 的新手,所以解决方案可能很简单,但我找不到。

简而言之:我希望只有最后绘制的圆圈可见。

我尽力帮助你.... 也许你可以使用计时器来显示圆圈,然后,例如 1 秒,隐藏它。 可以解决吗?

要么你需要一个 Panel,一个 Form 或者继承自 Control 的东西。 然后您要么重写 OnPaint 要么绑定到 Paint 事件。

基于此处的答案:draw on screen without form

这有效,你只会在屏幕上看到你的圆圈,你不能 ALT + TAB 离开它,因为它在最上面。

事件也在进行中,这意味着 Windows 始终可用。

一个例外是,它目前仅使用主屏幕显示圆圈。

如果定时器太慢,您可以在绘图后调用 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();
    }
}

每次要画圆:

  • 恢复上次绘制前的图像,
  • 保存要画圆的矩形,
  • 画圆。

此程序保存周围矩形的图像:

Bitmap saveBitmap = null ;
Rectangle saveRect ;

private void SaveCircleRect(Graphics graphics,int x, int y, int size)
{
    saveBitmap  = new Bitmap(2*size,2*size,graphics);
    saveRect = new Rectangle(x-size/2, y-Size/2, Width, Height);
 }

此程序使用保存的矩形恢复屏幕图像:

private void RestoreCircleRect(Graphics graphics)
{
   if (saveBitmap!=null) graphics.DrawImage(saveBitmap,saveRect);
}

但是,当重点应用程序发生变化或 resized/redrawn.

时,您将面临很多问题

一个替代解决方案可以是显示 4 个最细的代表正方形 4 条边的表格,并在光标移动时更改它们的位置。