程序中有一个部分需要做到图片的热点,我的方法是向需要热点的位置上贴我重写的Label,大概一张热点图里有10个20个不等的热点.问题在于,当我在程序中反复操作,使显示的热点图重复出现多次后,把这个窗体hide,之后在show的时候,会很长时间才显示出来.我怀疑是内存方面的原因,但是在程序中做了很多控制也不好用.再有,热点图是在picturebox上显示的,热点的label就贴在picturebox上.

解决方案 »

  1.   

    建议不要贴Label控件,这样的话如果热点多了自然非常费内存你可以事先定义一些Rectangle对象,每个Rectangle记录下热点的位置,然后在装图片控件的MouseMove事件中判断鼠标是否处于这些Rectangle中,如果是则按自己的要求来做相应的动作!
      

  2.   

    代码很多啊,我觉得贴不全.
    我再描述一下:大体上就是左边一个treeview,点击某个节点时,右边的窗口显示一个图片,这个图片上有一些点需要相应鼠标点击,和点击treeview节点的效果是一样的,这个被点击的点我重写了一个label,把需要保存的信息放到里边,这样只要在重写的label里做鼠标响应的事件操作就可以了.但是,每一个热点我都需要new一个label 然后在放到picturebox的相应位置,这样,在反复的更改图片的时候,我怀疑会产生很多垃圾,或者是别的什么,反正速度会越来越慢.
      

  3.   

    回 bitsbird(一瓢 在路上...)  热点是我的一种说法,就是图上的某个区域对鼠标的操作需要响应.
    Jim3(Jim)  能不能说说你是怎么实现的?
      

  4.   

    速度问题.net很头疼啊,
    我做了一个,刚刚打开就要20M内存,
    查资料,dispose()没有太大用,
    null我也看了,还是不行,
    最后再GC.Collect();
    还是一样啊,看不到内存有丝毫减少,
    我也想知道怎么办啊?
      

  5.   

    我的做法类似 dbspro(冷锋) 所说是从书《面向组件编程》的代码演化而来,如果需要留下email
      

  6.   

    我也有过类似的经历,我觉得有两个要点:
    1,dot net 中,大量使用控件确实速度非常慢,我的做法是用一张图片作为底图,每次将这张底图画在一个新图片上,然后在新图片上用GDI+画出热点(热点可以用另一张小图片),很方便。这样可以用到GDI+的双缓冲区,无论图多么复杂,对速度影响不大。2,因为UI的操作很慢,而判断的运算很频繁,因此尤其要注意数据与UI的分离,比如,对热点与鼠标关系的判断用独立的矩阵而不要直接读取图片上的内容,等等
      

  7.   

    谢谢啊!! sarcophile(食肉动物) 这个思路.
      

  8.   

    我们公司现在做一个用户控件,也是使用热点的,美工是这样做的
    ,先做一张底图片上,图片上面做好要连接的具体有那些功能,然后用GDI做出
    与功能个数一样多的长方形的格子,长方形的格子做好热点,然后把事先做好的图片
    作为GDI的底图,浏览时好象速度不慢,但是有个问题,如果要传参数就不能实现
      

  9.   

    应该不会有问题的啊,我做了一个类似的东西,运行很好,不过不是用label控件的,因为我个人认为label控件是轻量级的控件,还是别使用在其他控件之上。
      

  10.   

    jimh(Jimmy) 你用的是什么控件?为什么你认为label不要用在其他控件上呢?
      

  11.   

    用gdi画出热点范围,若一个矩形框,将热点坐标记录到一个集合中,然后通过鼠标点击的坐标判断该点处于集合中的哪个热点里面