当前位置: 首页 > 编程语言 > C#

C#图形闪烁分享

时间:2023-04-11 02:45:49 C#

C#图形闪烁我正在做一个绘图程序,但是在绘制橡皮筋线时移动鼠标光标时出现闪烁问题。我希望你能帮我删除那条闪燃的行,这里是代码:usingSystem;使用System.Collections.Generic;使用System.ComponentModel;使用系统数据;使用系统绘图;使用System.Linq;使用系统文本;使用System.Windows.Forms;namespaceGraphicsTest{publicpartialclassForm1:Form{intxFirst,yFirst;位图bm=新位图(1000,1000);图形bmG;图形xG;Penpen=newPen(Color.Black,1);布尔绘制=假;publicForm1(){InitializeComponent();}privatevoidForm1_Load(objectsender,EventArgse){bmG=Graphics.FromImage(bm);xG=this.CreateGraphics();bmG.Clear(Color.White);}privatevoidForm1_MouseDown(objectsender,MouseEventArgse){xFirst=eX;yFirst=eY;画=真;}privatevoidForm1_MouseUp(objectsender,MouseEventArgse){bmG.DrawLine(pen,xFirst,yFirst,eX,eY);绘制=假;xG.DrawImage(bm,0,0);}privatevoidForm1_MouseMove(objectsender,MouseEventArgse){if(draw){xG.DrawImage(bm,0,0);xG.DrawLine(笔,xFirst,yFirst,eX,eY);}}privatevoidForm1_Paint(objectsender,PaintEventArgse){xG.DrawImage(bm,0,0);}}}不要先使用CreateGraphics(),除非绝对必须程序绑定到OnPaint并在要刷新表面时调用Invalidate()。如果您不希望它闪烁,则需要对绘图表面进行双重缓冲。最简单的方法是将窗体的DoubleBuffered属性设置为True。如果您要扩展它来绘制PictureBox控件,我强烈推荐它。PictureBox默认是双缓冲的,让你更简单的控制绘图区域。在代码中:publicpartialclassForm1:Form{intxFirst,yFirst;位图bm=新位图(1000,1000);图形bmG;Penpen=newPen(Color.Black,1);布尔绘制=假;publicForm1(){InitializeComponent();}privatevoidForm1_Load(objectsender,EventArgse){bmG=Graphics.FromImage(bm);bmG.Clear(Color.White);}privatevoidForm1_MouseDown(objectsender,MouseEventArgse){xFirst=eX;yFirst=eY;画=真;}privatevoidForm1_MouseUp(objectsender,MouseEventArgse){bmG.DrawLine(pen,xFirst,yFirst,eX,eY);绘制=假;无效();}privatevoidForm1_MouseMove(objectsender,MouseEventArgse){if(draw){Invalidate();}}privatevoidForm1_Paint(objectsender,PaintEventArgse){if(draw){e.Graphics.DrawImage(bm,0,0);e.Graphics.DrawLine(pen,xFirst,yFirst,eX,eY);}else{e.Graphics.DrawImage(bm,0,0);}}}编辑:另一个问题是您正在创建一个私人Pen成员。笔(和画笔,以及许多GDI+对象)表示需要处理的非托管对象的句柄,否则您的程序将泄漏。用using语句(首选且异常安全的方式)包装它们,或者在表单的Dispose方法中显式处理它们。或者在System.Drawing中,您可以使用一些不需要(也不应该)丢弃的预制笔和画笔。像这样使用它们:privatevoidForm1_Paint(objectsender,PaintEventArgse){if(draw){e.Graphics.DrawImage(bm,0,0);e.Graphics.DrawLine(Pens.Black,xFirst,yFirst,eX,eY);}else{e.Graphics.DrawImage(bm,0,0);它闪烁的原因是你正在绘制背景(立即在屏幕上,擦除线条)然后叠加线条。所以线条不断消失和出现,给出闪烁的显示。最好的解决方案称为双缓冲。您正在做的是将整个图像绘制到“屏幕外”位图,并且仅在完成后才在屏幕上显示。由于您只显示完成的图像,因此没有闪烁效果。您应该能够设置this.DoubleBuffered=true让WinForms为您完成所有艰苦的工作。注意:你不应该在你的绘制处理程序之外绘制-理想情况下你应该Invalidate()需要重绘的区域,然后你的绘制处理程序将重绘该区域(根据需要重叠任何线条等)。固定和工作代码。以上就是《C#学习教程:C#图文刷屏分享》的全部内容。如果对你有用,需要进一步了解C#学习教程,希望大家多加关注——publicpartialclassForm1:Form{intx1,y1,x2,y2;布尔拖=假;位图bm=新位图(1000,1000);图形bmg;publicForm1(){InitializeComponent();}privatevoidForm1_Load(objectsender,EventArgse){bmg=Graphics.FromImage(bm);}privatevoidpictureBox_MouseDown(objectsender,MouseEventArgse){drag=true;x1=eX;y1=eY;}privatevoidpictureBox_MouseUp(objectsender,MouseEventArgse){drag=false;,y1,eX,eY);pictureBox.Invalidate();}privatevoidpictureBox_MouseMove(objectsender,MouseEventArgse){if(drag){x2=eX;y2=eY;pictureBox.Invalidate();}}privatevoidpictureBox_Paint(objectsender,PaintEventArgse){if(drag){e.Graphics.DrawImage(bm,0,0);e.Graphics.DrawLine(Pens.Black,x1,y1,x2,y2);}否则{即。图形。DrawImage(bm,0,0);}}}本文收集自网络,不代表立场。如涉及侵权,请点击右侧联系管理员删除。如有转载请注明出处: