C#鼠标绘图程序的问题

问题描述

做了一个绘图程序在鼠标移动时候能画出线来,但是为了使鼠标的移动不会产生很多条线,只有一条线跟着鼠标在画。在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这边有代码,是画在窗体上的,可以参考一下

时间: 2024-07-30 15:06:01

C#鼠标绘图程序的问题的相关文章

VB鼠标绘图基础资料总结

VB鼠标绘图基础资料总结 鉴于上半年编写过鼠标绘图的程序,在此将以前搜集的资料总结一下,给那些以前和我一样到处搜索的VB爱好者们一点方便,同时欢迎交流和指正.这里我尽量写的罗嗦又罗嗦一些,希望大家不要怪我.因为我们很多的资料都是理论性太强了,实用性或者说教人怎么用,太弱了.我希望能够罗嗦明白一点.我也是一个VB刚刚入门的人,把有限的经验写出来和大家分享. 前言鼠标绘图可以说是每一个VB编程者都想必定要尝试和锻炼的一个项目.学会了鼠标绘图,你就学会了Windows的鼠标操作,屏幕模映射模式,绘图模

DeviantArt出品的HTML5绘图程序

DeviantArt 是一个著名的,汇集了大量怪诞艺术家的非主流艺术作品展示网站,最近,他们推出了一个完全基于 HTML5 的绘图程序 Muro.这个几乎支持所有现 代浏览器,无需 Flash 和任何插件的绘图工具是作者见过的最好的HTML5 绘图程序.该程序甚至支持 Wacom 手写绘图板. 上图是 DeviantArt 用户 loish 使用 Muro 创作的一幅画,这里还有更多作品范例.   Muro 让人想起了过去那些基于浏览器的绘图工具,像使用 Flash 的 Odosketch, 以

VB实现鼠标绘图实例代码_vb

本文所述为VB实现鼠标绘图的实例,该实例实现线条颜色和线宽可自设,当按下鼠标按键时绘图开始并记录最初的起点,如果不是处在绘图状态则退出该过程,如果处在绘图状态则从起点到目前鼠标所在点绘制直线,然后将当前鼠标所在点作为新的起点,当释放鼠标按键时绘图结束. 具体的功能代码如下: VERSION 5.00 Object = "{F9043C88-F6F2-101A-A3C9-08002B2F49FB}#1.2#0"; "comdlg32.ocx" Begin VB.For

RequireJS简易绘图程序开发_javascript技巧

前言 RequireJS的出现让前端代码模块化变得容易,当前端项目越来越大,代码越来越多的时候,模块化代码让项目结构更清晰,不仅在开发时让我们的思路更清晰,而且后期维护起来也更容易.下面是我学习RequireJS后使用RequireJS开发的一款简易绘图程序,运行在浏览器中如下图所示: 如果你对RequireJS还不是很了解,可以看我的RequireJS学习笔记:http://blog.csdn.net/yubo_725/article/details/52913853 开始 这个简易绘图程序的

Java 菜单按钮控制绘图程序(求解答,急急急!!!)

问题描述 Java 菜单按钮控制绘图程序(求解答,急急急!!!) 用菜单和按钮来控制绘图 功能要求:实现简单绘图功能,具体要求:画直线,画空心或实心椭圆.画空心或实心矩形.画多边形(图形的位置和大小可在程序中设定). 界面要求:用图形界面实现. 图示一初始界面: 图示二使用菜单绘图: 图示三使用按钮绘图 解决方案 用 myeclipse 10 以上做吧 挺简单的,直接求代码,,不太好吧 解决方案二: http://download.csdn.net/download/wangjinxia00/2

cvset*d-在实现鼠标绘图时,使用cvSet2D来画轨迹,为什么在边缘处出界。求指点。

问题描述 在实现鼠标绘图时,使用cvSet2D来画轨迹,为什么在边缘处出界.求指点. 下面是代码, /* 创建白色图像,通过鼠标左键绘图,右键实现橡皮擦功能 */ #include <iostream> #include <opencv2/opencv.hpp> #include <opencv2/highgui/highgui.hpp> using namespace std; using namespace cv; bool LFlag = false; bool

关于用VS2013 C# 开发 检测屏幕颜色变化 然后模拟控制鼠标键盘程序

问题描述 我想用VS2013C#开发检测屏幕颜色变化然后模拟控制鼠标键盘程序,程序功能就如"按键精灵"做出来的程序一样请问要学会那些知识点呀?这个难度高吗? 解决方案 解决方案二:不高,懂点api最好解决方案三:这个主要是算法吧..C#里是有办法获取屏幕上的像素点的

ASP.NET 2.0+Atlas编写鼠标拖放程序

asp.net|程序|鼠标 摘要 本文将详细探讨Atlas中的声明性编程与强制性编程之间的关系,及如何用之在一个web客户端实现拖放功能.下图为本文相应示例程序运行结果快照. 一. 简介 本文旨在帮助读者理解微软的Atlas技术的某些方面的工作原理.Atlas的实现宗旨是简化AJAX风格的Web程序开发.然而,就象所有其它技术一样,为了更好地使用这个工具,你需要深入理解Atlas抽象的内在技术.Atlas抽象的一个关键之处是新的XML标记语法,目的是实现利用Atlas进行编程更为容易.借助于XM

新人求助,使用zedGraph绘图绘图程序卡死

问题描述 上位机接收串口数据,下位机不停发送数据到上位机,当开始打开串口时,程序会卡死1分钟左右,之后恢复正常:有时候调用了pointList.Clear(),后再重新往里面加入数据也会让程序卡死~~ 解决方案 解决方案二:放到线程里就好了解决方案三:你的数据有多少?CS一般数据不多不会卡,你如果在网站上使用zedgraph的话倒是有可能会卡.解决方案四:引用楼主huang1004943336的回复: 上位机接收串口数据,下位机不停发送数据到上位机,当开始打开串口时,程序会卡死1分钟左右,之后恢