一、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. xml--小结②XML的基本语法

    二.XML的基本语法1.文档声明:作用:用于标识该文档是一个XML文档.注意事项:声明必须出现在文档的第一行(之前连空行都不能有,也不能有任何的注释) 最简单的XML声明:<?xml versi ...

  2. U3D 摄像机镜头控制

    如果要实现,摄像机跟随着主角运动,还有运用滚轮实现镜头的方法和缩小的实现原理 方法1:把主摄像机放到主角的下面,作为一个子对象,调整好摄像机的视角,此时就会跟随了. 方法2:用代码让摄像机的相关的po ...

  3. android自定义样式大全:shape,selector,layer-list,style,动画全部内容

    原文:http://keeganlee.me/post/android/20150830 以下摘取了部分内容: shape 一般用shape定义的xml文件存放在drawable目录下,若项目没有该目 ...

  4. ria service 单元测试

    https://blogs.msdn.microsoft.com/kylemc/2011/08/18/unit-testing-a-wcf-ria-domainservice-part-1-the-i ...

  5. 使用Reveal.app调试整个项目UI时间,增加LD指令 -Objc引起项目中多个静态库冲突问题

    今天接触到一个新的UI调试工具教程如下: iOS真机UI调试利器——Reveal 引入增加-ObjC -framework Reveal指令后,发现项目出现多重静态库冲突问题, 首先介绍一个指令: - ...

  6. 速卖通---发布商品aeopAeProductPropertys这个字段值报07004013的错误

    由于文档的说明很少,导致里面改填写那些值都是靠自己推敲出来,当然可以根据他们的错误提示了研究,他们的错误提示也给出了相关的帮助了, 例如通过categoryid的200000001获取到"i ...

  7. sublime text 3 安装中文

    本经验目前在Ubuntu14.04环境下,已有搜狗输入法 for Linux和Sublime Text 3的情况下安装成功. END 解决方法步骤2   1 保存下面的代码到文件sublime_imf ...

  8. winform C#屏幕右下角弹出消息框并自动消失

    ①弹出信息框后慢慢下降消失 在主窗体中新增按钮重命名为btnShowAndDisappearMessages,在click事件中写如下代码: private void btnShowAndDisapp ...

  9. Python 基础-python-列表-元组-字典-集合

    列表格式:name = []name = [name1, name2, name3, name4, name5] #针对列表的操作 name.index("name1")#查询指定 ...

  10. bitVector@ java bit自我practice##Q&A:为何int 来初始化size of bitVector?long,甚至是BigInteger等策略

    /* * BitSets are packed into arrays of "words." Currently a word is * a long, which consis ...