如何截取Form中(已画过线的)的图像 我现在做一个鼠标移动,鼠标点上横坐标线和纵坐标先动态移动所以想保持背景图像不变,但现在不知如何保存原背景图像? 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 不太明白你的意思,是不是用鼠标在Form中拖动一个矩形框,任何把Form中这个矩形的背景保存 用ControlPaint.DrawReversibleLine来画线,注意这个是用的屏幕DC来绘的,所以需要的是屏幕坐标同样的地方再绘制一次可以把原来的线条擦除 用graphics类来做,擦除的话有两种情况:1.当背景是单色的时候,你可以在画新线的时候,先将原来的线用背景色重新画一边.2.当背景是图像的时候,你就先将背景保存,然后每次画之前,就先用保存的背景来覆盖.当然这些事件肯定是加在鼠标的move事件上. 给你一点参考: private Image bmp;//在formload事件中将背景图像赋值给它 private void Form10_MouseMove(object sender, MouseEventArgs e) {//这个例子是在画一个矩形,downpoint是鼠标按下的坐标,bmp是 Point newrect = new Point(downpoint.X,downpoint.Y); int width = e.Width; int height = e.Height; rect = new Rectangle(newrect,new Size(width,height)); Pen p = new Pen(Color.Blue, 2); Bitmap bb = new Bitmap(bmp);//新建一个图像,与背景相同 Graphics g = Graphics.FromImage(bb);//在这个新的图像上建立画布 g.DrawRectangle(p, rect);//将你要画的东西画在这个画布上 this.CreateGraphics().DrawImage(bb, 0, 0);//将这个画完的图像画到你要显示的画板上. g.Dispose(); p.Dispose(); } } 楼上楼主要的线条肯定是要在Paint中画MouseMove中只是改变线条位置并刷新而已画线条最快的是用异或绘制,当然,在PaintBackground中重绘背景是一般做法 居然说8楼的不正确?那才是正解,最快的,是缓存方式。而他建立的BB,实际上就是一个缓存。单纯的异步没那么好的效果。在还没有Dispose时,你完全可以从bb里拿出你需要的东西。//新建一个图像,与背景相同Bitmap bb = new Bitmap(bmp);//在这个新的图像上建立画布Graphics g = Graphics.FromImage(bb);//将你要画的东西画在这个画布上g.DrawRectangle(p, rect);//将这个画完的图像画到你要显示的画板上.this.CreateGraphics().DrawImage(bb, 0, 0);g.Dispose();p.Dispose(); 8楼的大侠,我就是private Image bmp;//在formload事件中将背景图像赋值给它做不到啊?怎么画我都会,就是如何获取图像怎么办?我是在SplitContainer中画图的,如何获得在SplitContainer.Panel1中的已画图像? C#面试题,并散分 为什么数据没有在listView里显示出来呢? DATAGRIDVIEW 绑定到文件对象,编辑文件对象中的LIST<> 的设计问题 .net 2003 咋样实现用指定的身份去运行一个进程?急 再次提问:报表预览reportviewer控件如何对RDLC报表的记录进行过滤、排序 一个简单的查询语句sql2008 求和 用C#获取图像的外形坐标 倾囊相赠:仅问一些数组的算法问题! 今天运行windform,发现一个Dictionary的bug 二进制文件的追加 水晶报表导出到EXCEL格式混乱
同样的地方再绘制一次可以把原来的线条擦除
1.当背景是单色的时候,你可以在画新线的时候,先将原来的线用背景色重新画一边.
2.当背景是图像的时候,你就先将背景保存,然后每次画之前,就先用保存的背景来覆盖.
当然这些事件肯定是加在鼠标的move事件上.
private void Form10_MouseMove(object sender, MouseEventArgs e)
{//这个例子是在画一个矩形,downpoint是鼠标按下的坐标,bmp是
Point newrect = new Point(downpoint.X,downpoint.Y);
int width = e.Width;
int height = e.Height;
rect = new Rectangle(newrect,new Size(width,height));
Pen p = new Pen(Color.Blue, 2);
Bitmap bb = new Bitmap(bmp);//新建一个图像,与背景相同
Graphics g = Graphics.FromImage(bb);//在这个新的图像上建立画布
g.DrawRectangle(p, rect);//将你要画的东西画在这个画布上
this.CreateGraphics().DrawImage(bb, 0, 0);//将这个画完的图像画到你要显示的画板上.
g.Dispose();
p.Dispose();
}
}
MouseMove中只是改变线条位置并刷新而已
画线条最快的是用异或绘制,当然,在PaintBackground中重绘背景是一般做法
那才是正解,最快的,是缓存方式。而他建立的BB,实际上就是一个缓存。单纯的异步没那么好的效果。
在还没有Dispose时,你完全可以从bb里拿出你需要的东西。
//新建一个图像,与背景相同
Bitmap bb = new Bitmap(bmp);
//在这个新的图像上建立画布
Graphics g = Graphics.FromImage(bb);
//将你要画的东西画在这个画布上
g.DrawRectangle(p, rect);
//将这个画完的图像画到你要显示的画板上.
this.CreateGraphics().DrawImage(bb, 0, 0);
g.Dispose();
p.Dispose();
private Image bmp;//在formload事件中将背景图像赋值给它
做不到啊?怎么画我都会,就是如何获取图像怎么办?我是在SplitContainer中画图的,
如何获得在SplitContainer.Panel1中的已画图像?