您的位置:C++老鼠窝编程 Window编程 正文
 添加时间:2008-08-11 原文发表时间:2008-08-11 人气:2

本文章共5438字,分4页,当前第1页,快速翻页:
 

译者按:我到现在也不知道Blit如何翻译,其意义是将一个平面的一部分或全部图象整块从这个平面复制到另一个平面。以后我会用Blit代替这些麻烦的解释。

这部分阐述了如何将一个DirectDraw平面的像素复制到另一个,或是其一部分。
含有以下主题:

基本Blit
用BltFast来Blit
用Blt来Blit
适时Blit
透明Blit
色填充
Blit到多窗口

基本Blit
有两个宏可以复制图象到一个DirectDraw平面: IDirectDrawSurface4::Blt及IDirectDrawSurface4::BltFast。(还有第三个宏, IDirectDrawSurface4::BltBatch不在这个版本的DirectX中应用) 这些宏由目标平面调用并返回源平面参数。目标及源平面可以是同一个,你不必担心重叠DirectDraw会在覆盖之前事先保护这些原来的像素。

对于两个应用的宏,Blt更灵活而BltFast更快,但这仅在非硬件的Blit。你可以用IDirectDraw4::GetCaps宏中的lpDDDriverCaps 参数中包含的DDCAPS结构来决定硬件的Blit能力。如果dwCaps成员包含DDCAPS_BLT,硬件就至少支持最小程度的Blit能力。


--------------------------------------------------------------------------------


用BltFast来Blit
当使用IDirectDrawSurface4::BltFast,你要在源平面提供一个有效的矩形以用来复制(或用NULL来指定整个平面),以及目标平面的X及Y坐标。源矩形必须能够适合目标平面,从左上角的点 (换言之,源矩形不能大于目标平面),否则调用会失败并返回DDERR_INVALIDRECT值。 BltFast无法用于已附加剪切的平面。

没有伸拉,镜面(反转),或其他效果在BltFast中不被提供。

BltFast 例程:
以下例程将从一个屏下平面lpDDSOffOne复制像素到主平面lpDDSPrimary。标志保证操作会发生于Blitter(Blit器)空闲时,并且源图象的透明色将不被复制。 (标志的具体含义参见,适时Blit及透明Blit。)

lpDDSPrimary->BltFast(
100, 200, // Upper left xy of destination左上角的XY位置
lpDDSOffOne, // Source surface源平面
NULL, // Source rectangle = entire surface源矩形=整个平面
DDBLTFAST_WAIT | DDBLTFAST_SRCCOLORKEY );


--------------------------------------------------------------------------------


用Blt来Blit
当使用IDirectDrawSurface4::Blt宏,你要在源平面提供一个有效的矩形以用来复制 (或用NULL来指定整个平面),及在目标平面中提供一个矩形来存放要复制的图象 (同样,NULL表示矩形包括整个平面)。如果目标平面附加剪切,目标矩形的边界能超出平面并且会进行剪切。如果没有剪切器(Clipper),目标矩形必须在平面以内或一致,否则调用宏失败返回DDERR_INVALIDRECT。 (详见剪裁,剪裁器。)

缩放比例

Blt宏会自动安排源图象填充于目标矩形。如果缩放比例并非是你所希望的,要得到最佳性能请确认源及目标矩形是一个尺寸,或干脆用IDirectDrawSurface4::BltFast。(详见用BltFast来Blit。)

缩放的硬件加速需要依靠设备的DDCAPS结构中的dwFXCaps成员的DDFXCAPS_BLT*标志。如果,例如,一个设备有DDFXCAPS_BLTSTRECTCHXN能力但没有DDFXCAPS_BLTSTRECTCHX能力,就可以支持源矩形的X坐标的所有成员的倍数增加,而不支持非整数(任意)的伸拉。

设备可能也支持算术伸拉,也就是通过插值运算而非简单增加或删除像素。比如,如果一个坐标轴被拉长三分之一,针对原来的图象,像素会被重新着色为一个近似值,不然就会在这个坐标轴上每隔三个像素点产生一个重叠色。

应用程序无法控制驱动程序的伸拉类型,除非设置传递给Blt的DDBLTFX结构的dwDDFX 成员中DDBLTFX_ARITHSTRETCHY标志。这个标志请求算术伸拉可以在Y轴上进行。 X轴的算术伸拉及算术收缩在现在的DirectDraw API中不被支持,但驱动程序可能默认提供。

其他效果
 
本文章更多内容1 - 2 - 3 - 4 - 下一页>>
本页地址
相关文章

如何检测本机的Com口的个数?
Visual C++实现文件间批量转换功能
如何在非MFC扩展Dll中导出class说明及简单例
VC中无LIB时的DLL隐式链接,制作与VC++相符合
图形界面函数GDI32.exe
VC通信控件MSComm详解
DAO的密码?如何打开有密码保护的数据库?
产生线程的问题:error C2440: 'type cast'
如何利用WMI远程重启远程计算机?
通过WMI修改IP,而实现不用重新启动?

相关评论


本文章所属分类:首页 Window编程