griphics对象fillrectangle方法报错

winform初学,又踩进坑了,详情如下:

为了截图,设置了一个蒙版窗体,将可截图区域变白(不是全白),然后拖动鼠标选取矩形区域截取,蒙版窗体又通过主窗体打开,然后蒙版窗体将截取的图片传到下个窗体显示,这是场景以及流程。

然后就出错了

在第一次打开蒙版窗体拖动截图时无任何异常,但只要将截图后的展示窗体关闭,再次通过主窗体打开蒙版窗体,拖动即会报错,错误信息如下:

方法所有参数都试过直接使用具体数值替换,问题依旧

下面是蒙版窗体的相关代码:

 public partial class cutM : Form
    {
        Form cutW;
        Brush p;
        Graphics g;
        int x=0, y=0;
        public cutM(Form f)
        {
            InitializeComponent();
            this.cutW = f;
        }

        private void cutM_Load(object sender, EventArgs e)
        {
            this.Size = new Size(Screen.AllScreens[0].Bounds.Width, Screen.AllScreens[0].Bounds.Height);
        }

        private void cutM_FormClosed(object sender, FormClosedEventArgs e)
        {
            cutW.Close();
        }
        private void cutM_KeyDown(object sender, MouseEventArgs e)
        {
            
            this.MouseMove += cutM_MouseMove;
            g =CreateGraphics();
            p = Brushes.Blue;
            x = e.X;
            y = e.Y;
        }

        private void cutM_MouseUp(object sender, MouseEventArgs e)
        {
            if (x != 0 && y != 0)
            {
                g.FillRectangle(p, x, y, e.X - x, e.Y - y);
                this.MouseMove -= cutM_MouseMove;
                Bitmap b = new Bitmap(e.X - x, e.Y - y, g);
                Graphics bg = Graphics.FromImage(b);
                bg.CopyFromScreen(new Point(x, y), new Point(0, 0), new Size(e.X - x, e.Y - y));
                showCut sc = new showCut(b, new Size(e.X - x, e.Y - y));
                sc.Show();
                g.Dispose();
                p.Dispose();
                this.Close();
            }
        }
        private void cutM_MouseMove(object sender, MouseEventArgs e)
        {
            g.Clear(Color.White);
            g.FillRectangle(Brushes.Blue, x, y, Math.Abs(e.X - x)+1,Math.Abs( e.Y - y)+1);
        }
    }

只要是再次打开的蒙版窗题,运行至FillRectangle就一定会报上图的错误。

求大佬讲解一下原因或解决方法。

目前可以确定的是griphics对象是获得了的,因为前面那句Clear可以运行不会报错,而且调试模式下griphics对象该有的参数都出来了(也可能是我没发现),原本以为是方法参数问题,但替换了Brush、将x,y设为具体数值一样会报错。事件对象也有传回当前鼠标的x,y值,这个在报错信息也能看到(截图中看不到,但实际是能看到的)。现在已然毫无头绪。

7月30日更新:

问题已解决!

首先说一下问题触发的原理,在我写这段代码的思想中,为了防止资源的多余占用,使用了Dispose方法来释放资源,这是没有问题的,我当天检查问题时也没往这个方向上想。但是,我代码中Dispose掉的对象中,Brush对象,那个p,他!不!是!我!new!出!来!的!这个玩意是一个系统给的Brushes对象!只是被我赋值给了p这个对象,相当于我给了个指针,指向了Brushes.Blue指向的对象,然后我在第一次窗体使用完成后,顺手把它给释放掉了!由于这里我的p只是一个指针,所以实际上我是把Brushes.blue对象给释放掉了,因此,参数错误。而且,即使我将p改成了Brushes.blue,他实质上和我自己的p对象一样,指向的是上次释放掉的那个内存空间!然而他现在是空的,因此,参数错误!而且这个错误报错信息看不见,调试里变量跟踪也看不到这个!服了服了,被自己蠢哭。

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值