【问题标题】:c# drawing by mousec# 鼠标绘图
【发布时间】:2011-05-17 20:43:15
【问题描述】:

我想通过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)
{


} 

【问题讨论】:

    标签: c# drawing


    【解决方案1】:

    所以,首先,不要直接在 MouseMove 处理程序中执行绘图。将所有绘图代码保留在 OnPaint 覆盖中,并在那里使用提供的图形对象。只需在 MouseMove 处理程序中维护一组点。这样做的原因(嗯,一个原因)是 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 );
    }
    

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

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

    【讨论】:

    • 要完成这项工作,请将 myPointList 声明为列表,然后执行:e.Graphics.DrawLines(Pens.Black, myPointList.ToArray());
    【解决方案2】:
    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

    【讨论】:

    • 在此处发布它也是一个好主意,以防该页面在某个时候消失。
    • @Hassan Voyeau 一个好主意是在代码中使用 using 语句 :)
    猜你喜欢
    • 2012-11-14
    • 1970-01-01
    • 2012-06-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-07-31
    • 1970-01-01
    相关资源
    最近更新 更多