您的位置:首页 > 其它

GDI+学习(5)用拖动鼠标方法手绘(只实现画椭圆)

2009-07-21 22:28 726 查看
(1)为Form1类增加几个变量

private System.Drawing.Point EndPoint;

private System.Drawing.Point StartPoint;

private System.Drawing.Bitmap bits;

private System.Drawing.Graphics bitG;

private bool flag = false;

(2)在构造函数中实例化

bits = new System.Drawing.Bitmap(pictureBox1.Width, pictureBox1.Height);

bitG = System.Drawing.Graphics.FromImage(bits);

bitG.Clear(System.Drawing.Color.White);

this.BackgroundImage = bits; //设置窗体的背景图片为bits

(3) 处理MouseDown,MouseMove,MouseUp事件

private void Form1_MouseDown(object sender, MouseEventArgs e)

{

flag = true;

StartPoint.X = e.X;

StartPoint.Y = e.Y;

EndPoint.X=e.X;

EndPoint.Y=e.Y;

}

private void Form1_MouseMove(object sender, MouseEventArgs e)

{

if (flag) //绘画状态

{

Rectangle r1 = getDrawRectangle();

r1.Width += 2;

r1.Height += 2;

this.Invalidate(r1); //前一个区域无效

//相当于是bits图像中保存了所有被记录的绘制内容,所以零时的更新都在窗体上。

this.Update();

EndPoint.X = e.X;

EndPoint.Y = e.Y;

r1 = getDrawRectangle();

this.CreateGraphics().DrawEllipse(Pens.Blue, r1);

}

}

private Rectangle getDrawRectangle()

{

int x1, x2, y1, y2;

if (StartPoint.X < EndPoint.X)

{

x1 = StartPoint.X;

x2 = EndPoint.X;

}

else

{

x1 = EndPoint.X;

x2 = EndPoint.X;

}

if (StartPoint.Y < EndPoint.Y)

{

y1 = StartPoint.Y;

y2 = EndPoint.Y;

}

else

{

y1 = EndPoint.Y;

y2 = StartPoint.Y;

}

return new Rectangle(x1, y1, x2-x1, y2-y1);

}

private void Form1_MouseUp(object sender, MouseEventArgs e)

{

if (flag)

{

//绘制到bitmap

EndPoint.X = e.X;

EndPoint.Y = e.Y;

Rectangle r=getDrawRectangle();

bitG.DrawEllipse (Pens.Blue, r);

flag = false;

this.BackgroundImage = bits;

}

}

能够解决窗体自动重绘的问题,但是画面有闪烁。本例子参考了《C#应用程序设计教程》。
首发:http://www.iwebtrados.com.cn/post/42.html
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: