DirectDraw
一、DirectDraw接口
DirectDraw接口图如下:
1、IUnknown:所有COM对象都必须从这个基本接口派生
2、IDirectDraw:这是开始使用DirectDraw时必须创建的主接口对象
3、IDirectDrawSurface:这表示你用DirectDraw创建、控制和显示的实际显示表面。分两种:主显示表面(Primary Surface)和从显示表面(Secondary Surface)
4、IDirectDrawPalette:使用256或更少的颜色在视频模式下处理调色板,用于创建、加载和控制调色板,以及将调色板关联到显示表面
5、IDirectDrawClipper:用于帮助剪切DirectDraw光栅和位图操作到一些可见显示表面的子集
二、创建DirectDraw对象
HRESULT WINAPI DirectDrawCreateEx(GUID FAR *lpGUID, //全局唯一标识符,为NULL时表示系统缺省配置
LPVOID *lplpDD, //指向IDirectDraw接口的指针
REFIID iid, //请求的接口的ID
IUnknown FAR *pUnkOuter //总是为NULL
);
对DirectDraw进行错误处理:FAILED()——检测是否失败,SUCCEEDED()——检测是否成功
例子:LPDIRECTDRAW7 lpdd7=null;
if(FAILED(DirectDrawCreateEx(NULL,(void**)&lpdd7,IID_IDirectDraw7,NULL))){
//错误处理
}
三、与Windows协作
对于DirectDraw来说,视频显示设备有两种模式:全屏模式(Full-screen Mode)和窗口模式(Windows Mode),在窗口模式下,DirectDraw必须更多的与Windows协作,因为其他应用程序可能更新它们各自的客户窗口区域。
要设置DirectDraw的协作级别,需要调用IDirectDraw7的一个方法:IDirectDraw7::SetCooperativeLevel()函数。
HRESULT SetCooperativeLevel(HWND hwnd,DWORD dwFlags);
控制标记dwFlags常用的值有:
DDSCL_ALLOWMODEX:允许使用Mode X(320*200、240、400)显示模式,仅当设置DDSCL_EXCLUSIVE和DDSCL_FULLSCREEN时生效
DDSCL_ALLOWREBOOT:允许在排除(全屏)模式下检测到Ctrl+Alt+Del
DDSCL_EXCLUSIVE:请求排他级别,需要与DDSCL_FULLSCREEN标记同时使用
DDSCL_FULLSCREEN:使用全屏模式
DDSCL_NORMAL:表示应用程序是一个通常的Windows应用程序
例:
if(FAILED(lpdd7->SetCooperativeLevel(hwnd,DDSCL_FULLSCREEN|DDSCL_ALLOWMODEX|DDSCL_EXCLUSIVE|DDSCL_ALLOWREBOOT))){
//错误处理
}
四、设置模式
设置模式的函数叫做SetDisplayMode()
HRESULT SetDisplayMode(DWORD dwWidth, //显示的屏幕宽度
DWORD dwHeight, //显示的屏幕高度
DWORD dwBPP, //每像素是8位还是16、24、32位
DWORD dwRefreshRate, //刷新频率,模式为0
DWORD dwFlags //默认为0
);
例:
lpdd->SetDisplayMode(800,600,16,0,0); //设置16位增强色的800*600模式
五、创建显示表面
1、显示在屏幕上的图形只不过是以某种格式存储在内存中的有色像素组成的矩阵,或是调色板的或是RGB模式的。有两种显示表面:主表面和从表面。
主表面:表示直接相当于被显卡光栅化的实际显存,且任何时候都是可见的,只能有一个主表面,它直接指向屏幕图像并常驻于VRAM。
从表面:总是和主显示面有同样的色彩深度和几何分布,可以驻留在VRAM或是系统内存中。
2、创建任何显示表面的步骤:
A、填充一个DDSURFACEDESC2数据结构,描述你所希望创建的显示表面。
B、调用IDirectDraw7::CreateSurface()来创建显示表面。
HRESULT CreateSurface(LPDDSURFACEDESC2 lpDDSurfaceDesc2, //显示表面的描述
LPDIRECTDRAWSURFACE4 FAR *lplpDDSurface, //指向新的显示表面接口
IUnknown FAR *pUnkOuter //默认为NULL
);
DDSURFACEDESC2的主要成员有:
dwsize:值设置为sizeof(DDSURFACEDESC2)
dwFlags:用来指示DirectDraw会把有效数据填充到哪个域中。
dwWidth:显示表面以像素计的宽度
dwHeight:显示表面以像素计的高度
IPitch:是该显示模式中每行上的字节数,也被称为步幅或内存宽度
lpSurface:用来获取指向你所创建的显示表面所驻留的实际内存的指针
dwBackBufferCount:如果只使用一个后备缓冲称为双缓冲,使用两个后备缓冲的技术称为三重缓冲
ddckCKDestBlt:控制目标色键,在位块传输操作中控制可以写入的色彩的部件
ddckCKSrcBlt:指示源色键
ddpfPixelFormat:获取显示表面的像素格式
ddsCaps:用来返回你所请求的显示表面的一些未在别处定义的属性。
3、关联调色板
HRESULT SetPalette(LPDIRECTDRAWPALETTE lpDDPalette); //这个参数是你希望关联的调色板的指针
4、绘制像素
所有的DirectDraw显示模式和显示表面都是线性的,这意味着当你从一行移到另一行时,内存从左到右,从顶到下的增长。
5、锁内存
HRESULT Lock(LPRECT lpDestRect, //需要加锁的矩形区域,为NULL时表示整个表面
LPDDSURFACEDESC2 lpDDSurfaceDesc, //你请求的显示表面的信息
DWORD dwFlags, //告诉Lock()你想做什么,常用DDLOCK_SURFACEMEMORYPTR,DDLOCK_WAIT
HANDLE hEvent //协助一个Win32支持的高级特性——事件
);
例:
DDSURFACEDESC2 ddsd;
memset(&ddsd,0,sizeof(ddsd));
ddsd.dwSize=sizeof(ddsd);
if(FAILED(lpddsprimary->Lock(NULL,&ddsd,DDLOCK_SURFACEMEMORYPTR|DDLOCK_WAIT))){
//error
}
解锁用Unlock,将lock命令使用的RECT传给Unlock()
例:lpddsprimary->Unlock(NULL);
DirectDraw的更多相关文章
- DirectDraw打造极速图形引擎(Alpha混合)
显然DirectDraw是Windows下写2D图形程序的最好选择,虽然Direct3D也可以写,但是没DirectDraw简单方便,特别对于初学者,一来就接触那么多函数和参数总不是件愉快的事,所以我 ...
- DirectDraw 直接显示RGB图象的最简单实现
来自: #include "DDraw.h" class CDDraw { public: void CleanUp(); void DrawDIB(BITMAPINFOH ...
- directdraw显示yuv视频,出现屏保时,yuv显示不出来,表面丢失
原因是: DDrawSurface 丢失, DDraw表面在很多情况下都会丢失(如:启动其他全屏独占程序,屏保,或锁屏时), 表面丢失其实就是表面所使用的内存或显存被DirectDraw系统释放, 分 ...
- 调用DirectDraw接口和调DirectDraw7接口的不同点对比
调用DirectDraw接口步骤: 1. 包含链接库ddraw.lib 2. 初始化窗口类型(全屏独占时类型用popup). 3. 在初始化窗口后初始化Direct ...
- 《Windows游戏编程技巧大师》就DirectDraw而创建DirectDraw知识笔记
1.DirectDraw 这可能是Directx中最重要的技术,由于它是2D图形赖以实现的渠道.也是Direct3D构建于其上的帧缓冲层. 2.DirectDraw是由非常多借口组成的.共同拥有5个接 ...
- Windows Graphics Programming Win32 GDI and DirectDraw第六章疑问
<Windows Graphics Programming Win32 GDI and DirectDraw>6.1节中有这样的描述: The Windows NT/2000 graphi ...
- 用DirectDraw封装的位图动画类
头文件 [cpp] view plaincopyprint? #pragma once #include <vector> using namespace std; #include &l ...
- 使用DirectDraw直接显示YUV视频数据
最近在编写一个进行视频播放的ActiveX控件,工作已经接近尾声,现将其中显示YUV数据的使用DirectDraw的一些经验总结如下:(解码部分不是我编写的,我负责从网络接收数据,将数据传给解码器,并 ...
- DirectDraw读书笔记
DirectDraw对象 DirectDraw对象是DirectDraw应用程序的核心.它是你在建立DirectDraw应用程序时所要创建的第一个对象,再用它来创建所有其它相关的对象.通过调用Dire ...
随机推荐
- [XML] C#ResourceManagerWrapper帮助类 (转载)
点击下载 ResourceManagerWrapper.rar /// <summary> /// 类说明:ResourceManagerWrapper /// 编 码 人:苏飞 /// ...
- Android 网络视频播放器
项目概要: 1.登录界面 2.播放列表 3.播放界面
- JAVA zip解压 MALFORMED 错误
最近在在使用zip 解压时,使用JDK1.7及以上版本在解压时,某些文件会报异常 Exception in thread "main" java.lang.IllegalArgum ...
- Python:对象
#!/usr/bin/python3 #对象实例 class Person: num=200 def __init__(self,name,sex): self.name=name self.sex= ...
- 左偏树(Leftist Heap/Tree)简介及代码
左偏树是一种常用的优先队列(堆)结构.与二叉堆相比,左偏树可以高效的实现两个堆的合并操作. 左偏树实现方便,编程复杂度低,而且有着不俗的效率表现. 它的一个常见应用就是与并查集结合使用.利用并查集确定 ...
- html本地存储尝试
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...
- UVA 10763 Foreign Exchange
Time Limit:3000MS Memory Limit:0KB 64bit IO Format:%lld & %llu Description Your non- ...
- Memento:客户端瘦身
说是客户端瘦身,其实备忘录模式的本质让调用客户端职责减轻,将客户端的对于实现比如数据恢复之类细节的内容封装在操作类之中.其实面向对象的一重要方面就是划分清楚职责,这样可以减少改到造成的影响,便于扩展. ...
- iOS 仪表式数字跳动动画-b
前几天搞了 双曲线波浪动画(http://www.jianshu.com/p/7db295fd38eb)和环形倒计时动画(http://www.jianshu.com/p/d1d16dff33c9)而 ...
- 面向对象js瀑布流效果
index.html <!doctype html><html lang="en"> <head> <!--网站编码格式,UTF-8 国 ...