c#用鼠标绘图

Fra*_*nta 5 c# drawing

我想用鼠标画e.Xe.Y.我知道我应该使用,list<Point>但我不知道该怎么做.不幸的是我有问题drawlines,我做不到.

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

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

绘图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)
{


} 
Run Code Online (Sandbox Code Playgroud)

Ed *_* S. 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 );
}
Run Code Online (Sandbox Code Playgroud)

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

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


Has*_*eau 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));
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

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

  • 在这里发布它可能是一个好主意,以防页面在某些时候消失. (2认同)