DirectDraw的绘图总结

来源:互联网 发布:fanuc数控车床编程实例 编辑:程序博客网 时间:2024/05/18 02:55

最近因为项目需要,接触了DirectDraw的绘图部分,收集了网上的资料,做下总结:

1.  DirectDraw绘图

       DirectDrawDirectX的一部分,专门用于进行2D操作。在DirectX8.0之后的版本中,Ddraw已经被取消了,2D绘图合并到3DAPI中。所以网上都说Ddraw已经是过时的技术了,但这里实现我们需要的功能即可。这里需要强调的是,要下载DirectX8.0 之前版本的SDK,要不然会识别不了Ddraw中的函数,在我的下载资源中已经上传了可用的SDK,有兴趣的朋友可以下载。

2.  VC中的配置

       假设SDK安装在C:/DXSDK目录下

1.  在工具->选项->目录中,Include files下添加路径:C:/DXSDK:/IncludeLibrary files下添加路径:C:/DXSDK:/Lib。注意:添加的路径要放在最上面(VC中默认有DirectXSDK的配置路径)

2.  工程->设置->连接->对象/库模块中添加程序用到的Ddraw函数所对应的库,一般添加ddraw.lib dxguid.lib,至于其他的可以到时候上网搜搜。

这样就可以了!记住SDK一定是DirectX8.0之前的,前面有说过。。。

3.  Ddraw画图

Ddraw中的几个概念:表面,Blt

表面:在用Ddraw编写程序时,我们先要创建若干个图形数据缓冲区,并把这些图形数据装入其中,再进行转换、拉伸、拷贝等操作,并且可以显示这些缓冲区中的图形数据,这些缓冲区就称为表面。

表面分主表面和离屏表面。

主表面(primary surface)是用户在屏幕上可以看到的,它是显存的一部分。所有Ddraw程序都有且仅有一个主表面!它在Ddraw表面对象之前就已经存在,因此不能改变它的尺寸、格式和位置。

总之:主表面就相当于用户的显示器,主表面根据显示器的显示模式设定表面宽和高的。

离屏表面:作为存储缓冲区,它是不能直接看到的。它的大小是可以改变的。这里设置的表面大小最好大于显示图像大小。后面有提到~

Blt

将图像从一处拷贝到另一处。我们先在离屏表面上进行绘图,然后再将其内容拷贝到后备缓冲区中。这边会有硬件加速。

具体实现程序网上面很多,需要注意的是:

hRet = m_pddsFrontBuffer->Blt(&rt, m_pddsStoreBuffer, &src_rt, DDBLT_WAIT, NULL);

Blt函数:如果你不设置目标区域大小和显示区域大小,那么它会根据你图像的大小自动缩放显示;要想按原图显示,必须设置目标区域和显示区域大小一样,但编程时却发现Blt执行出错hRet = DDERR_INVALIDRECT。这就是上面提到的问题。很多网上的程序都是直接设置表面大小为800*600这里我们可以设置这个区域足够大,以保证足以装下显示的图像。

但我在编程的时候,开始并没注意到这点,奇怪的是,在memcpy数据到表面时并不出错,所以挣扎了好久。

还有,在窗口模式下,用Blt,全屏模式下,是用Flip进行翻页。

原创粉丝点击