• 全部
  • C#综合技术
  • C#互联网桌面应用
  • AppLauncher
  • WinForm&WPF
  • C#开发新技术
  • 问答

C#中用“橡皮条”法绘图和重绘

lengyuewuhen 2004-11-02 10:53:09
C#中用“橡皮条”法绘图和重绘

前些日子在论坛上发了个帖子,100分寻求“橡皮条”法绘图的代码。效果不是很好,于是自己参照网友给的代码重新写了一个,解决了绘图与重绘的问题。由于只写了部分,所以功能有限,同时可能算法不是很好,希望大家指点!!窗体中仅包含一个pictrueBox1,先将代码付诸于下:
using System;
using System.Drawing;
using System.Collections;
using System.ComponentModel;
using System.Windows.Forms;
using System.Data;
using System.Drawing.Drawing2D;

namespace GDI_练习
{
/// <summary>
/// Form1 的摘要说明。
/// </summary>
public class Form1 : System.Windows.Forms.Form
{
public System.Windows.Forms.PictureBox pictureBox1;
private Point p1 = Point.Empty, p2 = Point.Empty;
private bool isMouseDown = false, isMouseUp = false;

ArrayList addArray = new ArrayList();
public struct SharpType
{
public string type;
public Point p1, p2;
public Color foreColor, backColor;
public Brush brush;
public SharpType( string type, Point p1, Point p2, Color foreColor, Color backColor, Brush brush )
{
this.type = type;
this.p1 = p1;
this.p2 = p2;
this.foreColor = foreColor;
this.backColor = backColor;
this.brush = brush;
}

}

/// <summary>
/// 必需的设计器变量。
/// </summary>
private System.ComponentModel.Container components = null;

public Form1()
{
//
// Windows 窗体设计器支持所必需的
//
InitializeComponent();

//
// TODO: 在 InitializeComponent 调用后添加任何构造函数代码
//
}

/// <summary>
/// 清理所有正在使用的资源。
/// </summary>
protected override void Dispose( bool disposing )
{
if( disposing )
{
if (components != null)
{
components.Dispose();
}
}
base.Dispose( disposing );
}

#region Windows 窗体设计器生成的代码
/// <summary>
/// 设计器支持所需的方法 - 不要使用代码编辑器修改
/// 此方法的内容。
/// </summary>
private void InitializeComponent()
{
this.pictureBox1 = new System.Windows.Forms.PictureBox();
this.SuspendLayout();
//
// pictureBox1
//
this.pictureBox1.BackColor = System.Drawing.Color.White;
this.pictureBox1.Dock = System.Windows.Forms.DockStyle.Fill;
this.pictureBox1.Location = new System.Drawing.Point(0, 0);
this.pictureBox1.Name = "pictureBox1";
this.pictureBox1.Size = new System.Drawing.Size(432, 397);
this.pictureBox1.TabIndex = 0;
this.pictureBox1.TabStop = false;
this.pictureBox1.Paint += new System.Windows.Forms.PaintEventHandler(this.pictureBox1_Paint);
this.pictureBox1.MouseUp += new System.Windows.Forms.MouseEventHandler(this.pictureBox1_MouseUp);
this.pictureBox1.MouseMove += new System.Windows.Forms.MouseEventHandler(this.pictureBox1_MouseMove);
this.pictureBox1.MouseDown += new System.Windows.Forms.MouseEventHandler(this.pictureBox1_MouseDown);
//
// Form1
//
this.AutoScaleBaseSize = new System.Drawing.Size(6, 14);
this.ClientSize = new System.Drawing.Size(432, 397);
this.Controls.Add(this.pictureBox1);
this.Name = "Form1";
this.Text = "Form1";
this.ResumeLayout(false);

}
#endregion

/// <summary>
/// 应用程序的主入口点。
/// </summary>
[STAThread]
static void Main()
{
Application.Run(new Form1());
}

private void pictureBox1_MouseDown(object sender, System.Windows.Forms.MouseEventArgs e)
{
if( ! isMouseUp )
{
this.isMouseDown = true;
this.p1 = new Point( e.X, e.Y );
}

}

private void pictureBox1_MouseMove(object sender, System.Windows.Forms.MouseEventArgs e)
{
Graphics g = this.pictureBox1.CreateGraphics();
if( isMouseDown && p2 != Point.Empty )
g.DrawEllipse( Pens.White, p1.X, p1.Y, Math.Abs( p1.X - p2.X ), Math.Abs( p1.Y - p2.Y ) );


if( isMouseDown && ! isMouseUp )
{
p2 = new Point( e.X, e.Y );
g.DrawEllipse( Pens.Black, p1.X, p1.Y, Math.Abs( p1.X - p2.X ), Math.Abs( p1.Y - p2.Y ) );

}
foreach( SharpType type in addArray )
{
g.DrawEllipse( Pens.Black, type.p1.X, type.p1.Y, Math.Abs( type.p1.X - type.p2.X ), Math.Abs( type.p1.Y - type.p2.Y ) );

}
g.Dispose();
}

private void pictureBox1_MouseUp(object sender, System.Windows.Forms.MouseEventArgs e)
{
this.isMouseDown = false;
p2 = new Point( e.X, e.Y );
Graphics g = this.pictureBox1.CreateGraphics();
g.DrawEllipse( Pens.Black, p1.X, p1.Y, Math.Abs( p1.X - p2.X ), Math.Abs( p1.Y - p2.Y ) );
addArray.Add( new SharpType( "a", p1, p2, Color.Black, Color.Empty, Brushes.Black ) );
p1 = Point.Empty;
p2 = Point.Empty;
g.Dispose();

}

private void pictureBox1_Paint(object sender, System.Windows.Forms.PaintEventArgs e)
{
foreach( SharpType type in addArray )
{
e.Graphics.DrawEllipse( Pens.Black, type.p1.X, type.p1.Y, Math.Abs( type.p1.X - type.p2.X ), Math.Abs( type.p1.Y - type.p2.Y ) );

}
}



}
}

