C# GDI+绘图 绘制矩形的bug
“我的绘图绘制矩形只能mousedown然后鼠标向右下时才能画出,不然就报错”
“我使用g.DrawRectangle绘制矩形明知道向‘右上、左下、左上’时把width和height取绝对值,然后改变参数里Rectangle的.X 和.Y改变一下就好了,怎么却实现不了”
以上这些问题就是这个程序设计里我们有些C#初学者会遇到的
之所以实现不了,我想很多学生可能首先想到的是在
private void Form1_MouseMove(object sender, MouseEventArgs e)
里进行更改,可能想着对e.X、e.Y分别和最初鼠标落下存入链表中的点做一个对比,判断实现
例如
int a=e.X-**.rect.X;//此处的rect指的是最初落下点,也是常规情况(向右下绘制)我们取的左上点,正常我们应该是存在链表里或者封装起来的,这里方便一些,我就直接这样代指好了
int b=e.Y-**.rect.Y;
if(a>=0&&b>=0)
{
**.width=a;
**.width=b;
}
if(a<=0&&b>=0)//此时为向左下方绘制
{
**.width=-a;
**.width=-b;
**.rect.X+=a;
}
可能有些同学这里粗心大意了,试想,在这个过程中原本固定的存起来的最初点,不也在不断变化么,以至于进而a和b也无法得到正确的值了,所以我们可以 引入一个Point point;来记录最初的那个下落点,用这个点计算a与b具体的解决方法代码呢,附在下面
... ....
private void Form1_MouseDown(object sender, MouseEventArgs e)
{
hwRect.rect.X = e.X;
hwRect.rect.Y = e.Y;
hwRect.point.X = e.X;
hwRect.point.Y = e.Y;
lstGeometry.Add(hwRect);
}
... ...
private void Form1_MouseMove(object sender, MouseEventArgs e)
{
int a= e.X - ((HwRectangle)lstGeometry[lstGeometry.Count - 1]).point.X;
int b= e.Y - ((HwRectangle)lstGeometry[lstGeometry.Count - 1]).point.Y;
if (a >= 0&&b>=0)
{
((HwRectangle)lstGeometry[lstGeometry.Count - 1]).rect.Width = e.X - ((HwRectangle)lstGeometry[lstGeometry.Count - 1]).rect.X;
((HwRectangle)lstGeometry[lstGeometry.Count - 1]).rect.Height = e.Y - ((HwRectangle)lstGeometry[lstGeometry.Count - 1]).rect.Y;
}
else if(a<0&&b<0)
{
((HwRectangle)lstGeometry[lstGeometry.Count - 1]).rect.Width = (-a);
((HwRectangle)lstGeometry[lstGeometry.Count - 1]).rect.Height = (-b);
((HwRectangle)lstGeometry[lstGeometry.Count - 1]).rect.X = e.Location.X;
((HwRectangle)lstGeometry[lstGeometry.Count - 1]).rect.Y = e.Location.Y;
}
else if(a>0&&b<0)
{
((HwRectangle)lstGeometry[lstGeometry.Count - 1]).rect.Width = a;
((HwRectangle)lstGeometry[lstGeometry.Count - 1]).rect.Height = -b;
((HwRectangle)lstGeometry[lstGeometry.Count - 1]).rect.Y = e.Location.Y;
}
else if(a<0&&b>0)
{
((HwRectangle)lstGeometry[lstGeometry.Count - 1]).rect.Width = -a;
((HwRectangle)lstGeometry[lstGeometry.Count - 1]).rect.Height = b;
((HwRectangle)lstGeometry[lstGeometry.Count - 1]).rect.X = e.Location.X;
}
}