VC实现图片移动(动画效果)

本文介绍了如何在VC++环境中使用双缓冲技术实现图片(尤其是透明图片)在背景图上的移动效果,包括背景图片和前景图片的加载,以及在鼠标移动或时钟消息触发时的动画实现步骤。通过CDrawBitmap类和BitBlt函数,实现图片的绘制和屏幕拷贝,从而达到平滑的动画体验。
摘要由CSDN通过智能技术生成

 

VC实现图片移动(动画效果)

 

更新日期:2010-12-15
代码下载:demo.zip (请不要直接使用迅雷下载)

测试环境:VC6.0+WinXP
图片预览:

━━━━━━━━━━━━━━━━━━━━━━━━


以下代码演示如何实现透明图片(或者一般图片)在背景图上移动效果。

一、原理简介:
    1.我们把所以图画到一个内存DC里,然后在Blt到屏幕,就是所谓的双缓冲了。
    2.在内存DC里画图时,先把背景图画到内存DC,再画上前景需要移动的图片就可以了

二、具体到我们下面的例子:
    1.定义2个CDrawBitmap对象,分别加载背景位图和前景移动的小飞机。
        CDrawBitmap g_bmp1("4244123431.bmp");
        CDrawBitmap g_bmp2("plane.bmp");

    2.鼠标按下移动,或者接收到时钟消息时就实现双缓冲。
        虽然代码有点“繁琐”,但记得我们关心的
        主要是下面代码中hMemDC。所有绘图代码都在这里进行。

        你经常不是这样调用的吗:
            //屏幕上打印字体,画矩形
            HDC hdc=::GetDC(m_hWnd);
            ::TextOut(hdc.......);
            ::RectangleRect(hdc......);
            ::ReleaseDC(m_hWnd,hdc) ;

        而在双缓冲里,只需把所有需要用到屏幕hdc的函数中的hdc替换成hMemDC,如:
            //屏幕上打印字体,画矩形
            ::TextOut(hMemDC.......);
            ::RectangleRect(hMemDC......);

        具体到我们这里的动画,就是:
            g_bmp1.Draw(hMemDC,0,0,600,600); //画背景图片到内存DC
            g_bmp2.DrawTransparent(hMemDC,point.x-50,point.y-100); //画移动的前进小图片

        画好后再调用BitBlt把内存hMemDC所有画好的东西拷贝到屏幕hScrDC
            BitBlt(hScrDC,0,60,600,600,hMemDC,0,0,SRCCOPY);

希望对你有所帮助,谢谢!愿一切吉祥,阿弥陀佛!

 

 

 

 

/****************************************************************************
CDrawBitmap封装了一些画图片的函数。

调用如下:
    CDrawBitmap g_bmp1("D://My Documents//My Pictures//风景图片//4244123431.bmp");
    g_bmp1.Draw(m_hWnd);
    
    CDrawBitmap g_bmp2("D://My Documents//My Pictures//风景图片//plane.bmp");
    g_bmp2.DrawTransparent(m_hWnd);

    CDrawBitmap g_bmp3("D://My Documents//My Pictures//风景图片//jzg2.bmp");
    g_bmp3.DrawTransparent(m_hWnd);

****************************************************************************/

//使用TransparentBlt需要添加 #prag
-------------------------------------------------------------------------------- PictureEx图片显示类支持以下格式的图片:GIF (including animated GIF87a and GIF89a), JPEG, BMP, WMF, ICO, CUR等,我特别推崇的是可以做出动画,而且轻而易举,确实很COOL。 下面是详细的编程过程: 1. 新建项目:在VC6中用MFC新建一个基于对话框的GifDemo应用程序,接受所有缺省选项即可; 2.在项目中插入文件:把PictureEx.h,PictureEx.cpp文件copy 到项目文件夹下,Project->Add to Project->Files中选上PictureEx.h,PictureEx.cpp, Insert; 3.加入图片控件:从对话框控件中把Picture Control(图片控件)拖入主对话框中,修改其属性:ID:IDC_GIF,TYPE:Rectangle,其余接受缺省选项。再在ClassWiard中为IDF_GIF加入CSatic控制变量m_GifPic, 注意看一下,GifDemoDlg.h中是否加上了#include "PictureEx.h"(由ClassWiard加入)。然后将CSatic m_GifPic;更改成CPictureEx m_GifPic; 4.加载动画文件:先将要加载的动画文件放到 res 资源文件夹下,再将其Import进项目中,由于MFC只支持256BMP文件的图片,因此,我们要新建一个图片类型:"GIF",我在这里将我网站的宣传图片roaring.gif放进去 (希望大家多支持),并将其ID修改成:IDR_GIFROARING。 ____________________________________ import(导入)gif动画的详细过程: 在resourceview窗口中,单击鼠标右键,在出现的环境菜单中选择“import...”命令,会出现“import resource”选择文件对话框,文件类型选择“所有文件(*.*)”,open as 选项为"auto",再选择动画文件所在目录,选上要载入的动画文件 roaring.gif,再单击 import,由于gif动画类型不是vc默认的文件类型,这时会出现"custom resource type"对话框,键入“"gif"”,再单击ok,然后再修改其id。 ________________________________________________________________ 5.在程序的适当位置添入加载代码: 这里,我们在CGifDemoDlg::OnInitDialog()函数中加入如下代码: // TODO: Add extra initialization here if (m_GifPic.Load(MAKEINTRESOURCE(IDR_GIFROARING),_T("Gif"))) m_GifPic.Draw(); 如果仅仅把动画载入,到这就可以了,运行一下,应该看看您的的成果了。 下面附带说说如何将这幅动画制作成超链接,以后,咱们也可以宣传自已的公司、网站或产品了。 6.利用ClassWiard加入一个LButtonDown鼠标左键消息处理函数CGifDemoDlg::OnLButtonDown(UINT nFlags, CPoint point), 添入如下代码: void CGifDemoDlg::OnLButtonDown(UINT nFlags, CPoint point) { // TODO: Add your message handler code here and/or call default CRect rect; m_GifPic.GetWindowRect(&rect); ScreenToClient(&rect); if (rect.PtInRect(point)) ShellExecute(AfxGetMainWnd()->m_hWnd,_T("open"), _T("http://roaringwind.best.163.com"),_T(""),NULL,0); CDialog::OnLButtonDown(nFlags, point); } 我在这儿将我主页的地址放上了,运行,点击动画图片就能进入我的站点的了。当然要是能象所有的超链接一样,能将鼠标变成手形,就更好了。 7.改变鼠标形状:将一个鼠标文件放在res文件夹中,IMPORT,ID:IDC_CURSOR1,利用ClassWiard加入一个WM_SETCURSOR消息处理函数CGifDemoDlg::OnSetCursor(CWnd* pWnd, UINT nHitTest, UINT message), 添入如下代码: BOOL CGifDemoDlg::OnSetCursor(CWnd* pWnd, UINT nHitTest, UINT message) { // TODO: Add your message handler code here and/or call default CRect rect; m_GifPic.GetWindowRect(&rect); ScreenToClient(&rect); CPoint point; GetCursorPos(&point); ScreenToClient(&point); if (rect.PtInRect(point) && m_hCursor) { SetCursor(m_hCursor); return TRUE; }; return CDialog::OnSetCursor(pWnd, nHitTest, message); } 不错吧。 大家看到了什么好东西,别忘记了告诉我,谢谢。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值