...全文
229 点赞 收藏 19
写回复
19 条回复
切换为时间正序
当前发帖距今超过3年,不再开放新的回复
发表回复
soilwork 2004-11-17
呵呵
看看这个吧
回复
lengyuewuhen 2004-11-11
找着了
先试一试
谢谢 iYoung()
回复
iYoung 2004-11-11
没关系,不懂就从新学。
不想研究 GDI 的话,就 google 一下吧
http://www.google.com/search?hl=zh-CN&newwindow=1&q=GDI+SetROP2&lr=
第一个链接就是讲这个的。
回复
lengyuewuhen 2004-11-11
你是说,也可以用SetROP2吗?
我不懂GDI啊
回复
iYoung 2004-11-10
用 P/Invoke,跟传统 GDI 方法差不多,无非就是

GetDC
SetROP2
SelectObject
DeleteObject
ReleaseDC

等。可以用 Reflector 察看 .net framework 的源码。

GDI+ 用来实现 半透明、反锯齿、颜色渐变 等效果很方便,但似乎没有实现 SetROP2 的替代方法。
回复
小蕊_claudia 2004-11-10
学习~~~
回复
lengyuewuhen 2004-11-10
iYoung()
回答一下多好啊
回复
soilwork 2004-11-09
iYoung() 举个例子吧
米有用过GDI不太熟
回复
lengyuewuhen 2004-11-09
顶一下
回复
Firestone2003 2004-11-08
dc.SetOP2( R2_NOT )可以使用P/Invoke 调用
回复
lengyuewuhen 2004-11-08
可不可以举个如何调用的例子
回复
lengyuewuhen 2004-11-07

C#z中有没有像C++中的dc.SetOP2( R2_NOT )的呀?
回复
烤火的鱼 2004-11-06
我已经搞定了:
private bool isdown=false;
private Point p1 = Point.Empty;
private Point p2 = Point.Empty;

private void pic_MouseDown(object sender, System.Windows.Forms.MouseEventArgs e)
{
isdown=true;
pic.Capture = true;
p1 = pic.PointToScreen(new Point(e.X, e.Y));
}

private void pic_MouseUp(object sender, System.Windows.Forms.MouseEventArgs e)
{
isdown=false;
pic.Capture = false;
p2 = Point.Empty;
}

private void pic_MouseMove(object sender, System.Windows.Forms.MouseEventArgs e)
{
if(isdown)
{
Point p = pic.PointToScreen(new Point(e.X, e.Y));
if(p2 != Point.Empty)
{
ControlPaint.DrawReversibleLine(p1, p2, Color.Black);
}
p2 = p;
ControlPaint.DrawReversibleLine(p1, p2, Color.Black);
}
}

