阅读794 返回首页    go 人物


用DirectDraw封装的位图动画类

头文件

  1.   
  2.   
  3.   std;  
  4.   
  5.   
  6.   
  7.   
  8.  CDXImage  
  9. {  
  10. :  
  11.     CDXImage();  
  12.     ~CDXImage();  
  13.   
  14. :  
  15.       
  16.      LoadImageFromFile( *pFileName,  cx,  cy);  
  17.       
  18.      LoadDXImage(* pBits,  cx,  cy);  
  19.       
  20.      Display(CDC *pDC);  
  21.       
  22.      InitDraw( hWnd);  
  23.       
  24.      RestoreAll( hWnd);  
  25. :  
  26.       
  27.      ReleaseObject();  
  28.   
  29. :  
  30.     IDirectDraw7        *m_lpDD;                  
  31.     IDirectDrawSurface7 *m_lpDDSPrimary;          
  32.     IDirectDrawSurface7 *m_lppDDSBackBuffer;      
  33.   
  34. :  
  35.     vector<> m_vpBMPs;   
  36.      m_hWnd;  
  37. };  
#pragma once #include <vector> using namespace std; #include <DShow.h> #include <uuids.h> #define DXIMAGE_WIDTH 1024 #define DXIMAGE_HEIGHT 768 class CDXImage { public: CDXImage(void); ~CDXImage(void); // public: // 文件中载入位图 BOOL LoadImageFromFile(char *pFileName, int cx, int cy); // 载入图像 void LoadDXImage(char* pBits, int cx, int cy); // 显示图像 void Display(CDC *pDC); // 初始化DirectDraw void InitDraw(HWND hWnd); // 恢复丢失的图面 void RestoreAll(HWND hWnd); protected: // 释放对象 void ReleaseObject(); // DX objects private: IDirectDraw7 *m_lpDD; // DirectDraw Object IDirectDrawSurface7 *m_lpDDSPrimary; // Primary Surface Object IDirectDrawSurface7 *m_lppDDSBackBuffer; // BackBuffer Surface Object // Image Object private: vector<HBITMAP> m_vpBMPs; // BMP Objects Array HWND m_hWnd; };

