using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
namespace WindowsFormsApplication97
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
//定义画线的两个点p1起始点p2终点
private Point p1,p2;
//定义存储绘过的所有对象(窗体刷新时用来重绘)
private List<drawtype> ls = new List<drawtype>();
public Bitmap image = null;
//窗体载入时新建一个绘图对象
private void Form1_Load(object sender, EventArgs e)
{
this.pictureBox1.Controls.Clear();
image = new Bitmap(this.pictureBox1.Width, this.pictureBox1.Height);
Graphics.FromImage(image).Clear(Color.White);//消除底图的黑色
this.pictureBox1.Image = (Bitmap)image.Clone();//这句话是关键
}
//点击保存图片
private void button1_Click(object sender, EventArgs e)
{
SaveFileDialog sf = new SaveFileDialog();
sf.Filter="(*.bmp)|*.bmp|(*.jpg)|*.jpg";
sf.FilterIndex = 2;
sf.RestoreDirectory = true;
if (sf.ShowDialog()==DialogResult.OK)
{
pictureBox1.Image.Save(sf.FileName);
}
}
//当鼠标点击窗体时记录坐标点(用来记录直线的第一个坐标)
private void pictureBox1_MouseDown(object sender, MouseEventArgs e)
{
//开始记录坐标
p1 = e.Location;
}
//鼠标在窗体中按下时的绘图过程
private void pictureBox1_MouseMove(object sender, MouseEventArgs e)
{
Graphics g = pictureBox1.CreateGraphics();
//如果鼠标左键一直接下
if (e.Button == MouseButtons.Left)
{
//开始画白线(与背景色一样的线,用来擦除鼠标移动时产生的线)
g.DrawLine(new Pen(Color.White, 2), p1, p2);
//获得鼠标在窗体中按下并移动时的坐标点
p2 = e.Location;
//在窗体中画出的线
g.DrawLine(new Pen(Color.Blue, 2), p1, p2);
//使用枚举将所有画过的线重绘(为了防止新画的线的白色会将原有线更改)
chonghui();
}
}
private void chonghui()
{
Graphics g = pictureBox1.CreateGraphics();
foreach (drawtype t in ls)
{
//画出原有的每一条线
g.DrawLine(new Pen(Color.Blue, 2), t.p1, t.p2);
}
}
//鼠标点击弹起时,记录刚刚画线的位置
private void pictureBox1_MouseUp(object sender, MouseEventArgs e)
{
//记录画线的位置,放到泛型集合中
ls.Add(new drawtype(p1, new Point(e.X,e.Y)));
}
private void pictureBox1_Paint(object sender, PaintEventArgs e)
{
Graphics g = pictureBox1.CreateGraphics();
chonghui();
}
private void pictureBox1_Click(object sender, EventArgs e)
{
}
}
//定义存储画线动作的类
class drawtype
{
//定义两个点
public Point p1, p2;
//定义构造方法(两个点为参数)
public drawtype(Point pp, Point pp2)
{
p1 = pp;
p2 = pp2;
}
}
}