【新人求助】MFC用GDI+显示位图动画

tfcqweasd 2013-04-02 10:44:05
我OnkeyDown中设置了定时器,当按下 s 键的时候,设置定时器。

void CGDIPtestDlg::OnKeyDown(UINT nChar, UINT nRepCnt, UINT nFlags)
{
// TODO: 在此添加消息处理程序代码和/或调用默认值
if (0x44==nChar)//按下s键
{
SetTimer(1,10,NULL);
}

CDialog::OnKeyDown(nChar, nRepCnt, nFlags);
}

然后在OnTimer中用GDI+显示位图。

void CGDIPtestDlg::OnTimer(UINT_PTR nIDEvent)
{
// TODO: 在此添加消息处理程序代码和/或调用默认值
KillTimer(1);

CClientDC dc(this);
Graphics gra(dc.m_hDC);
Image image(L"run.png");

gra.DrawImage(&image,m_nPlayerX,150,m_nSrcImageX,0,80,80,UnitPixel);
//m_nPlayerX为图像在窗口中的X坐标,m_nSrcImageX是源图的X坐标。
//源图是四张80×80的图组成的一幅320×80的大图。

m_nSrcImageX+=80;//源图X坐标加80。
m_nPlayerX+=20;//图像在窗口中的X坐标
if(m_nSrcImageX>320)
{
m_nSrcImageX=0; //当源图像的X超过320,X的最大值时,回到第一张循环
}

CDialog::OnTimer(nIDEvent);
}


图大概是这样的


结果是这样的


然后我在
OnTimer的KillTimer后加了一个Invalidate();想要每次调用这个函数就把前一次的图擦掉。
但是发现不行,调用了这个函数,连图都显示不出来了。

我想问问各位前辈,怎么才能做到按下一个键后,就连续播放动画,并且每显示一张图,就把前一张擦掉。
...全文
260 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
we2677507 2015-08-26
  • 打赏
  • 举报
回复
引用 4 楼 rayzzl 的回复:
测试发帖,一会儿自删,谢谢
莫比斯肉环。。
NexTor 2013-04-03
  • 打赏
  • 举报
回复
估计你需要保存一个背景的DC,每次画动画的时候,先贴一次背景的DC,然后再画相应的动画图像。
rayzzl 2013-04-03
  • 打赏
  • 举报
回复


测试发帖,一会儿自删,谢谢
jimette 2013-04-03
  • 打赏
  • 举报
回复
cmemdc http://hi.baidu.com/k273811702/item/443b275915f573ded48bac2b
wushuang443 2013-04-03
  • 打赏
  • 举报
回复
这样的话用线程来处理比较好。同时闪烁的话可以找资料。用双缓冲。网上很多这些资料
菜牛 2013-04-03
  • 打赏
  • 举报
回复
在窗口刷新消息(WM_PAINT)中绘图; 定时器消息中Invalidate窗口引起重绘; 如果出现闪烁用双缓冲解决。

19,468

社区成员

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

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