如何删除一段使用GDI+绘出的线段?

czzx16 2008-09-01 12:17:30
我的winform有个按钮,每次按下按钮调用GDI+绘出一段指定的线段,如果我一次执行期间多次按下按钮,需要在每次按下之后能够删除之前一次事件绘制的线段再显示新的线段,该如何实现?该winform中除了线段外还有其他的图像,所以Graphics.Clear(Color.Teal);
是不行的,代码如下

private void button_Shoot_Click(object sender, EventArgs e)
{

#region 定义自定义线帽
float arrowWidth = 3;
float arrowHeight = 3;
bool arrowFill = true;
AdjustableArrowCap myArrow = new AdjustableArrowCap(arrowWidth,
arrowHeight,
arrowFill);
CustomLineCap customArrow = myArrow;
Pen p = new Pen(Color.Red, 1);
p.EndCap = LineCap.Custom;
p.CustomEndCap = customArrow;
#endregion

Graphics g = Graphics.FromHwnd(this.Handle);//获得窗口句柄,通过Hwnd获得Graphics对象

List<Point> myPts = new List<Point>();
if (numericUpDown_Force.Value == 2 && numericUpDown_Force.Value == 2)
{
myPts.Add(new Point(136, 165));
myPts.Add(new Point(250, 119));
myPts.Add(new Point(347, 140));
myPts.Add(new Point(412, 160));

}
else if (numericUpDown_Force.Value == 1 && numericUpDown_Angle.Value == 2)
{
myPts.Add(new Point(136, 165));
myPts.Add(new Point(180, 119));
myPts.Add(new Point(297, 140));
myPts.Add(new Point(412, 160));
}



g.DrawBezier(p, myPts[0], myPts[1], myPts[2], myPts[3]);


}
...全文
431 17 打赏 收藏 转发到动态 举报
写回复
用AI写文章
17 条回复
切换为时间正序
请发表友善的回复…
发表回复
yatobiaf 2008-09-02
  • 打赏
  • 举报
回复
就是说,在list里面删除绘制线段的点,然后重绘,这样那条线段不就画不出来了嘛?
另外一个方法,就是用一个bool变量控制,为真的时候才画。删除的时候只要把这个变量置成假,然后重绘就行了。
GentleCat 2008-09-02
  • 打赏
  • 举报
回复
主要也要看你想实现的功能了,如果你想画了N条线之后还能回退,将原来画过的线删除,那么就需要用到 GhostAdai 用到的OOP方法,并且需要将画布全部清除再重新绘制一遍;

如果你只是想回退一步,清除最近一次所画的线,那么你可以在画新线之前先定义一个临时的Image将原图保存,在画完新图像之后如果需要回退,那么可以用临时Image的相关部分去重绘改变的区域,这样就可以还原回图像的原貌了,而不管背景上有没有其他什么图形.
GhostAdai 2008-09-02
  • 打赏
  • 举报
回复
还有个方法:把要画的线写个类,这样画线的时候就是生成对象,要清除线就是删除对象,还能控制去删第几条,不亦乐乎。
TengGaoqing 2008-09-01
  • 打赏
  • 举报
回复
有一个比较笨的方法
你用当前的背景色把原来的一条线给重绘一下就可以了。
kyle315 2008-09-01
  • 打赏
  • 举报
回复
用一个容器(比如数组)缓存你绘图的对象,在不需要时从容器中删除绘图对象,然后重绘。
billlyh 2008-09-01
  • 打赏
  • 举报
回复
ding!!!!!!!!!!!!!!!
czzx16 2008-09-01
  • 打赏
  • 举报
回复
[Quote=引用 11 楼 yatobiaf 的回复:]
这个问题最简单的解决就是,不画这条线!用
myPts.Clear()
[/Quote]
不明白什么意思???
skywolfY 2008-09-01
  • 打赏
  • 举报
回复
如果是异或作图还可以再画一次,
不然你就得记下以前的各点位情况,写一清除函数反写回去。
要不然,就不在背景上画,上边搞另外一个蒙版,画回来清了就是。
yatobiaf 2008-09-01
  • 打赏
  • 举报
回复
这个问题最简单的解决就是,不画这条线!用
myPts.Clear()
ZXSDN 2008-09-01
  • 打赏
  • 举报
回复
参考资料:http://msdn.microsoft.com/zh-cn/2f3csed3.aspx
ZXSDN 2008-09-01
  • 打赏
  • 举报
回复

[DllImport("user32.dll",CharSet = CharSet.Auto)]
public static extern bool InvalidateRect(IntPtr hWnd,IntPtr lpRect,bool bErase);


在需要的地方调用一下。
wwlprince 2008-09-01
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 diandian82 的回复:]
需要使用异或画笔了

C#不支持,调API
[/Quote]
桃子 2008-09-01
  • 打赏
  • 举报
