用DirectDraw封装的位图动画类
头文件
- #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;
- };
#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;
};
源文件
- #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;
- }
- }
#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类对象
- CDXImage m_DXImage;
CDXImage m_DXImage;
二、初始化并载入位图
- m_DXImage.InitDraw(GetSafeHwnd()); // 初始化DX图像对象
- m_DXImage.LoadImageFromFile("pics//0.bmp", 1024, 768);
- m_DXImage.LoadImageFromFile("pics//2.bmp", 1024, 768);
m_DXImage.InitDraw(GetSafeHwnd()); // 初始化DX图像对象
m_DXImage.LoadImageFromFile("pics//0.bmp", 1024, 768);
m_DXImage.LoadImageFromFile("pics//2.bmp", 1024, 768);
三、显示位图
- m_DXImage.Display(NULL);
m_DXImage.Display(NULL);
然后可借助定时器使用。
用DirectDraw封装的位图动画类的更多相关文章
- iOS常用动画 类封装
//这是一个很好的动画封装类 很容易明白很详细 和大家分享 // CoreAnimationEffect.h // CoreAnimationEffect // // Created by Vince ...
- 原生Js封装的动画类
算法用的是Tween类,需要研究的参考这篇文章: http://www.cnblogs.com/cloudgamer/archive/2009/01/06/Tween.html 网页里常用的动画 放大 ...
- Android RecyclerView单击、长按事件:基于OnItemTouchListener +GestureDetector标准实现(二),封装抽取成通用工具类
Android RecyclerView单击.长按事件:基于OnItemTouchListener +GestureDetector标准实现(二),封装抽取成通用工具类 我写的附录文章2,介绍了 ...
- cocos2d 播放GIF动画类
cocos2d 播放GIF动画类 以前项目中曾经用到过,后来因为GIF图像的质量较差,被弃用了,把公司名字去掉分享下,根据网上资料改编的cocos2d-iphone版的. // // CCSprite ...
- Android ScaleAnimation类:尺寸变化动画类
ScaleAnimation类是Android系统中的尺寸变化动画类,用于控制View对象的尺寸变化,该类继承于Animation类. ScaleAnimation类中的很多方法都与Animation ...
- 【Cocos2d-X开发学习笔记】第21期:动画类(CCAnimate)的使用
本系列学习教程使用的是cocos2d-x-2.1.4(最新版为3.0alpha0-pre) ,PC开发环境Windows7,C++开发环境VS2010 之前我们已经学习过一些方法让节点“动”起来,Co ...
- Redis操作Hash工具类封装,Redis工具类封装
Redis操作Hash工具类封装,Redis工具类封装 >>>>>>>>>>>>>>>>>> ...
- Redis操作字符串工具类封装,Redis工具类封装
Redis操作字符串工具类封装,Redis工具类封装 >>>>>>>>>>>>>>>>>>& ...
- iOS_SN_push/pop转场动画封装和一般动画封装
封装类中的方法: #import <Foundation/Foundation.h> #import <UIKit/UIKit.h> @interface AnimationE ...
随机推荐
- TCP那些事儿(下)
这篇文章是下篇,所以如果你对TCP不熟悉的话,还请你先看看上篇<TCP的那些事儿(上)> 上篇中,我们介绍了TCP的协议头.状态机.数据重传中的东西.但是TCP要解决一个很大的事,那就是要 ...
- Prime - 程序员的修养
求质数算法的N种境界 求质数算法的N种境界[1] - 试除法和初级筛法 过程 尽管题目并没有要我们写一个最优的算法,但是身为一个程序员,优化应该是一种习惯,在编程的过程中,随着思考进行优化. 如果你只 ...
- java SimpleDateFormat日期与时间戳的相互转换
自我总结,有什么不到位的地方,各位可以帮忙纠正补充一下,感激不尽! 目的:SimpleDateFormat类可以很随意的组合日期时间的格式,不止单纯的yyyy-MM-dd这种格式 废话不多说,上代码 ...
- 使用document.execCommand复制内容至剪贴板
API https://developer.mozilla.org/zh-CN/docs/Web/API/Document/execCommand 兼容性 http://caniuse.com/#se ...
- java 世界中Annotation
java 世界中Annotation 在github上开始汇总一些自己学习,收集,总结,经验的一些信息,有利于跟踪,修改,提升.如果你感兴趣 可以关注一下,也可以提供自己的内容进来. https:// ...
- BZOJ 4539: [Hnoi2016]树 [主席树 lca]
4539: [Hnoi2016]树 题意:不想写.复制模板树的子树,查询两点间距离. *** 终于有一道会做的题了...... 画一画发现可以把每次复制的子树看成一个大点来建一棵树,两点的lca一定在 ...
- BZOJ 3329: Xorequ [数位DP 矩阵乘法]
3329: Xorequ 题意:\(\le n \le 10^18\)和\(\le 2^n\)中满足\(x\oplus 3x = 2x\)的解的个数,第二问模1e9+7 \(x\oplus 2x = ...
- Windows Server 2016-Active Directory域服务概述
活动目录(AD)是一种目录服务是微软用于开发Windows域网络.它被包含在大多数Windows Server 操作系统中作为一组进程和服务.最初,Active Directory只负责集中式域管理. ...
- CentOS安装EPEL Remi
EPEL,Remi 因为Centos官方源很多软件都没有,编译安装又比较麻烦,可以安装EPEL源Remi源解决此问题. CentOS 5.x : wget http://dl.fedoraprojec ...
- python学习:函数传参数
#!/usr/bin/python import sys def isNum(s): for i in s: if i in '0123456789': ...