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 ...
随机推荐
- Spring中事务的5种属性总结
Sping的事务 和 数据库的事务是不同的概念,数据库的事务一般称为底层事务 Spring的事务是对这种事务的抽象 我称之为逻辑事务 Spring对事务的功能进行了扩展,除了基本的Isolation之 ...
- 检查.gitignore语法
每次配置git的时候,要写gitignore文件,你知道你的.gitignore匹配那些文件吗? 看看.gitignore放过了哪些文件: git ls-files -ocm --exclude-st ...
- Linux系统查找文件find命令使用(不断更新)
个人博客地址:http://www.cnblogs.com/wdfwolf3/. 使用格式:find [查找目录] [查找规则] [查找完后执行的操作] [查找目录] 即要查找的路径,可以使用 ...
- C++ 虚函数与纯虚函数
#include<iostream> #include<string> using namespace std; class A{ public: virtual void f ...
- Python传参数最简单易懂的描述
关于,python的传参,很多人会搞得一头雾水,我也跟朋友讨论多次,最终通过实验,得到结论. 一.所有传递都是引用传递 二.在函数内使用[变量名]=,相当于定义啦一个局部变量 OK,一段简单的 ...
- HTML5 程序设计笔记(一)
HTML5 概述 1.html5 发展史 1993年html首次以因特网草案形式发布. 20世纪90年代,html大幅发展,从2.0版,到3.2版和4.0版.最后到1999年的4.01版. 伴随htm ...
- CentOS 6.4 64位 安装 apache-tomcat-6.0.43
下载 tomcat: 地址:http://mirrors.hust.edu.cn/apache/tomcat/tomcat-6/v6.0.43/bin/apache-tomcat-6.0.43.tar ...
- 【原创】win7同局域网下共享文件
本文章用于解决win7局域网共享文件问题: 首先保证两台机器可以ping通: 检测方法: win+R输入cmd打开命令行,输入ping 对方主机ip 不知对方ip可以在在命令行中输入ipconfig ...
- 疯狂的表单-html5新增表单元素和属性
疯狂的表单 2015/11/27 16:44:07 从三方面来介绍html5表单的新特性 表单结构更灵活 要提交数据的控件可以布局在form标签之外,看下面的代码,表单元素可以写到form元素之外,只 ...
- smarty 模板 数字自动添加
section: section的产生是为解决foreach的不足的,与foreach一样,它用于设计模板内的循环块,它较为复杂,可极大程序上满足程序需要,所以在程序中我习惯使用它而不使用foreac ...