回复
楼主说背景是个别的图像,你获取背景色肯定不行咯

[Quote=引用 5 楼 gisfarmer 的回复:]
你用当前的背景色把原来的一条线给重绘一下就可以了。
[/Quote]
diandian82 2008-09-01
  • 打赏
  • 举报
回复
需要使用异或画笔了

C#不支持,调API
优途科技 2008-09-01
  • 打赏
  • 举报
回复
你用当前的背景色把原来的一条线给重绘一下就可以了。
桃子 2008-09-01
  • 打赏
  • 举报
回复
想法:
其他图像放在form里...
再建一个透明的panel...线段画在panel上

重画线段时,可以clear panel
QQ10149077 2008-09-01
  • 打赏
  • 举报
回复
刷新之后是不是就没有了,不太明白
1 使用AGG的准备工作 1 2 AGG图形显示原理见下图: 1 3 要理解AGG的工作原理,先看一段代码: 2 4 顶点源(Vertex Source) 5 4.1 头文件 5 4.2 类型 5 4.3 画一条简单的箭头直线(基于此处代码) 6 4.4 自定义一个顶点源(基于此处代码) 7 5 Coordinate conversion pipeline 坐标转换管道 9 5.1 变换矩阵(trans_affine) 10 5.1.1 头文件 10 5.1.2 类型 10 5.1.3成员变量 10 5.1.4 成员方法 10 5.1.5 实验代码(基于此 处代码) 10 5.2 坐标转换管道 11 5.2.1 头文件 11 5.2.2 类型(演示程序基于基于此处代码) 12 6 Scanline Rasterizer 15 6.1 扫描线Scanline 15 6.1.1 头文件 15 6.1.2 类型 15 6.1.3 成员类型 15 6.1.4 成员方法 16 6.2 Rasterizer 16 6.2.1 头文件 16 6.2.2 类型 16 6.2.3 成员方法 16 7 Renderers 渲染器 17 7.1 Scanline Renderer 17 7.1.1 头文件 17 7.1.2 类型 17 7.1.3 实验代码(基于此 处代码) 18 7.2 Basic Renderers 19 7.2.1头文件 19 7.2.2类型 19 7.2.3 构造函数 19 7.2.4 成员方法 19 7.2.5 实验代码(基于此 处代码) 20 7.3 PixelFormat Renderer 20 7.3.1 头文件 21 7.3.2 类型 21 7.3.3 构造函数 21 7.3.4 类型定义 21 7.3.5 成员方法 21 7.3.6 实验代码(基于此 处代码) 22 8 Rendering Buffer 22 8.1 头文件: 22 8.2 类型: 22 8.3 构造函数: 22 8.4 成员方法: 23 8.5 实验代码(基于此处代码) 23 9 AGG与GDI显示 23 10 使用AGG提供的pixel_map类 26 11 线段生成器(Span Generator) 27 12 图案类线段生成器 28 12.1头文件 28 12.2类型 28 12.3 示例代码,使用span_image_filter_rgb_bilinear_clip 29 13 插值器Interpolator 31 13.1 头文件 31 13.2 类型 31 13.3实验代码,使用span_interpolator_persp_lerp 32 14 变换器Transformer 33 14.1 头文件 33 14.2 类型 33 14.3 实验代码,使用trans_warp_magnifier 33 15 图像访问器Image Accessor 34 15.1 头文件 34 15.2 类型 34 15.3 实验代码 35 16 图像过滤器(Image Filter) 36 16.1 头文件 36 16.2 类型 36 16.3 实验代码 37 17 色彩类线段生成器 37 17.1 头文件 37 17.2 类型 38 17.3 示例代码 38 18 渐变颜色 40 18.1 实验代码,使用std::vector实现多颜色渐变 40 18.2 gradient_lut 41 18.2.1 头文件 41 18.2.2 类声明 41 18.2.3 实验代码,使用gradient_lut实现多颜色渐变 41 19 渐变方式 42 20其它色彩类的线段生成器 43 21 组合类线段生成器 44 21.1 头文件 44 21.2 类型 44 21.3 演示代码 45 22 AGG的字符输出 47 22.1 方式一、使用gsv_text对象 47 22.2 方式二、使用字体引擎(Font Engine) 50 22.2.1 头文件 50 22.2.2 类型 50 22.2.3 成员类型 51 22.2.4 成员属性 51 22.2.5 成员方法 51 22.2.6示例代码1 - 从顶点源层输出文字 52 22.2.7 示例代码2 - 从Scanline Rasterizer层输出文字 53 22.3 方式三、使用FreeType 54 22.4 方式四、字体缓存管理器(font_cache_manager) 55 22.4.1 头文件 55 22.4.2 类型 55 22.4.3 成员方法 55 22.4.4 示例代码1-作为Rasterizer渲染: 56 22.4.5 示例代码2-作为顶点源渲染: 57 23 小结 58

110,534

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