更新日期: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 |