c#用鼠标绘图

时间:2011-05-17 20:43:15

标签: c# drawing

我想通过鼠标e.Xe.Y进行绘制。我知道我应该使用list<Point>,但我不知道该怎么做。不幸的是我遇到drawlines的问题,我不能这样做。

有人告诉我,我应该使用drawlines而不是Fillellipse

这是我当前图纸和我想要做的图纸的图片:

drawing http://img.fileup.cz/?di=1413056646794

以下是代码:

private void panel1_MouseMove(object sender, MouseEventArgs e)
{

if (action2)
{
stetec = new SolidBrush(lbl_color.BackColor);
Graphics kp = panel1.CreateGraphics();
kp.FillEllipse(stetec, e.X, e.Y, 14, 14);
kp.Dispose();
}
}

private void panel1_MouseUp(object sender, MouseEventArgs e)
{
action2 = false;


}

private void panel1_MouseDown(object sender, MouseEventArgs e)
{
action2 = true;
}

private void panel1_Paint(object sender, PaintEventArgs e)
{


} 

2 个答案:

答案 0 :(得分:14)

因此,首先,不要直接在MouseMove处理程序中执行绘图。将所有绘图代码保留在OnPaint覆盖中,并使用提供的图形对象。只需在MouseMove处理程序中维护一组点。原因(一个原因)是OnPaint将被无法预测地调用,你的绘图将被删除,因为逻辑不会在OnPaint中执行。尝试最小化窗口并再次最大化以查看我的意思。

至于你的另一个问题,就像我说的那样,只需维护一组Point个对象。使用接受点集合的Graphcis.DrawLines方法覆盖OnPaint并在那里绘制点。所以你的代码变得像......

private void panel1_MouseMove(object sender, MouseEventArgs e)
{    
  if (action2)
  {
    myPointList.Add( e.Location );
    panel1.Invalidate(); //force a repaint
  }
}

private void panel1_Paint( object sender, PaintEventArgs e )
{
    e.Graphics.DrawLines( Pens.Black, myPointList );
}

我还建议继承Panel(或使用哪个控件)并将绘图逻辑放在那里。在这种情况下,只需覆盖OnPaint方法,而不是处理Paint事件。

编辑:我认为我还应该评论为什么你的代码不起作用。对于鼠标遍历的每个像素,您不会收到MouseMove事件。操作系统根本没有给你那么高的分辨率。相反,您将每隔一段时间获得一次活动。您可以在省略号之间的间隙中看到此清单。您需要在每个点之间连接一条线,这就是DrawLines方法将为您做的事情。如果在MSPaint中快速绘制线条,则可以看到相同的效果。该行不会有精确的计数器跟随鼠标的位置,而是线条会非常锯齿状。

答案 1 :(得分:5)

namespace Drawing
{
    public partial class Form1 : Form
    {
        bool draw = false;

        int pX = -1;
        int pY = -1;

        Bitmap drawing;

        public Form1()
        {
            InitializeComponent();

            drawing = new Bitmap(panel1.Width, panel1.Height, panel1.CreateGraphics());
            Graphics.FromImage(drawing).Clear(Color.White);
        }

        private void panel1_MouseMove(object sender, MouseEventArgs e)
        {
            if (draw)
            {
                Graphics panel = Graphics.FromImage(drawing);

                Pen pen = new Pen(Color.Black, 14);

                pen.EndCap = LineCap.Round;
                pen.StartCap = LineCap.Round;

                panel.DrawLine(pen, pX, pY, e.X, e.Y);

                panel1.CreateGraphics().DrawImageUnscaled(drawing, new Point(0, 0));
            }

            pX = e.X;
            pY = e.Y;
        }

        private void panel1_MouseDown(object sender, MouseEventArgs e)
        {
            draw = true;

            pX = e.X;
            pY = e.Y;
        }

        private void panel1_MouseUp(object sender, MouseEventArgs e)
        {
            draw = false;
        }

        private void panel1_Paint(object sender, PaintEventArgs e)
        {
            e.Graphics.DrawImageUnscaled(drawing, new Point(0, 0));
        }
    }
}

也发布在我的博客上 - http://techtt.hassantt.com/2011/05/c-draw-on-panel.html