围绕光标画一个圆圈 (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 条边的表格,并在光标移动时更改它们的位置。
使用 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# 的新手,所以解决方案可能很简单,但我找不到。
简而言之:我希望只有最后绘制的圆圈可见。
我尽力帮助你.... 也许你可以使用计时器来显示圆圈,然后,例如 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 条边的表格,并在光标移动时更改它们的位置。