| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 5824 人关注过本帖
标题:[转载]DirectShow介绍
只看楼主 加入收藏
清澂居士
Rank: 6Rank: 6
等 级:贵宾
威 望:28
帖 子:1237
专家分:7
注 册:2006-12-19
收藏
 问题点数:0 回复次数:3 
[转载]DirectShow介绍

1. DirectShow介绍
DirectShow是一个windows平台上的流媒体框架,提供了高质量的多媒体流采集和回放功能。它支持多种多样的媒体文件格式,包括ASF、MPEG、AVI、MP3和WAV文件,同时支持使用WDM驱动或早期的VFW驱动来进行多媒体流的采集。DirectShow整合了其它的DirectX技术,能自动地侦测并使用可利用的音视频硬件加速,也能支持没有硬件加速的系统。
DirectShow大大简化了媒体回放、格式转换和采集工作。但与此同时,它也为用户自定义的解决方案提供了底层流控制框架,从而使用户可以自行创建支持新的文件格式或其它用途的DirectShow组件。
以下是几个使用DirectShow编写的典型应用:DVD播放器、视频编辑应用、AVI到ASF转换器、MP3播放器和数字视频采集应用。
DirectShow是建立在组件对象模型(COM)上的,因此当你编写DirectShow应用时,你必须具备COM客户端程序编写的知识。对于大部分的应用,你不需要实现自己的COM对象,DirectShow提供了大部分你需要的DirectShow组件,但是假如你需要编写自己的DirectShow组件,你还需要具备编写COM组件的知识。
1.1. DirectShow支持的格式
DirectShow是一个开放的框架,因此只要有合适的filter来分析和解码,它可以支持任何格式。DirectShow默认支持以下的文件类型和压缩格式:
注:打*号的需要Windows Media Format SDK支持
文件类型:
Windows Media? Audio (WMA)*
Windows Media? Video (WMV)*
Advanced Systems Format (ASF)*
Motion Picture Experts Group (MPEG)
Audio-Video Interleaved (AVI)
QuickTime (version 2 and lower)
WAV
AIFF
AU
SND
MIDI
压缩格式:
Windows Media Video*
ISO MPEG-4 video version 1.0*
Microsoft MPEG-4 version 3*
Sipro Labs ACELP*
Windows Media Audio*
MPEG Audio Layer-3 (MP3) (decompression only)
Digital Video (DV)
MPEG-1 (decompression only)
MJPEG
Cinepak
微软自己没有提供MPEG2解码器,一些可用的DirectShow MPEG2硬件或软件解码器是由第三方提供的。
1.2. 常见问题集(摘录)
1.2.1. 一般问题
*DirectShow支持哪些操作系统?
DirectShow支持Windows9X、Windows2000、Windows Me和Windows XP。

*使用DirectShow需要多少COM知识?
应用程序开发者只需要基本的COM组件知识:实例化COM组件、调用接口、管理接口的引用计数。Filter开发者则需要更多。

*有与DirectShow兼容的硬件列表(HCL)吗?
没有。如果硬件兼容DirectShow,DirectShow会使用它们,如果没有兼容的硬件,DirectShow使用GDI绘制视频,以及使用WaveOut系列多媒体API来播放音频。

*可以使用哪些语言来编写DirectShow应用?
DirectShow主要为C/C++开发设计。Visual Basic只能使用其中的很小一部分。可以通过MS JScript或VB Script来支持基于脚本的DVD和TV应用。也可能用Delphi来编写,但SDK文档不提供这方面的内容。

*DirectShow会通过托管代码实现吗?
目前还没有这个计划。DirectX SDK提供了有限的使用音视频回放类的托管回放功能,你可以使用COM interop创建托管代码的DirectShow客户端应用,但是因为性能上的原因,不推荐创建运行在CLR上的filter。

*DirectShow开发需要什么样的编译器?
任何能够产生COM对象的编译器都可以。

*DirectShow和DirectX的其它组件的关系
DirectShow和DirectX的其它组件在内部进行联系。DirectShow在硬件的支持下使用DirectSound和DirectDraw。Video Renderer和Overlay Mixer使用DirectDraw 3和DirectDraw5表面(surfaces)。Video Mixing Renderer 7(只支持WINXP)使用DirectDraw7表面。Video Mixing Renderer 9使用最新的(目前是Directx9)Direct3D API函数。即便是某个应用程序包含了DirectX其它组件,你也不必使用其它组件的API去编写它。参考SDK的例子:Texture3D Sample。