源文件

  1.   
  2.   
  3. CDXImage::CDXImage()  
  4. {  
  5.       
  6.     ->m_lpDD = NULL;  
  7.     ->m_lpDDSPrimary = NULL;  
  8.     ->m_lppDDSBackBuffer = NULL;  
  9.     ->m_hWnd = NULL;  
  10. }  
  11. CDXImage::~CDXImage()  
  12. {  
  13.     ReleaseObject();  
  14. }  
  15.  
  16.  
  17.  
  18.  
  19.  
  20.  
  21.  
  22.  
  23.   
  24.  CDXImage::LoadDXImage( *pBits,  cx, cy)  
  25. {  
  26.       
  27. }  
  28.  
  29.  
  30.  
  31.  
  32.  
  33.  
  34.  
  35.  
  36.  
  37.  
  38.   
  39.  CDXImage::LoadImageFromFile( *pFileName,  cx,  cy)  
  40. {  
  41.      hbmp;  
  42.     hbmp = ()LoadImage(AfxGetInstanceHandle(), pFileName, IMAGE_BITMAP, cx, cy, LR_LOADFROMFILE);  
  43.      (hbmp == NULL)  
  44.     {  
  45.         AfxMessageBox();  
  46.          FALSE;  
  47.     }  
  48.     m_vpBMPs.push_back(hbmp);  
  49.      TRUE;  
  50. }  
  51.  
  52.  
  53.  
  54.  
  55.  
  56.  
  57.   
  58.  CDXImage::InitDraw( hWnd)  
  59. {  
  60.     ASSERT(m_lpDD == NULL);  
  61.     ASSERT(m_lpDDSPrimary == NULL);  
  62.     ASSERT(m_lppDDSBackBuffer == NULL);  
  63.     ASSERT(m_vpBMPs.size() == 0);  
  64.     ASSERT(m_hWnd == NULL);  
  65.     m_hWnd = hWnd;  
  66.       
  67.      hr;  
  68.     hr = DirectDrawCreateEx(NULL, (**)&m_lpDD, IID_IDirectDraw7, NULL);  
  69.      (FAILED(hr))  
  70.     {  
  71.         AfxMessageBox();  
  72.         ;  
  73.     }  
  74.     hr = m_lpDD->SetCooperativeLevel(m_hWnd, DDSCL_NORMAL);  
  75.      (FAILED(hr))  
  76.     {  
  77.         AfxMessageBox();  
  78.         ;  
  79.     }  
  80.       
  81.     DDSURFACEDESC2 ddsd;  
  82.     memset(&ddsd, 0, (ddsd));  
  83.     ddsd.dwSize = (ddsd);  
  84.     ddsd.dwFlags = DDSD_CAPS;  
  85.     ddsd.ddsCaps.dwCaps = DDSCAPS_PRIMARYSURFACE;  
  86.     hr = m_lpDD->CreateSurface(&ddsd, &m_lpDDSPrimary, NULL);  
  87.      (FAILED(hr))  
  88.     {  
  89.         AfxMessageBox();  
  90.         ;  
  91.     }  
  92.       
  93.     IDirectDrawClipper *lpClipper = NULL;  
  94.     hr = m_lpDD->CreateClipper(NULL, &lpClipper, NULL);  
  95.      (FAILED(hr))  
  96.     {  
  97.         AfxMessageBox();  
  98.         ;  
  99.     }  
  100.     hr = lpClipper->SetHWnd(0, hWnd);  
  101.      (FAILED(hr))  
  102.     {  
  103.         AfxMessageBox();  
  104.         ;  
  105.     }  
  106.     hr = m_lpDDSPrimary->SetClipper(lpClipper);  
  107.      (FAILED(hr))  
  108.     {  
  109.         AfxMessageBox();  
  110.         ;  
  111.     }  
  112.     lpClipper->Release();  
  113.       
  114.     memset(&ddsd, 0, (ddsd));  
  115.     ddsd.dwSize = (ddsd);  
  116.     ddsd.dwFlags = DDSD_CAPS | DDSD_HEIGHT | DDSD_WIDTH;  
  117.     ddsd.ddsCaps.dwCaps = DDSCAPS_OFFSCREENPLAIN;  
  118.     ddsd.dwWidth = DXIMAGE_WIDTH;  
  119.     ddsd.dwHeight = DXIMAGE_HEIGHT;  
  120.     hr = m_lpDD->CreateSurface(&ddsd, &m_lppDDSBackBuffer, NULL);  
  121.      (FAILED(hr))  
  122.     {  
  123.         AfxMessageBox();  
  124.         ;  
  125.     }  
  126. }  
  127.  
  128.  
  129.  
  130.  
  131.  
  132.  
  133.   
  134.  CDXImage::Display(CDC *pDC = NULL)  
  135. {  
  136.       
  137.      hr;  
  138.     DDSURFACEDESC2 desc;  
  139.     memset(&desc, 0, (desc));  
  140.     desc.dwSize = (desc);  
  141.     hr = m_lppDDSBackBuffer->GetSurfaceDesc(&desc);  
  142.      (FAILED(hr))  
  143.     {  
  144.         AfxMessageBox();  
  145.         ;  
  146.     }  
  147.   
  148.      (vector<>::iterator it = m_vpBMPs.begin(); it != m_vpBMPs.end(); it++)  
  149.     {  
  150.           
  151.          hDC;  
  152.          (m_lppDDSBackBuffer->GetDC(&hDC) != DD_OK)  
  153.         {  
  154.             ;  
  155.         }  
  156.           
  157.         CDC dc;   
  158.         dc.m_hDC = hDC;  
  159.          nSavedDC = dc.SaveDC();  
  160.         CDC memDC;  
  161.         memDC.CreateCompatibleDC(&dc);  
  162.          hbmp = *it;  
  163.         memDC.SelectObject(hbmp);  
  164.         dc.BitBlt(0, 0, DXIMAGE_WIDTH, DXIMAGE_HEIGHT, &memDC, 0, 0, SRCCOPY);  
  165.         memDC.DeleteDC();  
  166.         DeleteObject(hbmp);  
  167.           
  168.           
  169.         CRect rcClient;  
  170.         GetClientRect(m_hWnd, &rcClient);  
  171.         ClientToScreen(m_hWnd, &rcClient.TopLeft());  
  172.         ClientToScreen(m_hWnd, &rcClient.BottomRight());  
  173.         dc.RestoreDC(nSavedDC);  
  174.         dc.m_hDC = NULL;  
  175.         m_lppDDSBackBuffer->ReleaseDC(hDC);  
  176.         m_lpDDSPrimary->Blt(&rcClient, m_lppDDSBackBuffer, NULL, DDBLT_WAIT, NULL);  
  177.     }  
  178. }  
  179.  
  180.  
  181.  
  182.  
  183.  
  184.   
  185.  CDXImage::ReleaseObject()  
  186. {  
  187.       
  188.      (m_lpDDSPrimary != NULL)  
  189.     {  
  190.         m_lpDDSPrimary->Release();  
  191.         m_lpDDSPrimary = NULL;  
  192.     }  
  193.      (m_lppDDSBackBuffer != NULL)  
  194.     {  
  195.         m_lppDDSBackBuffer->Release();  
  196.         m_lppDDSBackBuffer = NULL;  
  197.     }  
  198.      (m_lpDD != NULL)  
  199.     {  
  200.         m_lpDD->Release();  
  201.         m_lpDD = NULL;  
  202.     }  
  203. }  
  204.  
  205.  
  206.  
  207.  
  208.  
  209.  
  210.   
  211.  CDXImage::RestoreAll( hWnd)  
  212. {  
  213.      hr;  
  214.     hr = m_lpDDSPrimary->Restore();  
  215.      (hr == DDERR_WRONGMODE)  
  216.     {  
  217.         TRACE();  
  218.         ReleaseObject();  
  219.         m_hWnd = hWnd;  
  220.         InitDraw(m_hWnd);  
  221.         ;  
  222.     }  
  223.       (FAILED(hr))  
  224.     {  
  225.         ;  
  226.     }  
  227.      (FAILED(m_lppDDSBackBuffer->Restore()))  
  228.     {  
  229.         ;  
  230.     }  
  231. }  
