我用增加Label的方式画了很多方块(因为需要相应事件,没有用画图的办法).
然后函数每次开始的时候,用Controls.Clear+Dispose的方式来清理资源.
这个画图的函数执行很多次后(随机,大概是画了几千个label后),再画出的Label会出现红叉.
然后任何窗体都打不开了,包括程序的和windows的,连任务管理器也打不开.
错误日志记录如下
Error creating window handle.  System.Windows.Forms    at System.Windows.Forms.NativeWindow.CreateHandle(CreateParams cp)
   at System.Windows.Forms.Control.CreateHandle()
   at System.Windows.Forms.Control.CreateControl(Boolean fIgnoreVisible)
   at System.Windows.Forms.Control.CreateControl(Boolean fIgnoreVisible)
   at System.Windows.Forms.Control.CreateControl()
   at System.Windows.Forms.Control.ControlCollection.Add(Control value)大家帮帮忙,保守需求是我想在出现红叉后,可以让用户按一个按钮,然后清理下资源什么的,可以重新开始.
谢谢了

解决方案 »

  1.   

    因为需要相应事件,没有用画图的办法
    你可以用dataGridView, 然后用cell的事件啊。
    几千个控件, 几千个handle, 别的不算, 光这个就够系统受的了。没有解决方案。 
    或者说解决方案就是不要用那么多的控件。 用一个DataGridView之类的, 一个handle一堆显示的控件。
      

  2.   

    别小看了Label,每个Label都有很多事件,特别是自身的绘制,每当添加一个Label,原来添加的所有Label都会重汇,Label越多,重绘负担就越大,几千个肯定死翘翘了。
      

  3.   

    用画图的办法也可以捕获事件的,直接从Form的级别上捕获鼠标事件和键盘事件,然后判断鼠标当前坐标处理,这样效率高。
      

  4.   

    Panel 绘图不够么?
    用Label的事件,无非是点击事件么。
    根据鼠标点击的位置,来处理事件。
      

  5.   

    继承Label,重写OnPaint,不要调用base 的 paint
      

  6.   


    其实每次只产生几十个个label,我估计这个动作多做很多次后,以前的handle没有清空
      

  7.   

    可以肯定的是你的Paint有很多无用的,或者更改一个属性后又引发Paint,一个接一个
      

  8.   

    这种直接用GDI+就行了吧,还一个一个label不停添,当然是死掉
      

  9.   


    自己画的话,你首先要定义一个数据结构,来记录"label"的位置。
    在画板的鼠标事件中,按x,y坐标,判断触发数据结构中哪个"label"的事件。
    定义好结构,写个共同方法,会发现一切都很简单。PS:现在出问题一定是label没有很好的释放,可以检查一下释放的代码。
      

  10.   

    释放控件必须调用控件自身的Dispose方法,你是这样做的吗?单单从父容器中移除是没用的,占用的资源还是存在。
      

  11.   

    handle资源被你用完了呗。你够狠。
      

  12.   

    public void MyDispose()
            {
                base.Dispose(true);
            }
    我在每个自定义控件里都这样写的,然后确保都调用了
      

  13.   

    你是对内部每个控件单独调用的Dispose方法吗?你是不是重写了什么控件,不然怎么有个“base.Dispose(true);”让你调用?
    总之信息不足,问题不好找。
      

  14.   


    rectangle.contains()这个方法可以判断一个point或rectangle是否在此矩形中
      

  15.   

    wo 晕,直接画啊,你的图像都是矩形的 2维坐标系计算坐标有什么烦的。
    你用LABEL太浪费资源了,一个控件就是一个窗口