回复
烤火的鱼 2004-11-06
我的e-Mail:gatmail@163.net qq:52664073,如果需要什么资料,可以到我的ftp://202.107.251.26下载,如果要上传,帐号密码都是: wangyou
回复
烤火的鱼 2004-11-06
你的程序有问题,当鼠标移动时,你采用的方法是用背景色覆盖原来的图形,然后在新的位置画图形,为防止已经画的图形和刚刚画的擦去的图形相交而留下背景色的痕迹,你将原来的图形重新画了一遍,这对单一背景色是看不出来的,如果设置一下该picturebox的image属性为一个照片,该方法的问题就出来了(鼠标移动时会留下白色椭圆),最好的办法是采用异或作图,但我目前也没有找到如何设置xor作图,希望共同研究.
回复
iYoung 2004-11-06
橡皮筋还是直接用 GDI 画较方便,最终效果用 GDI+ 重画一遍。
ControlPaint 的 DrawReversible... 也是用 P/Invoke 调用传统 GDI 函数绘制的。
回复
lengyuewuhen 2004-11-06
“会绘制直线了,其他应该迎刃而解了吧,虽然我没有继续研究。”

不是的,你用的ControlPaint,我以前也试过,是一个网友给的
所以我才重写了
回复
烤火的鱼 2004-11-06
会绘制直线了,其他应该迎刃而解了吧,虽然我没有继续研究。
回复
soilwork 2004-11-06
用ControlPaint只能绘制矩形或直线啊
如果是其他图形怎么办
比如椭圆?
回复
相关推荐
C#中用橡皮条法绘图和重绘
窗体中仅包含一个pictrueBox1,先将代码付诸于下:using System;using System.Drawing;using System.Collections;using System.ComponentModel;using System.Windows.Forms;using System.Data;using System.Drawing....
C#简单的绘图
#这是自己学习做的简单绘图器,大家可以参考下下! 2.2开发环境: 开发平台:Microsoft Windows 10 开发工具:采用Visual Studio 2017来进行系统开发。 2.3需求规定: 该程序能基本完成绘制基础图形的基本要求。我们...
C#基础教程-c#实例教程,适合初学者
本章介绍C#语言的基础知识,希望具有C语言的读者能够基本掌握C#语言,并以此为基础,能够进一步学习用C#语言编写window应用程序Web应用程序。当然仅靠一章的内容就完全掌握C#语言是不可能的,如需进一步学习C#语言...
C#部分源码
C Sharp 短信发送平台源代码.rar http://1000eb.com/5c6vASP.NET+AJAX基础示例 视频教程 http://1000eb.com/89jcC# Winform qq弹窗 360弹窗 http://1000eb.com/89jf精华志 C#高级编程(第七版)源码 ...
C#源码500份
C Sharp 短信发送平台源代码.rar http://1000eb.com/5c6v ... C# Winform qq弹窗 360弹窗 http://1000eb.com/89jf 精华志 C#高级编程(第七版)源码 http://1000eb.com/89k3 C#网络应用编程教案及代码.rar h
C#基础教程
本章介绍C#语言的基础知识,希望具有C语言的读者能够基本掌握C#语言,并以此为基础,能够进一步学习用C#语言编写window应用程序Web应用程序。当然仅靠一章的内容就完全掌握C#语言是不可能的,如需进一步学习C#语言...
android安卓源码海量项目合集打包-1
下载地址 最后更新共计113个分类5177套源码29.2 GB。 卷 新加卷 的文件夹 PATH 列表 卷序列号为 00000200 5E7A:7F30 F:. ├─前台界面 │ ├─3D标签云卡片热门 ...│ │ android 流式布局热门标签.zip │ │ ...
12图形图像编程
为了在Windows窗口输出数据(字符或图形),Windows操作系统提供了一些工具函数,例如提供笔用来定义图形外轮廓线的颜色及粗细,提供刷子定义添充封闭图形内部的颜色格式,提供不同输出字体,提供函数用来输出字符...
游戏引擎架构 (Jason Gregory 著)
第一部分 基础 第1章 导论 第2章 专业工具 第3章 游戏软件工程基础 第4章 游戏所需的三维数学 第二部分 低阶引擎系统 第5章 游戏支持系统 第6章 资源及文件系统 第7章 游戏循环及实时模拟(已...第四部分 游...
程序员的思维修炼:开发认知潜能的九堂课
如喜欢本书,请购买正版。
ArcGIS Engine 地理信息系统开发从入门到精通(第二版)
第一篇 基础篇
后备电池及储能电池巡检白皮书.pdf
后备电池及储能电池巡检白皮书,施耐德电气主编的,数据中心电池巡检白皮书。
CListControl设置颜色
CListControl类派生,设置单元格颜色,丰富功能
winform常用控件
主要包含内容: 第一讲 课程简介 第二讲 Windows窗体-创建和介绍 第三讲 Windows窗体-属性 第四讲 Windows窗体-方法和事件 第五讲 Windows窗体-MDI窗体和子窗体 第六讲 控件的相关操作 第七讲 Label控件显示世界你好 第八讲Button控件 第九讲TextBox控件 第十讲RichTextBox控件 第十一讲ComboBox控件 等 学会winform常用控件基本使用
Linux系统管理员/网络管理员(PDF版)
两本非常好的Linux系统学习的书 系统管理主要介绍Linux系统的结构、管理、命令等 网络管理主要从网络协议角度出发阐述Linux的网络功能
STM32F103中文数据手册
这个里面包含了STM32F103的各种型号的数据手册,方面理解
WPF中用于嵌入其他进程窗口的自定义控件(AppContainer)
WPF中用于嵌入其他进程窗口的自定义控件(AppContainer) 具体见博文:http://blog.csdn.net/zzzwwwppp11199988899/article/details/78131292
MSP430_RTC模块学习总结
这是自己在学习MSP430时,对RTC模块的总结,希望可以帮助刚入门者
CIET-2019-0504 数据中心运维管理人才标准.pdf
数据中心运维管理,人才标准,欢迎查看共同学习。
webrtc demo使用方法
谷歌webrtc demo的使用教程,webrtc源代码自行从官网下载,该教程只给出了源代码详细的使用方法,包括如何编译
朴素贝叶斯算法做文本分类-代码
https://blog.csdn.net/zzZ_CMing/article/details/89478436 朴素贝叶斯算法做文本分类,用的是谭松波酒店语料。
FANUC的3210密码破解软件
FANUC 3210 密码破解软件,读取SRAM备份文件,不需要注册,完全免费。
PDB符号文件查看工具 symview,pdbxtract
PDB符号文件查看工具, 包含2个工具symview 和pdbxtract symview可查看文件所有原始信息 pdbxtract 可方便查看结构体等信息, 可导出头文件或xml
FANUC PMC密码破解程序
FANUC 31I PMC密码破解程序 用于OID,30I,31I等FANUC的密码破解
SIEMENS 840D SL调试手册.rar
里面含有840dsl的全部维修,调试,使用手册和资料,编程手册,报警诊断手册,PLC维修调试,系统报警代码,HMI高级手册.等.
(亲测正确版)ASP.NET-c#-捕捉网页快照-网站截图-网站缩略图
(亲测正确版)ASP.NET-c#-捕捉网页快照-网站截图-网站缩略图 ★★★★★★★★★★★★★★★★★★★★★★★★★★★ 建立网站缩略图源码 网页快照ASP.NET网站截图 网页快照ASP.NET c# 输入网址获取网站图片 ★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★ 网上流传了很多网站缩略图的asp.net,但是都无法使用,本人亲测,该代码进行优化,速度快,效率高,占内存非常少。
FANUC B-64113C_01 0i-C 0i Mate-C连接说明书(硬件)册
FANUC B-64113C_01 0i-C 0i Mate-C连接说明书(硬件)册
自己动手从0到1写嵌入式操作系统
这不是rtos源码分析的课程,而是为初级的同学设计,从基础原理讲师,一步步不断迭代设计rtos的课程! 用不到【2000行代码,汇编代码仅18行】(不含注释)实现一个精巧的可以运行在ARM Cortex-M内核芯片上的RTOS! 该RTOS功能与ucos类似,具体实现不同。学习之后,再去学习ucos之类的系统将没有什么问题。 1、系统地掌握RTOS的工作原理及其应用; 2、用更短的时间、更少的精力,学习RTOS相关知识; 3、设计出一个具备自己特色的RTOS。将其用作毕业设计、找工作的敲门砖; 4、提升技术水平,为升职加薪跳槽提供资本。
jquery自己写的文件目录
jquery自己写的文件目录,HttpServlet+js+jsp
B站王红元(codewhy)vue课件以及笔记
B站王红元(codewhy)vue课件以及笔记
发帖
C#
创建于2007-09-28

10.5w+

社区成员

.NET技术 C#
申请成为版主
帖子事件
创建了帖子
2004-11-02 10:53
社区公告

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