0

我对用 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 中。)

4

1 回答 1

2

您还需要查看PictureBox 的 Paint事件,最好在 Paint 事件中完成所有图形,因为您不必担心处理图形对象。看看这是否是您想要的。

编辑:添加代码以保留点并清除它们。

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);
            }
        }
    }
}
于 2013-06-25T02:03:21.187 回答