*DirectShow与ActiveMovie的关系?
ActiveMovie是DirectShow原来的名称,现已不再使用,但是一部分API仍保留了"AM"的前缀,比如AM_MEDIA_TYPE和IAMVideoAccelerator。

*DirectShow是限于多媒体应用吗?
DirectShow默认包含的组件主要是为音视频流设计的,但是,DirectShow框架已经成功地用于其它数据流的解决方案中。

*GraphEdit工具有源码吗?GraphEdit.exe是否可再发布?
没有源码,不可再发布。

*DMO可以代替DirectShow filter吗?
在编写编码器、解码器、效果器应用时,鼓励用DMO代替DirectShow filter。在其它的应用中,使用DirectShow filter可能会比较合适。

1.2.2. 程序编写问题
*如何设置编译环境,需要哪些头文件和库?
参考"设置编译环境"章节

*GraphEdit列示了很多没有文档支持的filter,它们都是些什么?
GraphEdit枚举了所有作为filter类型注册在系统中的filter,包括由第三方应用程序安装的filter,以及其它微软技术如Windows Media或NetMeeting安装的,另外,一些DirectShow filter被用来做硬编码或硬解码驱动的外壳。Microsoft H.263 Video Codec用于NetMeeting,不再被DirectShow支持。

*如何知道DirectShow已经被安装?
调用CoCreateInstance创建一个Filter Graph Manager实例,如果成功,表示DirectShow已经被安装,下面是一个例子:

IGraphBuilder *pGraph;
HRESULT hr = CoCreateInstance(CLSID_FilterGraph,
NULL, CLSCTX_INPROC_SERVER,
IID_IGraphBuilder, (void **) &pGraph);


*如果不通过属性设置页来更改filter的设置?
当然是通过filter提供的接口罗。如果没有提供,就没有办法啦

*DirectShow能通知应用程序当前回放位置吗?
不提供回调来通知位置,需要使用一个计时器定时调用IMediaSeeking::GetCurrentPosition方法来得到当前回放位置。

*filter运行在哪个特权级别下?
运行在Ring 3特权级别下,某些流控制驱动(如音视频采集驱动)运行在Ring 0特权级别下。

*需要一个Kernel调试器吗?
这依据具体的项目。安装DirectX调试运行时库(DirectX debug runtime library)意味着安装调试驱动(Debug driver)和其它核心组件(kernel mode component),因此如果你的应用程序在其中的某个组件中产生了一个调试断言(debug assert),你的机器就会自动重启除非你拥有一个kernal调试器。

*DEFINE_GUID宏是怎么工作的?
使用DEFINE_GUID宏可以让你通过包含同一个头文件来定义GUID值而不必使用extern关键词。比如,你的工程中有三个源文件:src1.cpp,src2.cpp,src3.cpp,它们都使用一个相同的GUID值,而为了保证一致性,这个GUID只能在你的工程中定义一次,这时,其它的源文件必须定义外部引用来使用它。用了DEFINE_GUID,你可以使用在所有源文件中包含同一个头文件,在头文件中这样定义GUID:

DEFINE_GUID(CLSID_MyObject,
0x00000000, 0x0000, 0x0000, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00);

这个例子中GUID为0,实际编程中请用Guidgen工具来产生一个GUID,在其中的一个源文件中,在你的头文件前包含initguid.h,如:

// Src1.cpp #include #include "MyGuids.h" // Src2.cpp #include "MyGuids.h" // Src3.cpp #include "MyGuids.h"


在没有包含Initguid.h的地方,DEFINE_GUID宏创建外部引用来使用GUID值,在包含Initguid.h的地方,DEFINE_GUID重定义DEFINE_GUID宏以产生GUID的定义。
如是没有在任何地方添加Initguid.h,你会得到一个链接错误:"unresolved external symbol." ,如果同样的GUID包含Initguid.h两次,会得到编译错误"redefinition; multiple initialization."要解决这些问题,请确认Initguid.h只包含一次。同样的,不要包含Initguid.h到预编译头文件中去,因为预编译头文件会被每个源文件包含。

搜索更多相关主题的帖子: DirectShow 多媒体 MP3 DirectX 流媒体 
2007-02-15 15:19
找不到服务器
Rank: 4
等 级:贵宾
威 望:12
帖 子:2937
专家分:1
注 册:2006-8-29
收藏
得分:0 
有DirectDraw介绍吗?