#include "StdAfx.h" #include "DXImage.h" CDXImage::CDXImage(void) { // 成员变量初始化 this->m_lpDD = NULL; this->m_lpDDSPrimary = NULL; this->m_lppDDSBackBuffer = NULL; this->m_hWnd = NULL; } CDXImage::~CDXImage(void) { ReleaseObject(); } /************************************************************************ * 函数名称:LoadDXImage * 函数功能:从DSP端接收图像数据 * 函数参数: * char *pBits : 图像数据 * int cx : 图像宽度 * int cy : 图像高度 * 返回值:void ************************************************************************/ void CDXImage::LoadDXImage(char *pBits, int cx,int cy) { } /************************************************************************ * 函数名称:LoadImageFromFile * 函数功能:从硬盘文件中读取图像 * 函数参数: * char *pFileName : 图像文件名 * int cx : 图像宽度 * int cy : 图像高度 * 返回值类型:BOOL true : 文件载入成功 false: 文件载入失败 ************************************************************************/ BOOL CDXImage::LoadImageFromFile(char *pFileName, int cx, int cy) { HBITMAP hbmp; hbmp = (HBITMAP)LoadImage(AfxGetInstanceHandle(), pFileName, IMAGE_BITMAP, cx, cy, LR_LOADFROMFILE); if (hbmp == NULL) { AfxMessageBox("Failed to Load Image /n Please Check the File Path!"); return FALSE; } m_vpBMPs.push_back(hbmp); return TRUE; } /************************************************************************ * 函数名称:InitDraw * 函数功能:初始化DirectDraw * 函数参数: * HWND hWnd : 图像显示窗口句柄 * 返回值类型:void ************************************************************************/ void CDXImage::InitDraw(HWND hWnd) { ASSERT(m_lpDD == NULL); ASSERT(m_lpDDSPrimary == NULL); ASSERT(m_lppDDSBackBuffer == NULL); ASSERT(m_vpBMPs.size() == 0); ASSERT(m_hWnd == NULL); m_hWnd = hWnd; // 创建DirectDraw对象 HRESULT hr; hr = DirectDrawCreateEx(NULL, (VOID**)&m_lpDD, IID_IDirectDraw7, NULL); if (FAILED(hr)) { AfxMessageBox("Failed to Create DirectDraw Object!"); return; } hr = m_lpDD->SetCooperativeLevel(m_hWnd, DDSCL_NORMAL); if (FAILED(hr)) { AfxMessageBox("Failed to Initialize DirectDraw"); return; } // 创建主图面 DDSURFACEDESC2 ddsd; memset(&ddsd, 0, sizeof(ddsd)); ddsd.dwSize = sizeof(ddsd); ddsd.dwFlags = DDSD_CAPS; ddsd.ddsCaps.dwCaps = DDSCAPS_PRIMARYSURFACE; hr = m_lpDD->CreateSurface(&ddsd, &m_lpDDSPrimary, NULL); if (FAILED(hr)) { AfxMessageBox("Failed to Create primary surface!"); return; } // 创建裁剪 IDirectDrawClipper *lpClipper = NULL; hr = m_lpDD->CreateClipper(NULL, &lpClipper, NULL); if (FAILED(hr)) { AfxMessageBox("Failed to Create Clipper!"); return; } hr = lpClipper->SetHWnd(0, hWnd); if (FAILED(hr)) { AfxMessageBox("Failed to Create Window Clipper!"); return; } hr = m_lpDDSPrimary->SetClipper(lpClipper); if (FAILED(hr)) { AfxMessageBox("Failed to Set Clipper of Primary Surface!"); return; } lpClipper->Release(); // 创建辅助画面 memset(&ddsd, 0, sizeof(ddsd)); ddsd.dwSize = sizeof(ddsd); ddsd.dwFlags = DDSD_CAPS | DDSD_HEIGHT | DDSD_WIDTH; ddsd.ddsCaps.dwCaps = DDSCAPS_OFFSCREENPLAIN; ddsd.dwWidth = DXIMAGE_WIDTH; ddsd.dwHeight = DXIMAGE_HEIGHT; hr = m_lpDD->CreateSurface(&ddsd, &m_lppDDSBackBuffer, NULL); if (FAILED(hr)) { AfxMessageBox("Failed to Create Assistant Surface!"); return; } } /************************************************************************ * 函数名称:Display * 函数功能:显示图像 * 函数参数: * CDC pDC : 图像显示设备上下文 * 返回值类型:void ************************************************************************/ void CDXImage::Display(CDC *pDC = NULL) { // 绘制辅助图面 HRESULT hr; DDSURFACEDESC2 desc; memset(&desc, 0, sizeof(desc)); desc.dwSize = sizeof(desc); hr = m_lppDDSBackBuffer->GetSurfaceDesc(&desc); if (FAILED(hr)) { AfxMessageBox("Failed to Get Assistant Surface Descriptor"); return; } for (vector<HBITMAP>::iterator it = m_vpBMPs.begin(); it != m_vpBMPs.end(); it++) { // 获取设备DC HDC hDC; if (m_lppDDSBackBuffer->GetDC(&hDC) != DD_OK) { return; } // 保存DC CDC dc; //dbg dc.m_hDC = hDC; int nSavedDC = dc.SaveDC(); CDC memDC; memDC.CreateCompatibleDC(&dc); HBITMAP hbmp = *it; memDC.SelectObject(hbmp); dc.BitBlt(0, 0, DXIMAGE_WIDTH, DXIMAGE_HEIGHT, &memDC, 0, 0, SRCCOPY); memDC.DeleteDC(); DeleteObject(hbmp); //m_vpBMPs.erase(it); CRect rcClient; GetClientRect(m_hWnd, &rcClient); ClientToScreen(m_hWnd, &rcClient.TopLeft()); ClientToScreen(m_hWnd, &rcClient.BottomRight()); dc.RestoreDC(nSavedDC); dc.m_hDC = NULL; m_lppDDSBackBuffer->ReleaseDC(hDC); m_lpDDSPrimary->Blt(&rcClient, m_lppDDSBackBuffer, NULL, DDBLT_WAIT, NULL); } } /************************************************************************ * 函数名称:ReleaseObject * 函数功能:释放DirectDraw对象 * 函数参数:无 * 返回值类型:void ************************************************************************/ void CDXImage::ReleaseObject() { // 删除对象 if (m_lpDDSPrimary != NULL) { m_lpDDSPrimary->Release(); m_lpDDSPrimary = NULL; } if (m_lppDDSBackBuffer != NULL) { m_lppDDSBackBuffer->Release(); m_lppDDSBackBuffer = NULL; } if (m_lpDD != NULL) { m_lpDD->Release(); m_lpDD = NULL; } } /************************************************************************ * 函数名称:RestoreAll * 函数功能:所有DirectDraw对象复位 * 函数参数: HWND hWnd : 图像显示设备句柄 * 返回值类型:void ************************************************************************/ void CDXImage::RestoreAll(HWND hWnd) { HRESULT hr; hr = m_lpDDSPrimary->Restore(); if (hr == DDERR_WRONGMODE) { TRACE("Dispaly model changed"); ReleaseObject(); m_hWnd = hWnd; InitDraw(m_hWnd); return; } else if (FAILED(hr)) { return; } if (FAILED(m_lppDDSBackBuffer->Restore())) { return; } }

用法:

适用于Win32平台

一、创建一个CDXImage类对象

  1. CDXImage m_DXImage;  
CDXImage m_DXImage;

二、初始化并载入位图

  1. m_DXImage.InitDraw(GetSafeHwnd());    
  2. m_DXImage.LoadImageFromFile(, 1024, 768);  
  3. m_DXImage.LoadImageFromFile(, 1024, 768);  
m_DXImage.InitDraw(GetSafeHwnd()); // 初始化DX图像对象 m_DXImage.LoadImageFromFile("pics//0.bmp", 1024, 768); m_DXImage.LoadImageFromFile("pics//2.bmp", 1024, 768);

三、显示位图

  1. m_DXImage.Display(NULL);  
m_DXImage.Display(NULL);

然后可借助定时器使用。

最后更新:2017-04-03 16:48:40

  上一篇:go ARM架构
  下一篇:go ARM开发软件ADS教程