向大家请教GDI方式实现动画的问题

Hover 2001-08-12 10:32:02
如何实现简单的无闪烁的动画? 有人说先在内存DC里面绘好,再复制到屏幕DC上。我试过
绘不出来。
有那些要注意的地方吗? 请给个例程。
...全文
84 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
Hover 2001-08-14
  • 打赏
  • 举报
回复
给分。
azuo_lee 2001-08-13
  • 打赏
  • 举报
回复
在需要实现动画的地方,比如在View的OnTimer中:
CDC *pDC = GetDC();
CDC memDC;
CBitmap memBmp, *pOldBmp;
CRect rc;
GetClientRect(rc);
memDC.CreateCompatibleDC(pDC);
memBmp.CreateCompatibleBitmap(pDC, rc.Width(), rc.Height());
pOldBmp = memDC.SelectObject(&memBmp);
memDC.FillSolidRect(rc, RGB(0, 128, 0)); //绘制前先清理
....//在memDC上作图
pDC.BitBlt(rc.left, rc.top, rc.Width(), rc.Height(), &memDC, 0, 0, SRCCOPY);
memDC.SelectObject(pOldBmp);
memBmp.DeleteObject();
memDC.DeleteDC;
ReleaseDC(pDC);
如果你的View不经常变动的话,更好的办法是:
1。将memDC与memBitmap做成全局变量或成员变量;
2。在View初始化时(比如,OnInitUpdate),用CreateCompatibleXXX初始化memDC与memBitmap,并将后者选入前者;
3。在OnDraw中加入一句话,就是上面的BitBlt(当然,GetClientRect也必须有);
4。作图时,直接在memDC上绘制(绘制前可能需要用FillRect清理),然后GetDC,取到屏幕DC,然后调用OnDraw复制到屏幕上(当然也可以用BitBlt),最后ReleaseDC;
5。View销毁时,用DeleteDC与DeleteObject销毁memDC与memBitmap。
这样,额外增加了OnDraw处理的功能,使程序的绘制不会在重绘时丢失;而且不必每次OnTimer时都取得memDC、memBitmap,减少了系统开销。
Hover 2001-08-13
  • 打赏
  • 举报
回复
azuo_lee() 给个详细点的例子程序好吗?
azuo_lee 2001-08-13
  • 打赏
  • 举报
回复
内存DC在绘制之前必须先选入一个位图。位图用CreateCompatibleBitmap产生。
MSXP2 2001-08-12
  • 打赏
  • 举报
回复
............

16,551

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Creator Browser
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

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