史上点击数最高的贴
http://bbs.bccn.net/thread-146005-1-1.html
2007-02-15 15:32
清澂居士
Rank: 6Rank: 6
等 级:贵宾
威 望:28
帖 子:1237
专家分:7
注 册:2006-12-19
收藏
得分:0 

一、前言

  随这计算机技术、多媒体技术的飞速发展,图形图像已经广泛应用到现实生活中的各个领域,如游戏开发、视频监控、媒体传播等等。如何高速有效地处理这些信息量巨大的图像数据,是我们不得不面对的现实问题,解决问题的一个有效途径就是绕过Windows操作系统提供的API,直接操作计算机的显卡,以此来充分利用硬件的加速效果。开发人员不必为此担心程序的兼容性问题,因为自从微软推出高效的DirectX技术后,事实上它已经成为了多媒体开发的标准之一,不同的硬件厂家都是根据DirectX的标准来编写驱动程序,所以开发人员只要同单一的DirectX库打交道而不用考虑具体的硬件,这样就大大的提高了编程的效率。由于DirectX编程技术博大精深,它的内容足够写几本大部头的书,所以本文只能涉及到它的一小部分,既主要探讨VB开发环境下基于DirectDraw技术的程序开发,处理二维平面图像。

  最初的DirectX多媒体开发仅仅适用于C/C++的编译环境,但是微软自从DirectX7.0版本(目前DirectX的最高版本9.0测试版已经公布)推出以后,就开始提供VB开发库,支持在VB环境下开发基于DirectX的多媒体应用程序。如果要进行DirectX开发,系统必须安装DirectX SDK库并且要在VB项目中引入它。

  为了进行DirectDraw的编程,需要读者特别注意的一点是,在点击VB菜单中的 Project | References 项引入DirectX 为VB提供的SDK库时,在Object Library 列表中要选择DirectX7.0 For Visual Basic Type Library 这个列表项。为什么不选择DirectX8.0或更高版本提供的类库呢?因为只有DirectX7.0提供了DirectDraw对象,在后续的DirectX版本中,DirectDraw 已被融入Direct3D对象中了,而Direct3D对象主要用于三维立体图像的处理,它的使用比较复杂,不适用初学者,所以本文主要讲述如何使用DirectX7.0对类库中的DirectDraw对象,今后在此基础上,我们再对Direct3D等复杂的编程技术详细介绍,由浅如深,逐渐进入DirectX编程的奇妙世界。

  二、DirectX7.0技术简介

  为了更好的介绍DirectDraw编程,我们首先简单介绍一下DirectX7.0技术,使读者对它有一个初步的印象,至于DirectX的后续版本,只是在7.0版本的基础上添加了一些新的功能和作了一些结构调整罢了,相关内容读者可以自己参阅MSDN。DirectX7.0提供的开发库是基于对象的,其中最基本的对象是DirectX7对象,只有在程序中首先建立了DirectX7对象之后才可以在该对象的基础上建立其它对象。DirectX基本对象包含以下几个常用的类:

  1)DirectDraw类,独立于设备的表面绘图对象,支持以全屏方式或者窗口方式绘图,同时DirectDraw实现了对显卡内存的直接操作(也可以实现对系统的内存的操作,如果在显卡内存不够或者开发人员指定使用系统内存的情况下,DirectDraw将操作系统内存),一旦定义DirectDraw对象并锁定,就可以象操作一个数组一样操作内存中的图像数据了。

  2)独立于设备的Direct3D类,包括立即模式和保留模式,它是DirectX的三维绘图接口、开发三维DirectX游戏的基础。

  3)DirectSound类, DirectX中独立于设备的Wave音频对象,支持混音、硬件加速、直接设备访问、声音捕捉和回放。

  4)DirectMusic类,音乐数据文件操作对象,支持DLS(downloadable sounds)标准和运行时编辑。

  5)DirectInput类,独立于设备的游戏控制器对象,支持操作映射,过操作映射能够在输入操作和输入设备之间建立连接。您只需输入设备处理,而不必再依赖特定的设备对象。用于支持鼠标、键盘、游戏杆。

  6)DirectPlay类,为支持多任务的网络游戏而设计的对象,可以协调速度不同的计算机之间的信息传递以支持不同的计算机用户通过网络进行互连。

  DirectX7对象包含了诸如建立DirectDraw、 Direct3D、 DirectSound、 DirectInput等对象的方法,例如,当建立成功一个DirectX7对象之后,就可以使用该对象的DirectDrawCreate、Direct3DRMCreate等方法建立DirectDraw、Direct3D对象了。

  三、DirectDraw编程

  正如上节介绍的那样,DirectDraw提供了与硬件无关性的同时允许直接操作显存,它是一个与Windows 图形系统接口(GDI)相兼容的直接操作显示设备的软件接口,是DirectX技术中进行图像处理的基础,是DirectX中的关于视频输入输出的基本部分,只要使用的硬件支持DirectDraw,开发人员就可以使用DirectDraw可以方便地编制出高效的视频处理、图像处理的程序来。

  DirectDraw类包含DirectDraw7、DirectDrawClipper 、DirectDrawEnumModes、 DirectDrawPalette、DirectDrawSurface7等对象。其中,DirectDraw7对象是DirectX7中的DirectDraw对象,你需要首先建立一个DirectX7对象,然后使用该对象的DirectDrawCreate方法来建立DirectDraw7对象。

  DirectDraw7的GetDisplayModesEnum方法可以建立一个DirectDrawEnumModes对象,通过它可以获得当前系统支持的显示模式;DirectDraw7的CreatePalette方法可以建立一个DirectDrawPalette对象,DirectDrawPalette对象是DirectDraw下的绘图调色板对象,它很类似于Windows下的调色板。

  利用DirectDraw7的CreateClipper方法可以建立一个DirectDraw7下的DirectDrawClipper对象,DirectDrawClipper对象的作用是建立一个屏幕的剪裁区域,这样DirectDraw就知道绘图时那些部分是可见的而那些部分应该被剪裁掉。

  DirectDrawSurface7是DirectDraw下的最重要的对象,这个对象描述了一块线型的显存区域,我们所进行的所有图形、文本操作都是在这个对象上进行的,你可以通过DirectDrawSurface7对象直接操作这片区域。

  通过DirectDraw7的CreateSurface方法,可以建立一个单一绘图表面、复合绘图表面或者三维绘图表面对象。而利用DirectDraw7的CreateSurfaceFromFile方法、CreateSurfaceFromResource方法可以分别根据位图文件和位图资源建立一个包含图像数据的 DirectDrawSurface7对象。

  仅仅知道如何创建DirectDraw编程需要使用到的一些对象是远远不够的,还需要使用灵活的使用这些对象提供的方法,下面按照DirectDraw处理图像的步骤来说明这些方法的使用。

  1、建立协作层

  当建立了一个DirectDraw对象之后,首先要设定DirectDraw的协作层。实现的方法是调用DirectDraw对象的SetCooperativeLevel函数。该函数的定义是:

