一、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的更多相关文章

  1. DirectDraw打造极速图形引擎(Alpha混合)

    显然DirectDraw是Windows下写2D图形程序的最好选择,虽然Direct3D也可以写,但是没DirectDraw简单方便,特别对于初学者,一来就接触那么多函数和参数总不是件愉快的事,所以我 ...

  2. DirectDraw 直接显示RGB图象的最简单实现

      来自:   #include "DDraw.h" class CDDraw { public: void CleanUp(); void DrawDIB(BITMAPINFOH ...

  3. directdraw显示yuv视频,出现屏保时,yuv显示不出来,表面丢失

    原因是: DDrawSurface 丢失, DDraw表面在很多情况下都会丢失(如:启动其他全屏独占程序,屏保,或锁屏时), 表面丢失其实就是表面所使用的内存或显存被DirectDraw系统释放, 分 ...

  4. 调用DirectDraw接口和调DirectDraw7接口的不同点对比

    调用DirectDraw接口步骤: 1.       包含链接库ddraw.lib 2.       初始化窗口类型(全屏独占时类型用popup). 3.       在初始化窗口后初始化Direct ...

  5. 《Windows游戏编程技巧大师》就DirectDraw而创建DirectDraw知识笔记

    1.DirectDraw 这可能是Directx中最重要的技术,由于它是2D图形赖以实现的渠道.也是Direct3D构建于其上的帧缓冲层. 2.DirectDraw是由非常多借口组成的.共同拥有5个接 ...

  6. Windows Graphics Programming Win32 GDI and DirectDraw第六章疑问

    <Windows Graphics Programming Win32 GDI and DirectDraw>6.1节中有这样的描述: The Windows NT/2000 graphi ...

  7. 用DirectDraw封装的位图动画类

    头文件 [cpp] view plaincopyprint? #pragma once #include <vector> using namespace std; #include &l ...

  8. 使用DirectDraw直接显示YUV视频数据

    最近在编写一个进行视频播放的ActiveX控件,工作已经接近尾声,现将其中显示YUV数据的使用DirectDraw的一些经验总结如下:(解码部分不是我编写的,我负责从网络接收数据,将数据传给解码器,并 ...

  9. DirectDraw读书笔记

    DirectDraw对象 DirectDraw对象是DirectDraw应用程序的核心.它是你在建立DirectDraw应用程序时所要创建的第一个对象,再用它来创建所有其它相关的对象.通过调用Dire ...

随机推荐

  1. js--小结⑤

    js中的for循环,while循环,do...while循环和C语言的一模一样 有几个问题要提醒一下的是 1.  null是对象,即object       undefined是undefined d ...

  2. Lucene技术杂谈

    Lucene教程 1 lucene简介 1.1 什么是lucene     Lucene是一个全文搜索框架,而不是应用产品.因此它并不像www.baidu.com 或者google Desktop那么 ...

  3. MongoDB的查询

    一.Find操作 二.分页和排序 三.游标的使用 一.Find查询 事前准备:插入如下数据 db.Students.insert([ { _id:1, name:"Zhao", a ...

  4. fmt:formatDate标签的输出格式

    http://blog.csdn.net/lidawei201/article/details/7197834

  5. c#yield,IEnumerable,IEnumerator

    foreach 在编译成IL后,实际代码如下: 即:foreach实际上是先调用可枚举对象的GetEnumerator方法,得到一个Enumerator对象,然后对Enumerator进行while循 ...

  6. React学习笔记(一) 基础知识

    现在最热门的前端框架有AngularJS.React.Bootstrap等.自从接触了ReactJS,ReactJs的虚拟DOM(Virtual DOM)和组件化的开发深深的吸引了我. React的基 ...

  7. 求两个数的最大公约数(Euclid算法)

    求两个数 p 和 q 的最大公约数(greatest common divisor,gcd),利用性质 如果 p > q, p 和 q 的最大公约数 = q 和 (p % q)的最大公约数. 证 ...

  8. 217. Contains Duplicate(C++)

    217. Contains Duplicate Given an array of integers, find if the array contains any duplicates. Your ...

  9. angularjs跨域调取webservice

    1.配置 web.config <webServices> <!--必须添加--> <protocols> <add name="HttpGet&q ...

  10. Apache Virtual Include

    2.目录支持includes:     <Directory   />             Options   None             //不支持includes       ...