本人今日编写了一个ocx控件,简而言之就是表示风扇的三种运行状况。0表示停止,1表示运行,2表示故障。0和2都是静止状态,一幅图片就可以。1状态需要两副图片不停地变换以表示风扇运行中,用OnPaint()函数重绘客户区。OnTimer()函数中用Invalidate()使客户区每隔一段时间重绘。控件本身没有什么问题,本人又编写了一个简单exe程序,Project->Add to Project->components and controls选项加载控件,exe程序中就有了控件的类CFanIcon,通过定义实例Creat()控件,也没什么问题。但这个控件是用在工业控制软件上,风扇图标比较多,据说有3000多个。我就定义了对象数组,CFanIcon abc[3000],再通过for循环创建3000个实例然后Creat().问题来了,如果3000个图标都是0或者2状态那没事,都是1状态机器就变的很慢,程序无响应,只能通过资源管理器关闭。请问这种情况如何优化控件,又或者是除了换一台NB电脑外没辙?

解决方案 »

  1.   

    还有,最好不要在 OnTimer()函数中用Invalidate(),直接发一个消息,主线程收到这个消息,将所有的这类消息清空,然后,循环调用每个重新画,最好不要用Invalidate(),用贴图就可以!
      

  2.   


    我的图片其实就是vc里面的Icon,自己画的几张图。设置了一个变量BmpState表示应该显示哪个图片。
    在OnPaint()函数中用Switch(BmpState)判断,根据BmpState的值设置bmp.LoadBitmap(XXXX)函数载入位图。通过CDC::StretchBlt()显示图片。
    在OnTimer函数中变换BmpState的值以及Invalidate()重绘客户区达到变换图片的目的。
      

  3.   

    CreateTimerQueue
    使用Timer队列来管理
    不过这个工作量就大了你需要将原有的WM_TIMER消息转换为Timer Event。
      

  4.   

    对于显示,建议不要每次LoadBitmap,反正就几个,建议先load好,然后,只需要根据具体需要来显示,这样可能会快一点!