问题描述
做了一个绘图程序在鼠标移动时候能画出线来,但是为了使鼠标的移动不会产生很多条线,只有一条线跟着鼠标在画。在MouseMove事件中画线之前加了这个方法graphics.clear()这样解决了留下鼠标轨迹的问题,但是画第2条线的时候第一条线也会被清除掉,请问怎么解决这问题
解决方案
解决方案二:
第一种方法:画第二条线之前,使用背景色重画第一条线。(不推荐)第二种方法:在类中定义记录需要画线的数据的成员,在MouseMove消息中,更新数据,执行Invalidate();在Paint事件处理方法中,根据数据画线。
解决方案三:
我也想知道,顶了
解决方案四:
引用1楼dancingbit的回复:
第一种方法:画第二条线之前,使用背景色重画第一条线。(不推荐)第二种方法:在类中定义记录需要画线的数据的成员,在MouseMove消息中,更新数据,执行Invalidate();在Paint事件处理方法中,根据数据画线。
第二种方法能说清楚点吗?不好意思我是菜鸟~~最好给个代码例子
解决方案五:
classXForm:Form{privatePointpt1,pt2;...publicForm(){pt1=newPoint(0,0);pt2=newPoint(0,0);}...privatevoidMouseMove(objectsender,MouseEventArgse){pt2.X=e.X;pt2.Y=e.Y;Invalidate();}privatevoidMouseDown(objectsender,MouseEventArgse){pt1.X=e.X;pt1.Y=e.Y;}privatevoidPaint(objectsender,PaintEventArgse){e.Graphics.DrawLine(Pens.Black,pt1,pt2);}...}
解决方案六:
画线可以使用ControlPaint.DrawReversibleLine方法,就不会出现很多线了.先用它画一个线,记录坐标,移动时,先用它利用记录的坐标画一次来擦出原来的线,在用新坐标画.mouseDown:ControlPaint.DrawReversibleLine(...);//记录坐标...mouseMove:ControlPaint.DrawReversibleLine(记录的坐标);ControlPaint.DrawReversibleLine(新坐标);//记录新坐标...mouseUP:ControlPaint.DrawReversibleLine(记录的坐标);ControlPaint.DrawReversibleLine(新坐标);
解决方案七:
楼主可以做个参考:publicpartialclassDrawLine:Form{classLineObj{privatePointm_start;privatePointm_end;publicLineObj(Pointstart,Pointend){this.m_start=start;this.m_end=end;}publicvoidDraw(Graphicsg,Penpen){g.DrawLine(pen,m_start,m_end);}}privatePointm_startPoint=Point.Empty;List<LineObj>lineList=newList<LineObj>();publicDrawLine(){InitializeComponent();this.SetStyle(ControlStyles.AllPaintingInWmPaint|ControlStyles.UserPaint|ControlStyles.OptimizedDoubleBuffer,true);}privatevoiddrawLine(Graphicsg,PointstartPoint,PointendPoint){BufferedGraphicsContextcontext=BufferedGraphicsManager.Current;BufferedGraphicsbg=context.Allocate(g,this.ClientRectangle);bg.Graphics.Clear(this.BackColor);foreach(LineObjlineinthis.lineList){line.Draw(bg.Graphics,SystemPens.ControlText);}bg.Graphics.DrawLine(SystemPens.ControlText,startPoint,endPoint);bg.Render();bg.Dispose();bg=null;}protectedoverridevoidOnPaint(PaintEventArgse){base.OnPaint(e);foreach(LineObjlineinthis.lineList){line.Draw(e.Graphics,SystemPens.ControlText);}}protectedoverridevoidOnMouseDown(MouseEventArgse){base.OnMouseDown(e);this.m_startPoint=newPoint(e.X,e.Y);}protectedoverridevoidOnMouseMove(MouseEventArgse){base.OnMouseMove(e);if(e.Button==MouseButtons.Left){this.drawLine(this.CreateGraphics(),this.m_startPoint,newPoint(e.X,e.Y));}}protectedoverridevoidOnMouseUp(MouseEventArgse){base.OnMouseUp(e);LineObjline=newLineObj(this.m_startPoint,e.Location);this.lineList.Add(line);}}
解决方案八:
privatevoidDrawToolBar_ButtonClick(objectsender,System.Windows.Forms.ToolBarButtonClickEventArgse){foreach(ToolBarButtonbtnToolBarinDrawToolBar.Buttons){btnToolBar.Pushed=false;}e.Button.Pushed=true;textBox1.Text=e.Button.Text;}privatevoidpictureBox1_MouseDown_1(objectsender,System.Windows.Forms.MouseEventArgse){intX=e.X;//当前X坐标intY=e.Y;//当前Y坐标if(!down){X1=X;Y1=Y;down=true;}}privatevoidpictureBox1_MouseMove(objectsender,System.Windows.Forms.MouseEventArgse){if(down){intX=e.X;//当前X坐标intY=e.Y;//当前Y坐标X2=X;Y2=Y;Graphicsg=this.pictureBox1.CreateGraphics();//创建一个Graphics对象Penmypen=newPen(btnPenColor.BackColor);//创建一个画笔DrawobjDraw=newDraw();g.Clear(pictureBox1.BackColor);//清除鼠标轨迹switch(textBox1.Text){case"矩形":objDraw.DrawRectangle(g,mypen,X1,Y1,X2,Y2);break;case"直线":objDraw.DrawLine(g,mypen,X1,Y1,X2,Y2);break;case"圆":objDraw.DrawEllipse(g,mypen,X1,Y1,X2,Y2);break;default:break;}g.Dispose();}}privatevoidpictureBox1_MouseUp(objectsender,System.Windows.Forms.MouseEventArgse){down=false;}这是我的部分代码,画第2个图形时候,第1次画的会被清除,谁能帮改下
解决方案九:
g.Clear(pictureBox1.BackColor);//清除鼠标轨迹-------------------这样肯定会把前面所绘制的清除
解决方案十:
引用8楼dancingbit的回复:
g.Clear(pictureBox1.BackColor);//清除鼠标轨迹-------------------这样肯定会把前面所绘制的清除
我知道啊~~但是不这样的话鼠标轨迹一直留在屏幕上
解决方案十一:
你需要另外一个变量,用来记录上一次发生MouseMove事件时的坐标,并在绘制新图形之前,使用背景色擦除上一次绘制的图形。
解决方案十二:
意思是在MouseUp()时候用变量把两个点的坐标保存起来,在MouseMove事件中g.Clear(pictureBox1.BackColor);之后再把上次的图给绘出来?用什么变量能保存呢?普通的变量只能保存一个图的,如果有多个图怎么办?
解决方案十三:
两个点不会用两个Point类型的变量保存么?g.Clear(pictureBox1.BackColor);执行了这个就什么都没有了。在你创建画笔的地方,再加:PeneraserPen=newPen(pictureBox1.BackColor);在下面你绘制图形的语句前面,再使用这个画笔在上次画的地方画一次,就可以擦除了。多个图?你这个本来无论何时,都只是在绘制一种图形。
解决方案十四:
我这儿写了部分鼠标绘图的代码,lz可参考一下。
解决方案十五:
学习楼上的...顶.
解决方案:
引用楼主jackal85的帖子:
做了一个绘图程序在鼠标移动时候能画出线来,但是为了使鼠标的移动不会产生很多条线,只有一条线跟着鼠标在画。在MouseMove事件中画线之前加了这个方法graphics.clear()这样解决了留下鼠标轨迹的问题,但是画第2条线的时候第一条线也会被清除掉,请问怎么解决这问题
我尝试过好几种方法,还是调用API函数效果最好!建议你试试!
解决方案:
用到这两个API函数:[DllImport("gdi32.dll")]publicstaticexternboolMoveToEx(IntPtrhdc,intx,inty,refLPPOINTlpPoint);[DllImport("gdi32.dll")]publicstaticexternboolLineTo(IntPtrhdc,intx,inty);然后在鼠标移动过程中不停的MoveToEx,LineTo,就可以了。这么做不会产生闪烁,而且速度快!
解决方案:
引用1楼dancingbit的回复:
第一种方法:画第二条线之前,使用背景色重画第一条线。(不推荐)第二种方法:在类中定义记录需要画线的数据的成员,在MouseMove消息中,更新数据,执行Invalidate();在Paint事件处理方法中,根据数据画线。
你的两种方法都会产生闪烁,不好。还是调用API函数画比较好!
解决方案:
http://download.csdn.net/source/504610这边有代码,是画在窗体上的,可以参考一下