在PictureBox中,在鼠标放下时绘制一个临时圆圈,以跟随鼠标,直到检测到mouseUp事件
本文关键字:鼠标 事件 跟随 mouseUp 检测 放下 PictureBox 绘制 一个 | 更新日期: 2023-09-27 18:19:41
我对C#绘图非常陌生,而且我使用的是Windows窗体而不是WPF,所以也许我从一开始就做错了。。。你告诉我……但我想在PictureBox(MouseDown上)上放一个临时标记,它将跟随鼠标(擦除之前的绘图,即不留下痕迹),然后在MouseUp事件的最终位置绘制。
下面是一些你们可以填写的骨架代码:
bool mDown;
Graphics g; // initialized to pictureBox1.CreateGraphics() on Form_Load, though
// I am unsure how that differs from Graphics.FromImage(pictureBox1)
SolidBrush sbGray, sbGreen;
private void pictureBox1_MouseDown(object sender, MouseEventArgs e)
{
mDown = true;
// store/push initial drawing
g.FillEllipse(sbGray, e.X - 5, e.Y - 5, 10, 10);
}
private void pictureBox1_MouseMove(object sender, MouseEventArgs e)
{
if (mDown)
{
// restore/pop initial drawing, erasing old trail
g.FillEllipse(sbGray, e.X - 5, e.Y - 5, 10, 10);
}
}
private void pictureBox1_MouseClick(object sender, MouseEventArgs e)
{
// restore/pop initial drawing, erasing old trail
g.FillEllipse(sbGreen, e.X - 5, e.Y - 5, 10, 10);
mDown = false;
}
我想有几种方法可以剥猫的皮,比如改变鼠标图标,所以也许这甚至不是最好的方法?即便如此,我可能需要知道这两个问题的答案——是否有更好的方法来做到这一点,以及如何从PictureBox中提取图形(因为这些知识很可能在以后证明是有用的。)
(注意:虽然灰色圆圈应该自行擦除,但绿色圆圈应该是持久的,并且多个绿色圆圈应该能够同时存在于PictureBox中。)
您还需要查看PictureBox的绘制事件,最好在绘制事件中完成所有图形,因为您不必担心处理图形对象。。看看这是否是你想要的。
编辑:添加了保留点和清除点的代码。
public partial class Form1 : Form
{
bool mDown;
SolidBrush sbGray = new SolidBrush(Color.Gray);
SolidBrush sbGreen = new SolidBrush(Color.LimeGreen);
SolidBrush sbTemp;
Point mPosition = new Point();
public List<Point> points = new List<Point>();
public Form1()
{
InitializeComponent();
pictureBox1.Image = Image.FromFile(@"C:'Temp'Test.jpg");
}
private void pictureBox1_MouseDown(object sender, MouseEventArgs e)
{
if (e.Button == MouseButtons.Left)
{
mDown = true;
mPosition = new Point(e.X, e.Y);
sbTemp = sbGray;
pictureBox1.Invalidate();
}
else
{
points.Clear();
sbTemp = null;
pictureBox1.Invalidate();
}
}
private void pictureBox1_MouseMove(object sender, MouseEventArgs e)
{
if (mDown)
{
mPosition = new Point(e.X, e.Y);
sbTemp = sbGray;
pictureBox1.Invalidate();
}
}
private void pictureBox1_MouseUp(object sender, MouseEventArgs e)
{
if (e.Button == MouseButtons.Left)
{
mPosition = new Point(e.X, e.Y);
points.Add(mPosition);
sbTemp = sbGreen;
pictureBox1.Invalidate();
mDown = false;
}
}
private void pictureBox1_Paint(object sender, PaintEventArgs e)
{
if (sbTemp != null)
{
e.Graphics.FillEllipse(sbTemp, mPosition.X -5, mPosition.Y -5, 10, 10);
}
if (points != null)
{
foreach (var loc in points)
{
e.Graphics.FillEllipse(sbGreen, loc.X - 5, loc.Y - 5, 10, 10);
}
}
}
}