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对象一样,指向的是上次释放掉的那个内存空间!然而他现在是空的,因此,参数错误!而且这个错误报错信息看不见,调试里变量跟踪也看不到这个!服了服了,被自己蠢哭。