1.你的代码有严重内存泄漏,没有释放占有内存和GDI对象。2.使用双缓存解决重绘的闪烁问题.可以参考下面代码在OnDraw中:CDC dcBack;
CBitmap bpBack;
dcBack.CreateCompatibleDC(&dc);//创建内存DC ,dc为显示DC
bpBack.CreateCompatibleBitmap(&dc,rect.Width(),rect.Height());
CBitmap*poldbmp=dcBack.SelectObject(&bpBack);
//在dcBack中绘制//可以尝试在对内存DC绘图之前将显示DC图像做为背景复制到内存DC中.
dcBack.BitBlt(0,0,rect.Width(),rect.Height(),&dc,0,0,SRCCOPY);//绘图操作
...//将dcBack中的图像绘到显示DC.
dc.BitBlt(0,0,rect.Width(),rect.Height(),&dcBack,0,0,SRCCOPY);
dcBack.SelectObject(poldbmp);

解决方案 »

  1.   

    我的代码如下:
    CRect rect;
    GetClientRect(&rect);
    pDC->FillSolidRect(rect,RGB(255,255,255));
    请问如何释放内存和GDI对象?
      

  2.   

    太少。再贴相关代码。
    包括pDC初始化部分。
      

  3.   

    你创建了pen font BITMAP等但没有恢复
      

  4.   

    如果有贴图,别忘了,把bmp对象也要删除
      

  5.   

    视图闪烁到是用hover那样的解决,但是我原来就不明白dcBack.SelectObject(poldbmp);这最后一句是什么意思?是释放还是恢复呢?在所有有关位图选择的情况下最后一句都是它,希望高手指点
      

  6.   

    比如开始时,
    CBitmap bmp;
    CDC dc;
    // init bmp;
    // init dc
    CBitmap * pOld = dc.SelectObject(&bmp);
    ...dc.SelectObject(pOld);如果没有最后这一句,pOld所指向的资源没有释放。而bmp所含的资源被dc或bmp本身释放,要看哪个析构函数先调用。
    如果有最后这一句,pOld被dc释放,而bmp析构函数自己会释放资源。