合成位图封装类

头文件 AnimationBmp.h:

  1. #ifndef __CANIMATIONBMP_H__
  2. #define __CANIMATIONBMP_H__
  3. class CAnimationBmp  //动画位图封装类
  4. {
  5. public:
  6.     HDC m_hBackDC;
  7.     HDC m_hForeDC;
  8.     HDC m_hMaskDC;
  9.     HDC m_hForeDC2;
  10.     HDC m_hNewDC;
  11.     HBITMAP m_hBackBMP;
  12.     HBITMAP m_hForeBMP;
  13.     HBITMAP m_hMaskBMP;
  14.     HBITMAP m_hForeBMP2;
  15.     HBITMAP m_hNewBMP;
  16.     
  17.     int m_cxBack,m_cyBack;
  18.     int m_cxFore,m_cyFore;
  19.     int m_cxMask,m_cyMask;
  20.     int m_cxFore2,m_cyFore2;
  21.     int m_cxNew,m_cyNew;
  22. public:
  23.     CAnimationBmp();  //类构造函数
  24.     ~CAnimationBmp();  //类析构函数
  25.     BOOL InitAnimationBmp(HDC hDestDC,HBITMAP hBackResBMP,HBITMAP hForeResBMP,COLORREF crMask);  //初始化动画位图(背景位图,前景位图,前景位图的掩码位图)
  26.     void UnInitAnimationBmp();  //反初始化动画位图(背景位图,前景位图,前景位图的掩码位图)
  27.     void SynthesisBmp(int x,int y);  //合成位图
  28.     void DrawNewBmp(HDC hDestDC,int x,int y);  //绘制合成后的新位图
  29.     void DrawBackBmp(HDC hDestDC,int x,int y);  //绘制背景位图
  30.     void DrawForeBmp(HDC hDestDC,int x,int y);  //绘制前景位图
  31.     void DrawMaskBmp(HDC hDestDC,int x,int y);  //绘制前景位图的掩码位图
  32. };
  33. #endif

