头文件 AnimationBmp.h:
- #ifndef __CANIMATIONBMP_H__
- #define __CANIMATIONBMP_H__
- class CAnimationBmp //动画位图封装类
- {
- public:
- HDC m_hBackDC;
- HDC m_hForeDC;
- HDC m_hMaskDC;
- HDC m_hForeDC2;
- HDC m_hNewDC;
- HBITMAP m_hBackBMP;
- HBITMAP m_hForeBMP;
- HBITMAP m_hMaskBMP;
- HBITMAP m_hForeBMP2;
- HBITMAP m_hNewBMP;
- int m_cxBack,m_cyBack;
- int m_cxFore,m_cyFore;
- int m_cxMask,m_cyMask;
- int m_cxFore2,m_cyFore2;
- int m_cxNew,m_cyNew;
- public:
- CAnimationBmp(); //类构造函数
- ~CAnimationBmp(); //类析构函数
- BOOL InitAnimationBmp(HDC hDestDC,HBITMAP hBackResBMP,HBITMAP hForeResBMP,COLORREF crMask); //初始化动画位图(背景位图,前景位图,前景位图的掩码位图)
- void UnInitAnimationBmp(); //反初始化动画位图(背景位图,前景位图,前景位图的掩码位图)
- void SynthesisBmp(int x,int y); //合成位图
- void DrawNewBmp(HDC hDestDC,int x,int y); //绘制合成后的新位图
- void DrawBackBmp(HDC hDestDC,int x,int y); //绘制背景位图
- void DrawForeBmp(HDC hDestDC,int x,int y); //绘制前景位图
- void DrawMaskBmp(HDC hDestDC,int x,int y); //绘制前景位图的掩码位图
- };
- #endif
实现文件 AnimationBmp.cpp:
- #include "StdAfx.h"
- #include "AnimationBmp.h"
- //类构造函数
- CAnimationBmp::CAnimationBmp()
- {
- }
- //类析构函数
- CAnimationBmp::~CAnimationBmp()
- {
- }
- //初始化动画位图(背景位图,前景位图,前景位图的掩码位图)
- BOOL CAnimationBmp::InitAnimationBmp(HDC hDestDC,HBITMAP hBackResBMP,HBITMAP hForeResBMP,COLORREF crMask)
- {
- HDC hMemDC;
- HBITMAP hOldBmp;
- BITMAP stBmpInfo;
- ::GetObject(hBackResBMP,sizeof(stBmpInfo),&stBmpInfo);
- m_cxBack = stBmpInfo.bmWidth;
- m_cyBack = stBmpInfo.bmHeight;
- m_cxNew = stBmpInfo.bmWidth;
- m_cyNew = stBmpInfo.bmHeight;
- ::GetObject(hForeResBMP,sizeof(stBmpInfo),&stBmpInfo);
- m_cxFore = stBmpInfo.bmWidth;
- m_cyFore = stBmpInfo.bmHeight;
- m_cxFore2 = stBmpInfo.bmWidth;
- m_cyFore2 = stBmpInfo.bmHeight;
- m_cxMask = stBmpInfo.bmWidth;
- m_cyMask = stBmpInfo.bmHeight;
- m_hBackDC = ::CreateCompatibleDC(hDestDC);
- m_hBackBMP = ::CreateCompatibleBitmap(hDestDC,m_cxBack,m_cyBack);
- hOldBmp = (HBITMAP)::SelectObject(m_hBackDC,(HGDIOBJ)m_hBackBMP);
- ::DeleteObject(hOldBmp);
- m_hNewDC = ::CreateCompatibleDC(hDestDC);
- m_hNewBMP = ::CreateCompatibleBitmap(hDestDC,m_cxBack,m_cyBack);
- hOldBmp = (HBITMAP)::SelectObject(m_hNewDC,(HGDIOBJ)m_hNewBMP);
- ::DeleteObject(hOldBmp);
- hMemDC = ::CreateCompatibleDC(hDestDC);
- hOldBmp = (HBITMAP)::SelectObject(hMemDC,(HGDIOBJ)hBackResBMP);
- ::BitBlt(m_hBackDC,0,0,m_cxBack,m_cyBack,hMemDC,0,0,SRCCOPY);
- ::SelectObject(hMemDC,hOldBmp);
- ::DeleteDC(hMemDC);
- m_hForeDC = ::CreateCompatibleDC(hDestDC);
- m_hForeBMP = ::CreateCompatibleBitmap(hDestDC,m_cxFore,m_cyFore);
- hOldBmp = (HBITMAP)::SelectObject(m_hForeDC,(HGDIOBJ)m_hForeBMP);
- ::DeleteObject(hOldBmp);
- m_hForeDC2 = ::CreateCompatibleDC(hDestDC);
- m_hForeBMP2 = ::CreateCompatibleBitmap(hDestDC,m_cxFore,m_cyFore);
- hOldBmp = (HBITMAP)::SelectObject(m_hForeDC2,(HGDIOBJ)m_hForeBMP2);
- ::DeleteObject(hOldBmp);
- m_hMaskDC = ::CreateCompatibleDC(hDestDC);
- m_hMaskBMP = ::CreateCompatibleBitmap(hDestDC,m_cxMask,m_cyMask);
- hOldBmp = (HBITMAP)::SelectObject(m_hMaskDC,(HGDIOBJ)m_hMaskBMP);
- ::DeleteObject(hOldBmp);
- hMemDC = ::CreateCompatibleDC(hDestDC);
- hOldBmp = (HBITMAP)::SelectObject(hMemDC,(HGDIOBJ)hForeResBMP);
- ::BitBlt(m_hForeDC,0,0,m_cxFore,m_cyFore,hMemDC,0,0,SRCCOPY);
- ::BitBlt(m_hMaskDC,0,0,m_cxFore,m_cyFore,hMemDC,0,0,SRCCOPY);
- ::SelectObject(hMemDC,hOldBmp);
- ::DeleteDC(hMemDC);
- for(int i = 0; i < m_cyFore; i++)
- {
- for(int j = 0; j < m_cxFore; j++)
- {
- COLORREF clrPixel = ::GetPixel(m_hMaskDC,j,i);
- if(clrPixel != crMask)
- {
- ::SetPixel(m_hMaskDC,j,i,RGB(255,255,255));
- }
- }
- }
- return TRUE;
- }
- //反初始化动画位图(背景位图,前景位图,前景位图的掩码位图)
- void CAnimationBmp::UnInitAnimationBmp()
- {
- ::DeleteObject(m_hBackBMP);
- ::DeleteDC(m_hBackDC);
- ::DeleteObject(m_hNewBMP);
- ::DeleteDC(m_hNewDC);
- ::DeleteObject(m_hForeBMP);
- ::DeleteDC(m_hForeDC);
- ::DeleteObject(m_hForeBMP2);
- ::DeleteDC(m_hForeDC2);
- ::DeleteObject(m_hMaskBMP);
- ::DeleteDC(m_hMaskDC);
- }
- //合成位图
- void CAnimationBmp::SynthesisBmp(int x,int y)
- {
- ::BitBlt(m_hNewDC,0,0,m_cxBack,m_cyBack,m_hBackDC,0,0,SRCCOPY);
- ::BitBlt(m_hForeDC2,0,0,m_cxFore,m_cyFore,m_hForeDC,0,0,SRCCOPY);
- ::BitBlt(m_hForeDC2,0,0,m_cxFore,m_cyFore,m_hMaskDC,0,0,SRCINVERT);
- ::BitBlt(m_hNewDC,x,y,m_cxFore - 1,m_cyFore - 1,m_hMaskDC,0,0,SRCPAINT);
- ::BitBlt(m_hNewDC,x,y,m_cxFore - 1,m_cyFore - 1,m_hForeDC2,0,0,SRCINVERT);
- }
- //绘制动画位图
- void CAnimationBmp::DrawNewBmp(HDC hDestDC,int x,int y)
- {
- ::BitBlt(hDestDC,x,y,m_cxNew,m_cyNew,m_hNewDC,0,0,SRCCOPY);
- }
- //绘制背景位图
- void CAnimationBmp::DrawBackBmp(HDC hDestDC,int x,int y)
- {
- ::BitBlt(hDestDC,x,y,m_cxBack,m_cyBack,m_hBackDC,0,0,SRCCOPY);
- }
- //绘制前景位图
- void CAnimationBmp::DrawForeBmp(HDC hDestDC,int x,int y)
- {
- ::BitBlt(hDestDC,x,y,m_cxFore,m_cyFore,m_hForeDC,0,0,SRCCOPY);
- }
- //绘制前景位图的掩码位图
- void CAnimationBmp::DrawMaskBmp(HDC hDestDC,int x,int y)
- {
- ::BitBlt(hDestDC,x,y,m_cxMask,m_cyMask,m_hMaskDC,0,0,SRCCOPY);
- }