SetCooperativeLevel( hdl As Long, flags As CONST_DDSCLFLAGS)

  其中参数hdl指定程序的窗口句柄,参数flag决定程序运行的方式,它的值可以使用Or组合起来。具体值的含义如下:DDSCL_FULLSCREEN表示使用全屏幕(必须和DDSCL_EXCLUSIVE一起用)、DDSCL_ALLOWMODEX使用Modex模式、DDSCL_EXCLUSIVE 使用独占模式、DSCL_NORMAL 使用Windows的窗口、DDSCL_NOWINDOWCHANGES 禁止改变窗体大小。例如函数调用SetCooperativeLevel Me.hWnd, DDSCL_NORMAL将使程序运行于普通的协作层既窗口模式之下,在这种协作层你无法改变主表面调色板或进行页交换。而函数调用SetCooperativeLevel MainForm.hWnd, DDSCL_EXCLUSIVE Or _DDSCL_FULLSCREEN将使程序运行于全屏幕模式之下。在全屏幕协作模式之下你可以完全使用硬件的一切,你可以设置自己的调色板,改变显示分辨率及进行页交换。

  2、设置显示模式

  设置系统的显示模式是使用DirectDraw的SetDispalyMode函数实现的,函数的定义如下:

SetDisplayMode( w As Long, h As Long, bpp As Long, ref As Long, mode As CONST_DDSDMFLAGS)

  其中参数w、h分别指定屏幕的宽度和高度,bpp指定屏幕显示的颜色位数,参数ref指定屏幕的刷新频率,设置为0使用显示驱动的缺省刷新频率,mode指定附加的参数。为了保证程序的健壮性,需要获得系统支持的显示模式,此时可以使用DirectDraw对象的GetDisplayModesEnum函数来遍历所有支持的显示模式,然后根据返回的结果进行设置。

  3、建立DirectDrawSurface表面对象显示图像

  DirectDrawSurface对象是DirectDraw用来进行图像显示和绘制的对象,开发人员不仅可以在DirectDrawSurface上贴位图、绘制图形,还可以直接操作DirectDrawSurface对象来处理显存或内存里的图像数据。一般来说它分成以下几种类型:primarysruf surface(主表面), 屏幕上可以看到的显示记忆体,图像画在上面就能显示在屏幕上;backsurf surface (后备表面),这是一个能跟primarysruf surface作快速切换的表面;offscreen surface (离屏表面),这是一个屏幕上看不见的Surface,主要用来存放图像数据。

  利用DirectDraw对象的CreateSurface方法可以建立一个DirectDrawSurface7对象,设置DDSURFACEDESC2结构对象的不同标志可以实现不同的表面对象。为了改善图像显示效果,在DirectDraw编程时,一般设立一个主表面、后备表面和若干个离屏表面,主表面就是用户看到的显示图像的表面,也就是当前显示的表面,后备表面是主表面的附带缓冲表面,用来存储、处理即将显示的图像,离屏表面用来装载最初的图像数据,可以利用DirectDraw对象的CreateSurfaceFromFile函数或者CreateSurfaceFromResource函数建立一个DirectDrawSurface7对象,同时将图象文件或者资源文件中的图像装入建立的 DirectDrawSurface中,该函数调用成功后返回一个DirectDrawSurface对象。

  处理后使用Blt函数将数据拷贝到后备表面,此时DirectDraw使用filp方法交换主表面和后备表面,后备表面变为主表面显示图像,先前的主表面变为后备表面,这样作既提高的图像数据的处理速度,又有效的避免图像闪烁,笔者认为这是DirectDraw编程中最重要的思想。

  上面给出了DirectDraw的主要编程步骤,为了使读者更清楚的了解一些编程细节,下面给出了一个具体的实现代码,该程序在Windows98、Visual Basic 6.0编译环境下编译通过,运行正常,它实现了全屏幕显示一个图像,同时在图像的左上方叠加了一行文字说明。读者可以在此基础上实现动画效果,比如让说明文字在背景图像上动态显示等。