实现文件 AnimationBmp.cpp:

  1. #include "StdAfx.h"
  2. #include "AnimationBmp.h"
  3. //类构造函数
  4. CAnimationBmp::CAnimationBmp()
  5. {
  6. }
  7. //类析构函数
  8. CAnimationBmp::~CAnimationBmp()
  9. {
  10. }
  11. //初始化动画位图(背景位图,前景位图,前景位图的掩码位图)
  12. BOOL CAnimationBmp::InitAnimationBmp(HDC hDestDC,HBITMAP hBackResBMP,HBITMAP hForeResBMP,COLORREF crMask)
  13. {
  14.     HDC hMemDC;
  15.     HBITMAP hOldBmp;
  16.     BITMAP stBmpInfo;
  17.     
  18.     ::GetObject(hBackResBMP,sizeof(stBmpInfo),&stBmpInfo);
  19.     m_cxBack = stBmpInfo.bmWidth;
  20.     m_cyBack = stBmpInfo.bmHeight;
  21.     m_cxNew = stBmpInfo.bmWidth;
  22.     m_cyNew = stBmpInfo.bmHeight;
  23.     ::GetObject(hForeResBMP,sizeof(stBmpInfo),&stBmpInfo);
  24.     m_cxFore = stBmpInfo.bmWidth;
  25.     m_cyFore = stBmpInfo.bmHeight;
  26.     m_cxFore2 = stBmpInfo.bmWidth;
  27.     m_cyFore2 = stBmpInfo.bmHeight;
  28.     m_cxMask = stBmpInfo.bmWidth;
  29.     m_cyMask = stBmpInfo.bmHeight;
  30.     m_hBackDC = ::CreateCompatibleDC(hDestDC);
  31.     m_hBackBMP = ::CreateCompatibleBitmap(hDestDC,m_cxBack,m_cyBack);
  32.     hOldBmp = (HBITMAP)::SelectObject(m_hBackDC,(HGDIOBJ)m_hBackBMP);
  33.     ::DeleteObject(hOldBmp);
  34.     m_hNewDC = ::CreateCompatibleDC(hDestDC);
  35.     m_hNewBMP = ::CreateCompatibleBitmap(hDestDC,m_cxBack,m_cyBack);
  36.     hOldBmp = (HBITMAP)::SelectObject(m_hNewDC,(HGDIOBJ)m_hNewBMP);
  37.     ::DeleteObject(hOldBmp);
  38.     hMemDC = ::CreateCompatibleDC(hDestDC);
  39.     hOldBmp = (HBITMAP)::SelectObject(hMemDC,(HGDIOBJ)hBackResBMP);
  40.     ::BitBlt(m_hBackDC,0,0,m_cxBack,m_cyBack,hMemDC,0,0,SRCCOPY);
  41.     ::SelectObject(hMemDC,hOldBmp);
  42.     ::DeleteDC(hMemDC);
  43.     m_hForeDC = ::CreateCompatibleDC(hDestDC);
  44.     m_hForeBMP = ::CreateCompatibleBitmap(hDestDC,m_cxFore,m_cyFore);
  45.     hOldBmp = (HBITMAP)::SelectObject(m_hForeDC,(HGDIOBJ)m_hForeBMP);
  46.     ::DeleteObject(hOldBmp);
  47.     m_hForeDC2 = ::CreateCompatibleDC(hDestDC);
  48.     m_hForeBMP2 = ::CreateCompatibleBitmap(hDestDC,m_cxFore,m_cyFore);
  49.     hOldBmp = (HBITMAP)::SelectObject(m_hForeDC2,(HGDIOBJ)m_hForeBMP2);
  50.     ::DeleteObject(hOldBmp);
  51.     m_hMaskDC = ::CreateCompatibleDC(hDestDC);
  52.     m_hMaskBMP = ::CreateCompatibleBitmap(hDestDC,m_cxMask,m_cyMask);
  53.     hOldBmp = (HBITMAP)::SelectObject(m_hMaskDC,(HGDIOBJ)m_hMaskBMP);
  54.     ::DeleteObject(hOldBmp);
  55.     hMemDC = ::CreateCompatibleDC(hDestDC);
  56.     hOldBmp = (HBITMAP)::SelectObject(hMemDC,(HGDIOBJ)hForeResBMP);
  57.     ::BitBlt(m_hForeDC,0,0,m_cxFore,m_cyFore,hMemDC,0,0,SRCCOPY);
  58.     ::BitBlt(m_hMaskDC,0,0,m_cxFore,m_cyFore,hMemDC,0,0,SRCCOPY);
  59.     ::SelectObject(hMemDC,hOldBmp);
  60.     ::DeleteDC(hMemDC);
  61.     for(int i = 0; i < m_cyFore; i++)
  62.     {
  63.         for(int j = 0; j < m_cxFore; j++)
  64.         {
  65.             COLORREF clrPixel = ::GetPixel(m_hMaskDC,j,i);
  66.             if(clrPixel != crMask)
  67.             {
  68.                 ::SetPixel(m_hMaskDC,j,i,RGB(255,255,255));
  69.             }
  70.         }
  71.     }
  72.     return TRUE;
  73. }
  74. //反初始化动画位图(背景位图,前景位图,前景位图的掩码位图)
  75. void CAnimationBmp::UnInitAnimationBmp()
  76. {
  77.     ::DeleteObject(m_hBackBMP);
  78.     ::DeleteDC(m_hBackDC);
  79.     ::DeleteObject(m_hNewBMP);
  80.     ::DeleteDC(m_hNewDC);
  81.     ::DeleteObject(m_hForeBMP);
  82.     ::DeleteDC(m_hForeDC);
  83.     ::DeleteObject(m_hForeBMP2);
  84.     ::DeleteDC(m_hForeDC2);
  85.     ::DeleteObject(m_hMaskBMP);
  86.     ::DeleteDC(m_hMaskDC);
  87. }
  88. //合成位图
  89. void CAnimationBmp::SynthesisBmp(int x,int y)
  90. {
  91.     ::BitBlt(m_hNewDC,0,0,m_cxBack,m_cyBack,m_hBackDC,0,0,SRCCOPY);
  92.     ::BitBlt(m_hForeDC2,0,0,m_cxFore,m_cyFore,m_hForeDC,0,0,SRCCOPY);
  93.     ::BitBlt(m_hForeDC2,0,0,m_cxFore,m_cyFore,m_hMaskDC,0,0,SRCINVERT);
  94.     ::BitBlt(m_hNewDC,x,y,m_cxFore - 1,m_cyFore - 1,m_hMaskDC,0,0,SRCPAINT);
  95.     ::BitBlt(m_hNewDC,x,y,m_cxFore - 1,m_cyFore - 1,m_hForeDC2,0,0,SRCINVERT);
  96. }
  97. //绘制动画位图
  98. void CAnimationBmp::DrawNewBmp(HDC hDestDC,int x,int y)
  99. {
  100.     ::BitBlt(hDestDC,x,y,m_cxNew,m_cyNew,m_hNewDC,0,0,SRCCOPY);
  101. }
  102. //绘制背景位图
  103. void CAnimationBmp::DrawBackBmp(HDC hDestDC,int x,int y)
  104. {
  105.     ::BitBlt(hDestDC,x,y,m_cxBack,m_cyBack,m_hBackDC,0,0,SRCCOPY);
  106. }
  107. //绘制前景位图
  108. void CAnimationBmp::DrawForeBmp(HDC hDestDC,int x,int y)
  109. {
  110.     ::BitBlt(hDestDC,x,y,m_cxFore,m_cyFore,m_hForeDC,0,0,SRCCOPY);
  111. }
  112. //绘制前景位图的掩码位图
  113. void CAnimationBmp::DrawMaskBmp(HDC hDestDC,int x,int y)
  114. {
  115.     ::BitBlt(hDestDC,x,y,m_cxMask,m_cyMask,m_hMaskDC,0,0,SRCCOPY);
  116. }
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值