通过鼠标绘制 C#

本文关键字:绘制 鼠标 | 更新日期: 2023-09-27 17:56:50

我想用鼠标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)
{

} 

通过鼠标绘制 C#

因此,首先,不要直接在 MouseMove 处理程序中执行绘图。 将所有绘图代码保留在 OnPaint 覆盖中,并在其中使用提供的图形对象。只需从鼠标移动处理程序中维护点集合即可。 这样做的原因(嗯,一个原因)是OnPaint将被不可预测地调用,并且您的绘图将被清除,因为逻辑不会在OnPaint中执行。 尝试最小化您的窗口并再次最大化它以了解我的意思。

至于你的另一个问题,就像我说的,只需维护一个Point对象的集合。 重写OnPaint并使用接受点集合的Graphcis.DrawLines方法绘制点。 所以你的代码变成类似...

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 );
}

我还建议子类化面板(或您使用的任何控件)并将绘图逻辑放置在那里。 在这种情况下,只需重写 OnPaint 方法,而不是处理 Paint 事件。

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

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