各位大哥们,我做了一个鼠标移动就画线的程序
private void Form1_MouseMove(object sender, System.Windows.Forms.MouseEventArgs e)
Graphics g;
g = this.CreateGraphics() ;
g.DrawLine (new Pen (Color.Black ,1),oldPoint,new Point (e.X ,e.Y ));
移动的过程中,不断的画线,我只需要一条线,所以画新线之前,把旧线先用白线从新画了一遍
g.DrawLine (new Pen (Color.White ,1),oldPoint,tempPoint);
但是这样效果也不好,请问C#里怎么画异或线啊,就是一条线画两遍就自动消失的,这种模式怎么设呢?急

解决方案 »

  1.   

    在GDI中是可以用颜色异或来擦掉原来画的;
    但是在GDI+中,如上的方法就不行了,你可以用底色去重画,
    或者用
    Graphics.Clear( Color.Black );
    来擦掉用黑色所画的图形。
      

  2.   

    橡胶线,最好利用bitblt函数,不过被大多数的C#程序员抵制。可以利用dllImport引用GDI,然后画异或
      

  3.   

    还是不行哦,
    Graphics.Clear( Color.Black )
    是可以擦去的,但是屏幕老闪动,这样也不好啊。
    用底色去重画,也可以擦去,但是这搞的像橡皮擦一样了,鼠标不断移动,就把一些画好的线也擦了。
    哪位教教异或怎么画啊
      

  4.   

    你试试把线画在一张bitmap上,然后在窗体上贴bitmap,当然在移动的时候可以在窗体上用Graphics.Clear( Color.Black );看看还会不会闪烁。
      

  5.   

    to 是可以擦去的,但是屏幕老闪动,这样也不好啊采用doublebuffer来处理,就不会闪动了
      

  6.   

    doublebuffer来处理还是会闪动哦,如果画板太大的话。
      

  7.   

    难道就没有“异或线”这样的画笔模式吗,就是同一条线画两次,就抹去了的。
    VB,C++里都有的
      

  8.   

    最好的方法,就是引用GDI的API
      

  9.   

    这是官方的完美解决方案,记得给我+分        Point originalPoint = new Point();
            Point lastPoint = new Point();
            bool mouseIsDown;        private void Form1_MouseDown(object sender, MouseEventArgs e)
            {
                mouseIsDown = true;
                originalPoint.X = e.X;
                originalPoint.Y = e.Y;
                lastPoint.X = -1;
                lastPoint.Y = -1;
            }        private void MyDrawReversibleLine(Point point1, Point point2)
            {
                point1 = PointToScreen(point1);
                point2 = PointToScreen(point2);
                ControlPaint.DrawReversibleLine(point1, point2, Color.Yellow);
            }        private void Form1_MouseUp(object sender, MouseEventArgs e)
            {
                mouseIsDown = false;
                if (lastPoint.X != -1)
                {
                    Point currentPoint = new Point(e.X, e.Y);
                    MyDrawReversibleLine(originalPoint, lastPoint);
                }
                lastPoint.X = -1;
                lastPoint.Y = -1;
                originalPoint.X = -1;
                originalPoint.Y = -1;
            }        private void Form1_MouseMove(object sender, MouseEventArgs e)
            {
                Point currentPoint = new Point(e.X, e.Y);
                if (mouseIsDown)
                {
                    if (lastPoint.X != -1)
                    {
                        MyDrawReversibleLine(originalPoint, lastPoint);
                    }
                    lastPoint = currentPoint;
                    MyDrawReversibleLine(originalPoint, currentPoint);
                }
            }
      

  10.   

    对,这个就用API,在codeproject中有。
      

  11.   

    C# Signature:
    [DllImport("gdi32.dll")]
    static extern int SetROP2(IntPtr hdc, int fnDrawMode);
    C# Signature:
    [DllImport("gdi32.dll")]public static extern int SetROP2(IntPtr hdc, BinaryRasterOperations ops);User-Defined Types:public enum BinaryRasterOperations {    R2_BLACK            = 1,
        R2_NOTMERGEPEN      = 2,
        R2_MASKNOTPEN       = 3,
        R2_NOTCOPYPEN       = 4,
        R2_MASKPENNOT       = 5,
        R2_NOT          = 6,
        R2_XORPEN       = 7,
        R2_NOTMASKPEN       = 8,
        R2_MASKPEN      = 9,
        R2_NOTXORPEN    = 10,
        R2_NOP          = 11,
        R2_MERGENOTPEN      = 12,
        R2_COPYPEN      = 13,
        R2_MERGEPENNOT      = 14,
        R2_MERGEPEN     = 15,
        R2_WHITE        = 16
    }
    个人认为最好的办法就是引用API了,我以前也是这么做的,不过使用SetROP2就只能使用GDI而不能使用GDI+了
      

  12.   

    请问楼上的:Firestone2003(笨笨小猪) ( ) 信誉:98 用GDI具体怎么个使用法?在背景图上画东西只能用异或的方式来实现了,背景的颜色是各种各样的,如果不用弄或的方式来画,根本没法画出来了,也更没办法去边画边擦的了。一般这种需求都是在mouseMove这些事件中不但使用的
      

  13.   

    其实不用,在画线之前,取得整个绘图区域的背景,画在GPBitmap上面,然后新建一个绘制图层,比如:GPBitmap1,在GPBitmap1上面绘制线条,移动的时候,使用GPGraphics的DrawImage方法绘制原来线条所在的区域(如果线条是多折线,或者所占区域过大,可以使用GPGraphics的SetClip方法进行裁减),再绘制线条现在的位置到GPBitmap1上,通过GPGraphics的DrawImage方法绘制到屏幕就可以了!我通过上面的方法实现了Visio中的图形拖动,CPU占用很低,效果不错!
      

  14.   

    c#不支持异或画线,真的!用Api函数可以实现,但是,如果滚动的话还是有一定的问题,也就是说,不能从根本上解决问题!不过,如果你画的线条比较少的话,可以考虑把不移动的线全部保存下来,然后把整个图擦掉,然后重画,线条多的话会闪动!太好的解决办法好像没有。真的,我以前也遇到过,到现在也没有解决!