一、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. Java-struts2 之值栈问题

    这里是根据一个小项目,将数据库的值查出来,然后在页面前台进行遍历的方法 放入值的几种方式: Struts2的三种存值取值的方式 值栈: 栈上下文: ActionContext: package com ...

  2. java反射的应用+mybatis+spring动态生成数据库表

    最近接触了一个类似于代码生成工具的活.思路是,通过java的反射机制得到类的字段和字段类型, 从而可以创建一个map集合存储表名(由类名决定的特殊结构字符串),表字段(由类变量确定),表字段类型(由变 ...

  3. 求职,找工作,平台大PK

    国内 猎聘网:www.lietou.com 拉钩网:Lagou.com 智联招聘:www.zhaopin.com 前程无忧:http://www.51job.com/ 中华英才网:chinahr.co ...

  4. [上传下载] C# ImageUpload图片上传类教程与源码下载 (转载)

    点击下载 ImageUpload.zip 功能如下图片1.设置属性后上传图片,用法如下 /// <summary> /// 图片上传类 /// </summary> //--- ...

  5. 深入理解shared pool共享池之library cache的library cache pin系列三

    关于library cache相关的LATCH非常多,名称差不多,我相信一些人对这些概念还是有些晕,我之前也有些晕,希望此文可以对这些概念有个更为清晰的理解,本文主要学习library cache p ...

  6. 阿里云服务器(Win 2008 R2 Standard)安装MSSM 2008 R2之1033和2052问题

    最近在给租用的阿里云服务器安装Sql Server 2008 R2 Express时,遭遇下面的问题.经过几番折腾后,终于解决问题,完成安装,这里总结分享我的解决方法,希望能给遇到相同问题的小伙伴们节 ...

  7. OC基础-day04

    #pragma mark -  Day04_01_匿名对象 1. 如果函数有返回值 我们可以不使用变量接收返回值. 而是直接将函数写在要使用其返回值的地方. 2. 正常情况下.我创建对象. 是使用了1 ...

  8. 11-17的学习总结(DOMfirstday)

    HTML: 超文本标记语言,专门定义网页内容的语言 XHTML: 严格的HTML标准 DHTML: 所有实现网页动态效果技术的统称 XML: 可扩展的标记语言,标签都是自定义的 XML语法和HTML语 ...

  9. StrongReference

    原创作品:未经本人允许,不得转载前段时间写项目时遇到了一个问题,就是从网络获取图片资源的问题,总是出现OOM异常,经过几天的努力,终于处理的还算是可以使用,OOM的处理一直都是很头疼的问题.对于三级缓 ...

  10. 用Xamarin和Visual Studio编写iOS App

    一说开发 iOS app,你立马就会想到苹果的开发语言 Objective C/Swift 和 Xcode.但是,这并不是唯一的选择,我们完全可以使用别的语言和框架. 一种主流的替换方案是 Xamar ...