//////////////////////////////////////
Option Explicitf '声名全局变量;
Dim dx As New DirectX7 'DirectX对象;
Dim dd As DirectDraw7 'DirectDraw对象;
Dim picturesurf As DirectDrawSurface7 '离屏表面对象;
Dim primarysruf As DirectDrawSurface7 '主表面对象;
Dim backsurf As DirectDrawSurface7 '后备表面对象;
Dim ddsd1 As DDSURFACEDESC2 'DDSURFACEDSC2对象;
Dim ddsd2 As DDSURFACEDESC2
Dim ddsd3 As DDSURFACEDESC2
Dim brunning As Boolean
Dim binit As Boolean
/////////////////////////////////////////////
Private Sub Form_Load()
 On Local Error GoTo errOut
 Set dd = dx.DirectDrawCreate("") '生成DirectDraw对象;
 Me.Show
 '设置协作模式
 Call dd.SetCooperativeLevel(Me.hWnd, DDSCL_FULLSCREEN Or DDSCL_ALLOWMODEX Or DDSCL_EXCLUSIVE)
 '设置"1024*768*24"的显示模式
 dd.SetDisplayMode 1024, 768, 24, 0, DDSDM_DEFAULT
 '设置主绘图平面的属性
 ddsd1.lFlags = DDSD_CAPS Or DDSD_BACKSURFCOUNT
 ddsd1.ddsCaps.lCaps = DDSCAPS_PRIMARYSRUFSURFACE Or DDSCAPS_FLIP Or DDSCAPS_COMPLEX
 ddsd1.lBacksurfCount = 1
 '创建主表面和后备表面;
 Set primarysruf = dd.CreateSurface(ddsd1)
 Dim caps As DDSURFACEDESC2
 '设置缓冲绘图平面的属性
 caps.lCaps = DDSCAPS_BACKSURF
 Set backsurf = primarysruf.GetAttachedSurface(caps)
 backsurf.GetSurfaceDesc ddsd3 '获取后备表面的尺寸;
 backsurf.SetForeColor vbBlue '设置后备表面中的字体颜色为蓝色;
 backsurf.SetFontTransparency True '设置后备表面的字体为透明效果;
 Set picturesurf = Nothing
 ddsd2.lFlags = DDSD_CAPS Or DDSD_HEIGHT Or DDSD_WIDTH
 ddsd2.ddsCaps.lCaps = DDSCAPS_OFFSCREENPLAIN
 ddsd2.lWidth = ddsd3.lWidth
 ddsd2.lHeight = ddsd3.lHeight
 Set picturesurf = dd.CreateSurfaceFromFile("c:\Waterskier.bmp", ddsd2)
 '离屏表面以全屏幕的尺寸来装载图像;
 binit = True
 brunning = True
 Do While brunning
  blt
  DoEvents
 Loop
