CDC* pDC = GetDC(); 
if ( m_bCircling )
{//滚动显示,只显示一张照片
if ( m_memBKDC.m_hDC )
{
pDC->BitBlt(0, 0, m_PicPreSize.cx, m_PicPreSize.cy, &m_memBKDC, 0, 0, SRCCOPY);
TRACE("背景覆盖");
DeleteObject(m_memBmp);
m_memBKDC.DeleteDC();
}
m_memBKDC.CreateCompatibleDC(pDC);
CMyBMP* pMyBmp = new CMyBMP;
                InitialBMPEx(pMyBmp);
m_PicExPos.cx = (m_size.cx - pMyBmp->m_size.cx)/2;
m_PicExPos.cy = (m_size.cy - pMyBmp->m_size.cy)/2;
m_PicPrePos = m_PicExPos;
m_PicPreSize = pMyBmp->m_size;
m_PicExSize = pMyBmp->m_size;
m_memBmp = CreateCompatibleBitmap(m_memBKDC.m_hDC, m_PicExSize.cx, m_PicExSize.cy);
m_memBKDC.SelectObject(m_memBmp);
m_memBKDC.BitBlt(0, 0, m_PicExSize.cx, m_PicExSize.cy, pDC, m_PicExPos.cx, m_PicExPos.cy, SRCCOPY);
CBmpSpecialShow::SpecialShow(0, pDC, m_PicExPos.cx, m_PicExPos.cy, pMyBmp->m_Bmp, pMyBmp->m_size);
CRect rcText((m_size.cx-pMyBmp->m_size.cx)/2, (m_size.cy+pMyBmp->m_size.cy)/2, pMyBmp->m_size.cx, pMyBmp->m_size.cy/10 );
pDC->SetBkMode(TRANSPARENT);
pDC->DrawText(pMyBmp->m_strName, rcText, DT_CENTER | DT_VCENTER);
TRACE(pMyBmp->m_strName);
TRACE("\n");

思路:整个对话框的背景是在另外一个函数里面绘制的
这里是绘制前景
绘制第一副图片的时候
得到图片的区域左上角坐标以及区域的宽,高
然后把屏幕DC上面的东西保存到内存dc里面
在下一次绘制前景(新图片)的时候
仅仅把原本那个“被弄脏”的区域覆盖回去
然后再生成一个新的区域,把背景保存到内存里面
然后再贴新的图片
...
循环
但是发现效果和想象中不同
求教

解决方案 »

  1.   

    现在做这种程序,没必要用“脏矩阵”,这种方法是386之前时代用的。用内存DC,在内存DC中绘制背景、前景,然后用Bitblt把内存DC Copy到对话框的DC中,根本不会闪烁。
      

  2.   

    的却不用这样
    但是脏矩阵还是需要的,你的原来想的效果和真实的效果是什么?不过windows可以维护脏矩阵的问题,你刷新的时候只需要invalidaterect()这个函数就可以了。
    计算出了脏rect,作为参数传递过去就可以了。
      

  3.   

    呵呵,谢谢各位
    其实我的设想是
    比如一个游戏场景
    背景是固定的,但是前景有精灵在移动
    那么,每次我只要去刷新被精灵‘弄脏’的区域就好了
    在一个精灵移动的时候,把原本被“弄脏”的区域图片还原回去就好了我试过invalidaterect,但是在这个绘图函数里面调用却发现它会整个的刷屏幕
    有点郁闷,就用这种方法实现了