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
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
相关文章推荐
- unity3D学习【功能实现】之九:鼠标拖动图片
- JS实现鼠标点击拖动窗口方法
- 鼠标拖动层(可任意绑定DIV标签)的两种实现方法
- C#中实现鼠标拖动窗体的方法
- 鼠标拖动改变DIV等网页元素的大小的实现方法
- mfc下鼠标拖动画面使视图移动的实现方法,类似浏览PDF时用手型鼠标移动视图的效果
- javascript 事件处理、鼠标拖动效果实现方法详解
- javascript实现鼠标拖动改变层大小的方法
- 鼠标拖动层(可任意绑定DIV标签)(实现方法二)
- C#实现Winform鼠标拖动窗口大小时设定窗口最小尺寸的方法
- javascript实现鼠标拖动改变层大小的方法
- MFC GDI+实现以鼠标为中心缩放图片(并且可以拖动)
- JS拖动鼠标画出方框实现鼠标选区的方法
- 鼠标拖动层(可任意绑定DIV标签)(实现方法一)
- 最精简的JavaScript实现鼠标拖动效果的方法
- JS拖动鼠标画出方框实现鼠标选区的方法
- 请教方法和例子:VS2003的datagrid控件,如何实现用鼠标拖动的方法选中任意区域的多个单元格,然后进行统一编辑??
- vue+mousemove实现鼠标拖动功能(拖动过快失效问题解决方法)
- excel中非纯数字格式的列,鼠标向下拖动实现自增的方法
- 如何重写PictureBox的OnPaint方法绘制矩形,并实现拖动改变矩形大小,鼠标悬停时提示拖拽方向(二)