一个关于“脏矩阵”绘图的问题

skypu 2008-01-17 09:41:31

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里面
在下一次绘制前景(新图片)的时候
仅仅把原本那个“被弄脏”的区域覆盖回去
然后再生成一个新的区域,把背景保存到内存里面
然后再贴新的图片
...
循环
但是发现效果和想象中不同
求教
...全文
533 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
skypu 2008-01-23
  • 打赏
  • 举报
回复
呵呵,谢谢各位
其实我的设想是
比如一个游戏场景
背景是固定的,但是前景有精灵在移动
那么,每次我只要去刷新被精灵‘弄脏’的区域就好了
在一个精灵移动的时候,把原本被“弄脏”的区域图片还原回去就好了

我试过invalidaterect,但是在这个绘图函数里面调用却发现它会整个的刷屏幕
有点郁闷,就用这种方法实现了
iamshuke 2008-01-18
  • 打赏
  • 举报
回复
奇怪了,怎么看不到回复?
captain_x 2008-01-17
  • 打赏
  • 举报
回复
的却不用这样
但是脏矩阵还是需要的,你的原来想的效果和真实的效果是什么?

不过windows可以维护脏矩阵的问题,你刷新的时候只需要invalidaterect()这个函数就可以了。
计算出了脏rect,作为参数传递过去就可以了。
iamshuke 2008-01-17
  • 打赏
  • 举报
回复
现在做这种程序,没必要用“脏矩阵”,这种方法是386之前时代用的。用内存DC,在内存DC中绘制背景、前景,然后用Bitblt把内存DC Copy到对话框的DC中,根本不会闪烁。

15,979

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 界面
社区管理员
  • 界面
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