3个问题:
1.在窗体用鼠标如何能够一边移动一边画线,看了一些GDI+都是固定的画线,没用.
2.在窗体上画好的线如何删除并及时刷新呈现出来,不要跟我说用画笔改变颜色,没用.
3.画好的线我应该如何存储,便于下次打开窗体直接呈现出上一次画好的线,也想过用数据库存储坐标点,不知道还有没有更好的办法?
1.在窗体用鼠标如何能够一边移动一边画线,看了一些GDI+都是固定的画线,没用.
2.在窗体上画好的线如何删除并及时刷新呈现出来,不要跟我说用画笔改变颜色,没用.
3.画好的线我应该如何存储,便于下次打开窗体直接呈现出上一次画好的线,也想过用数据库存储坐标点,不知道还有没有更好的办法?
{
Graphics g = this.CreateGraphics();
Pen p= new Pen(Color.Black);
g.DrawLine(p, 10, 10, 200, 10); Bitmap bmp = new Bitmap(Width, Height); bmp.Save(fileName);
}
2 可以将线画到图片上,再将图片画到窗体上,也可以将图片设置为窗体的背景图片
3 将画好的图片直接保存,也可以建个存储点位的类,序列化后再保存,当然存到XML中也可以
private Point p1, p2;
//定义绘图对象
private Graphics g;
//定义存储绘过的所有对象(窗体刷新时用来重绘)
private List<drawtype> ls = new List<drawtype>();
private Pen pen1 = new Pen(Color.White, 2);
private Pen pen2 = new Pen(Color.Black, 2);
private bool bl = false; /// <summary>
/// 鼠标在窗体上点击的时候发生
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void Form1_MouseDown(object sender, MouseEventArgs e)
{
p1 = e.Location;
g.SmoothingMode = SmoothingMode.AntiAlias;
pen2.LineJoin = LineJoin.Round;
//--------------------------------------------
} /// <summary>
/// 窗体重绘时读取集合中的线条
/// </summary>
/// <param name="e"></param>
protected override void OnPaint(PaintEventArgs e)
{
//使用枚举将所有画过的线重绘(为了防止新画的线的白色会将原有线更改)
foreach (drawtype t in ls)
{
//画出原有的每一条线
g.DrawLine(pen2, t.p1, t.p2);
}
base.OnPaint(e);
} /// <summary>
/// 鼠标在窗体上点击移动时发生
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void Form1_MouseMove(object sender, MouseEventArgs e)
{ //----------------------------------------------------
//如果鼠标左键一直接下
if (e.Button == MouseButtons.Left)
{
bl = true;
//开始画白线(与背景色一样的线,用来擦除鼠标移动时产生的线)White
g.DrawLine(pen1, p1, p2);
//清空背景颜色
g.Clear(this.BackColor);
//获得鼠标在窗体中按下并移动时的坐标点
p2 = e.Location;
//在窗体中画出的线
g.DrawLine(pen2, p1, p2);
}
} /// <summary>
/// 鼠标单击释放时发生
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void Form1_MouseUp(object sender, MouseEventArgs e)
{
//--------------------------------
//记录画线的位置,放到泛型集合中
if (bl)
{
ls.Add(new drawtype(p1, p2));
}
bl = false; //p2 = e.Location;
//--------------------------------
//this.label3.Text = e.X.ToString();
//this.label4.Text = e.Y.ToString();
//point2 = new Point(e.X, e.Y);
//Pen p = new Pen(Color.Red, 10);
////平滑处理,消除锯齿
//gh.SmoothingMode = SmoothingMode.AntiAlias;
//gh.DrawLine(p, point1, point2);
//p.Dispose();
//gh.Dispose();
}
大家看看有哪里值得改善的,这样做有个不好的地方那就是每次画第二根线的时候前面画好的线都会被隐藏,只有重绘的时候才会全部读取出来.
画线之前用g.clear();
清除重绘画布
或者矩形!http://download.csdn.net/source/2389093