我在类中定义了一些CDC,CBitmap的变量在Frame的派生类的构造函数中对图片进行初始化
CrunBallFrame::CrunBallFrame()
{
m_pdc_if=new CDC;
m_temp_dc=new CDC;
m_temp_bmp=new CBitmap; m_pbmp_if=new CBitmap;
m_pbmp_if->LoadBitmap(IDB_BITMAP1); m_pbmp_dish=new CBitmap;
m_pbmp_dish->LoadBitmap(IDB_BITMAP2); m_pbmp_ball=new CBitmap;
m_pbmp_ball->LoadBitmap(IDB_BITMAP3); m_pbmp_square=new CBitmap;
m_pbmp_square->LoadBitmap(IDB_BITMAP4);
}
OnPaint()函数的代码如下所示:void CrunBallFrame::OnPaint() 
{
CPaintDC dc(this); m_pdc_if->CreateCompatibleDC(&dc);
m_temp_dc->CreateCompatibleDC(&dc);
m_temp_bmp->CreateCompatibleBitmap(&dc,538,329); m_pdc_if->SelectObject(m_temp_bmp); m_temp_dc->SelectObject(m_pbmp_if);
m_pdc_if->BitBlt(0,0,538,329,m_temp_dc,0,0,SRCCOPY);
m_temp_dc->SelectObject(m_pbmp_ball);
m_pdc_if->BitBlt(m_ball_x,m_ball_y,9,9,m_temp_dc,0,0,SRCCOPY);
m_temp_dc->SelectObject(m_pbmp_dish);
m_pdc_if->BitBlt(m_x_pos_dish,303,55,6,m_temp_dc,0,0,SRCCOPY);
for(int i=0;i<40;i++){
if(sInf[i].lock==1){
m_temp_dc->SelectObject(m_pbmp_square);
m_pdc_if->BitBlt(sInf[i].x,sInf[i].y,45,20,m_temp_dc,0,0,SRCCOPY);

}
}
dc.BitBlt(0,0,538,329,m_pdc_if,0,0,SRCCOPY);
m_temp_bmp->DeleteObject();
m_pdc_if->DeleteDC();
m_temp_dc->DeleteDC();
}我还定义了一个timer,会在100毫秒内调用Invalidate()函数进行从绘。我的代码还是会出现很严重的刷屏现象。请问我的问题出在哪里了,,我没有找到,谢谢:)

解决方案 »

  1.   

    响应WM_ERASEBKGND消息,直接返回true。
    另外,你的程序存在严重资源泄漏。
      

  2.   

    恩,,加了这个消息直接返回true就好了,,但是我不大理解这是为什么,要是有时间还请帮我说明一下好吗?谢谢了。。为什么会存在资源泄漏呢?我暂时还没有查出来,,我一会儿马上看看。。谢谢指点:)
      

  3.   

    因为这个消息默认调用了基类的刷新代码,也就是每次Invalidate后,都要重新绘制一遍背景,然后才是你的绘图代码,这样就产生了闪烁。你的绘图代码最好包含自己的绘制背景的代码(绘制到内存位图上)。位图选入DC后,不用了要及时选出。你没有选出位图的操作。
      

  4.   

    Mackz(在相互)   正确