C#/GDI+绘图/解决矩形绘制只能向右下方绘制/width、height为负无法绘制问题

1 篇文章 0 订阅

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;
           
        }
}

这种就可以完美解决以上问题

(代码由于只是部分,其中具体的链表、类的封装不包含,所以有想详细咨询的也可以评论区留言)
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值