一、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. 真机调试报错:Could not find Developer Disk Image 或 Could not locate device support files.

    废话不多说,原因是用的Xcode版本所支持的最高iOS系统低于真机iOS系统导致. 解决方案: 1.升级到最新的Xcode版本 2.不想升级Xcode,那就找已经把Xcode升级到最新版本的朋友,发给 ...

  2. CSS3弹性盒模型flex box快速入门 2016.03.16

    @import url(http://i.cnblogs.com/Load.ashx?type=style&file=SyntaxHighlighter.css);@import url(/c ...

  3. POJ 1631 Bridging signals(LIS O(nlogn)算法)

    Bridging signals Description 'Oh no, they've done it again', cries the chief designer at the Waferla ...

  4. tp接支付宝接口签名不相等解决办法 接口版本3.3 tp版本3.1

    (2)在Core.php和Notify.php文件中添加了去掉TP的URL中的'_URL_'参数的函数.这个是必须的,否则会导致验证失败问题.具体改变为: function paraFilter改为 ...

  5. DisUnity——Unity3D反编译资源提取利刃

    1.资源 软件及项目源码地址:https://github.com/ata4/disunity/releases 2.使用方法: 将待反编译的文件放入文件夹中:如:E:\Demo\ 在disunity ...

  6. codeblocks调试(转载)

    单步调试  1)设置断点  在需要设置断点处,右击左边行号,Add breakpoint,则出现一个红色的点(可以同时设置多个,前提是不能在debug的运行模式下). 2)调试运行 Debug-> ...

  7. 从网页psd到html的开发

    从网上下载了一张psd的网页设计稿,初学html+css,所以记录一下我的学习过程.原图是这个样子:             原图                                   ...

  8. win8 + ubuntu14.04 安装步骤

    一.首先,从硬盘上划分一个空闲分区(推荐最少20G,每个人也可以按照自己的需要自行设定).记住各个分区的容量,方便安装时辨认.并从Ubuntu官方网站上下载Ubuntu 14.04 LTS 光盘镜像. ...

  9. iOS 中KVC、KVO、NSNotification、delegate 总结及区别-b

    1.KVC,即是指 NSKeyValueCoding,一个非正式的Protocol,提供一种机制来间接访问对象的属性.而不是通过调用Setter.Getter方法访问.KVO 就是基于 KVC 实现的 ...

  10. iOS中的隐式动画

    隐式动画就是指  在 非 人为在代码中 定义动画  而系统却默认  自带   的动画  叫做隐式动画. 比如  改变 图层  的颜色  位置  和   透明度  的时候    都会  产生附带的渐变的 ...