errOut:
 '显示出现错误的情况下恢复系统的正常显示模式;
 Call dd.RestoreDisplayMode
 Call dd.SetCooperativeLevel(Me.hWnd, DDSCL_NORMAL)
End
End Sub
//////////////////////////////////////////
Private Sub Form_Paint() '窗口重画函数;
 blt
End Sub
///////////////////////////////////////////////////////
Sub blt() '"画图"函数;
 On Local Error GoTo errOut
 If binit = False Then Exit Sub
 Dim rPicture As RECT, rback As RECT
 rPicture.Bottom = ddsd2.lHeight
 rPicture.Right = ddsd2.lWidth
 rback.Bottom = ddsd3.lHeight
 rback.Right = ddsd3.lWidth
 Call backsurf.BltFast(0, 0, picturesurf, rPicture, DDBLTFAST_WAIT)
 '在表面上书写文字;
 Call backsurf.DrawText(20, 20, "DirectDarw 编程示范", False)
 Call backsurf.DrawText(20, 40, "单击鼠标后退出!", False)
 primarysruf.Flip Nothing, DDFLIP_WAIT
errOut:
 Call dd.RestoreDisplayMode
 Call dd.SetCooperativeLevel(Me.hWnd, DDSCL_NORMAL)
End Sub
/////////////////////////////////////////////
Private Sub Form_Click() '单击鼠标后程序结束程序运行;
 Call dd.RestoreDisplayMode
 Call dd.SetCooperativeLevel(Me.hWnd, DDSCL_NORMAL)
 End
End Sub

  上面的程序虽然比较简单,但是它包含了DirectDraw的基本应用。首先通过DirectX7的DirectDrawCreate方法建立一个DirectDraw对象,然后通过调用DirectDraw对象的SetCooperativeLevel 方法将程序设置为独占、全屏的模式,SetDisplayMode方法设置系统的显示模式。

  接下来是设置绘图平面,DDSURFACEDESC2结构的dwFlags成员用来决定DDSURFACEDESC2结构中哪些成员将被填充有效的信息,例如程序中在创建主表面时,将DDSURFACEDESC2结构的lFlags设为想要用DDSCAPS结构(DDSD_CAPS)和想创建后备表面(back buffer)(DDSD_BACKBUFFERCOUNT),ddCaps成员在例子中标示一个将要在DDSCAPS结构中使用的标志位,程序中指定了一个主表面(DDSCAPS_PRIMARYSURFACE)、一个交换页(DDSCAPS_FLIP)、一个合成表面(DDSCAPS_COMPLEX);DDSURFACEDESC2结构中lBacksurfCount成员为"1"说明当前要在主表面下建立一个后备表面。

  创建主表面后,程序通过调用主表面的GetAttachedSurface方法获取了后备表面。获取了表面对象后,调用表面对象的SetForeColor、 DrawText等方法就可以在相应的表面上添加特定效果的文本了。至于程序中绘制图像我就不多解释了,读者可以仔细阅读上面的代码,其实说白了,DirectDraw显示图像时无非就是在不同表面之间Blt图像数据罢了。


佛曰:\"前世的500次回眸才换来今生的一次擦肩而过\".我宁愿用来世的一次擦肩而过来换得今生的500次回眸.
2007-02-15 16:36
清澂居士
Rank: 6Rank: 6
等 级:贵宾
威 望:28
帖 子:1237
专家分:7
注 册:2006-12-19
收藏
得分:0 

佛曰:\"前世的500次回眸才换来今生的一次擦肩而过\".我宁愿用来世的一次擦肩而过来换得今生的500次回眸.
2007-02-15 16:37
快速回复:[转载]DirectShow介绍
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.017402 second(s), 8 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved