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里面
在下一次绘制前景(新图片)的时候
仅仅把原本那个“被弄脏”的区域覆盖回去
然后再生成一个新的区域,把背景保存到内存里面
然后再贴新的图片
...
循环
但是发现效果和想象中不同
求教
解决方案 »
- 表头拖动交换列时HDN_BEGINDRAG 和HDN_ENDDRAG该使用哪个消息
- VC win32程序播放AVI
- 再次加分求助,关于编译连接的问题!
- 如果我的下拉菜单下内容太多,超过了屏幕高度,那么咋能一下全部出现在屏幕上,就像360浏览器收藏的菜单一样。
- 怎么把文件复制到局域网的另一台机器相???
- 两个文件操作问题?
- 如何用Delphi做一个ActiveX?
- 求助:头文件如何包含?
- 用Csocket 写的服务器聊天程序,为什么在用Vb写的客户端接受到(Winsocket)的信息不能显示在Textbox
- 好久没来CSDN了,散分
- 使用DirectShow 为啥创建不出对象来?
- 基于对话框的应用程序中,如何标记菜单
但是脏矩阵还是需要的,你的原来想的效果和真实的效果是什么?不过windows可以维护脏矩阵的问题,你刷新的时候只需要invalidaterect()这个函数就可以了。
计算出了脏rect,作为参数传递过去就可以了。
其实我的设想是
比如一个游戏场景
背景是固定的,但是前景有精灵在移动
那么,每次我只要去刷新被精灵‘弄脏’的区域就好了
在一个精灵移动的时候,把原本被“弄脏”的区域图片还原回去就好了我试过invalidaterect,但是在这个绘图函数里面调用却发现它会整个的刷屏幕
有点郁闷,就用这种方法实现了