我用GDI+中 g.drawline()的方法实现了点击鼠标左键移动画线 松开左键画线结束
我想再实现把刚画过的线删除 如何实现呢最好是像一些阅读软件 比如CAJViewer一样 在刚画过的线的旁边点击鼠标右键 选右键菜单中的删除该线
然后删除
大家有没有好的办法
 

解决方案 »

  1.   

    用GDI吧,用异或笔画,原地重画即可还原背景~
      

  2.   

    这个要保存点坐标到链表中, 删除后重绘.net 中 简单异或绘制 用ControlPaint 提供的静态函数
    ControlPaint.DrawReversibleFrame
    ControlPaint.DrawReversibleLine
      

  3.   

    异或绘图源码点击http://blog.csdn.net/wzuomin/archive/2006/12/13/1441007.aspx
      

  4.   

    C#中最强的绘图工具程序
    http://www.msproject.cn/Document/DrawTools.html
      

  5.   

    首先,给你假定一个前提,你的图上面还有其他的元素,不想擦掉。第一步,你的图上面的其他元素都要有副本保存的。
    第二步,用一定的数据结构保存好你要话的线,比如一个点集(可以用List的),然后根据这个点集把线画上去。
    第三步,要删除的时候,先把这个点集从你的内存中释放,然后擦除整个图画(Control.Invalidate()是控件重绘函数,在Paint事件里面写你的重绘代码),重绘你的所有需要的元素。
    至于画图就用Graphics好了
      

  6.   

    http://www.codeproject.com/KB/cs/DrawToolsRedux.aspx  
    来个比较好的。看看吧。
      

  7.   

    我就是用你的办法把一点保存到list数组的 可是C#中如何释放数组的内存呢 也用free函数吗 重绘我也不是很懂 具体代码如何写啊
    能不能给个简单的程序啊
    谢谢拉
    下面是我的部分程序 
    private void MsMove(object sender, System.Windows.Forms.MouseEventArgs e)
    {
     ArrayList array = new ArrayList();
     g.DrawLine(new Pen(Color.Red), oldX, oldY, e.X, e.Y);
     oldX = e.X;
     oldY = e.Y;
     p = new Point(e.X,e.Y);
     array.Add(p);

    怎么用你的办法做到呢 
    你说的原理我懂了 可是我不知道怎么写程序 帮帮忙
      

  8.   

    [color=#FF0000]TO :huang_8228 [/color]我就是用你的办法把一点保存到list数组的 可是C#中如何释放数组的内存呢 也用free函数吗 重绘我也不是很懂 具体代码如何写啊 
    能不能给个简单的程序啊 
    谢谢拉 
    下面是我的部分程序  
    private void MsMove(object sender, System.Windows.Forms.MouseEventArgs e) 

     ArrayList array = new ArrayList(); 
     g.DrawLine(new Pen(Color.Red), oldX, oldY, e.X, e.Y); 
     oldX = e.X; 
     oldY = e.Y; 
     p = new Point(e.X,e.Y); 
     array.Add(p); 
    } 
    怎么用你的办法做到呢  
    你说的原理我懂了 可是我不知道怎么写程序 帮帮忙 
      

  9.   

    不要所有的点都加进array,这样你无法区分它们是属于哪一条线的。
    从mousedown到mouseup视为一次画线,把这次画线存进GraphicsPath,
    第一次画的GraphicsPath存进array,那么array就是你画的那些线了。
      

  10.   

    如果是做画图工具的,不建议这样子做,因为pain很闪的。大概这个样子:        ArrayList list = new ArrayList();
            GraphicsPath gp;
            int x, y;
            private void Form2_MouseDown(object sender, MouseEventArgs e)
            {
                x = e.X;
                y = e.Y;
                if (gp != null)
                    list.Add(gp);
                gp = new GraphicsPath();
            }        private void Form2_MouseMove(object sender, MouseEventArgs e)
            {
                if (e.Button != MouseButtons.Left)
                    return;            gp.AddLine(x, y, e.X, e.Y);            x = e.X;
                y = e.Y;            this.Refresh();
            }        private void Form2_Paint(object sender, PaintEventArgs e)
            {
                if (gp == null)
                    return;
                for (int i=0; i<list.Count; i++)
                    e.Graphics.DrawPath(Pens.Red, (GraphicsPath)list[i]);            e.Graphics.DrawPath(Pens.Red, gp);
            }
            
            //list保存了每一条线,要删哪一条就指定下标。