BOOL CSubDlgMain::OnEraseBkgnd(CDC* pDC) 

  HBITMAP hBmp=(HBITMAP) LoadImage(AfxGetInstanceHandle(), "D:\\pro\\res\\station.bmp", IMAGE_BITMAP, 0, 0, LR_LOADFROMFILE); 
  CDC mpDC; 
  mpDC.CreateCompatibleDC(pDC); 
  HBITMAP OldhBmp=(HBITMAP) mpDC.SelectObject(hBmp); 
  size=g_ResLoad.GetBitmapSize(_T("\\res\\station.bmp")); 
  pDC->BitBlt(0,0,size.cx,size.cy,&mpDC, 0,0,SRCCOPY); 
  mpDC.SelectObject(OldhBmp); 
  DeleteObject(hBmp); 
return true; 

因为在我的代码里hBmp为局部变量,所以每次刷新都要从硬盘文件读资源速度慢,但如把hBmp定义到头文件,初始化时LoadImage,就不能在这里用DeleteObject(hBmp)了,只能到最后DeleteObject(hBmp),又听说LoadImage加载后产生了一个GDI对象,而系统的GDI对象是有限的,那要是在头文件定义很多的hBmp会有问题吧。想问下各位有什么好的办法没,大家是怎么处理这种从文件加载的情况的。

解决方案 »

  1.   

    直接定义成类变量可以说有限主要是针对gdi泄漏的,比如你这个代码最后没有DeleteObject(hBmp)这句的话就会很危险
      

  2.   

    将HBITMAP hBmp放到你的CSubDlgMain中作为一个成员变量,然后在对话框类的构造函数中写hBmp=(HBITMAP) LoadImage(AfxGetInstanceHandle(), "D:\\pro\\res\\station.bmp", IMAGE_BITMAP, 0, 0, LR_LOADFROMFILE); 那么你在OnEraseBkgnd中就可以直接拿hBmp这个句柄来用,文件也只需要加载一次,保持住句柄
      

  3.   

    可以直接定义成员变量呀,没看到过别人这么定义,还以为不可以呢,一直都以为DeleteObject要紧跟在后面调用,到退出程序时调用也可以呀
      

  4.   

    保持住句柄
    就是说到程序退出时再调用DeleteObject(hBmp)吧
      

  5.   

    定义CBitmap cbit 在头文件中  然后用 cbit.load怎么样啊