记录下学习在wince下用ddraw的overlay surface实现alpha功能,以免以后忘记。
程序是在ddraw的蚊子程序的基础上改的。
主要需要将原程序overlay keycolor改为alpha
照例,在使用该功能前先判断下硬件是否支持
DDOVERLAYFX ovfx;
memset(&ovfx, 0, sizeof(ovfx));
ovfx.dwSize = sizeof(ovfx);
if (ddcaps.dwOverlayCaps & DDOVERLAYCAPS_ALPHASRC)
{
//dwUpdateFlags |= DDOVER_KEYSRCOVERRIDE;
// ovfx.dckSrcColorkey.dwColorSpaceLowValue=0; // black as the color key
//ovfx.dckSrcColorkey.dwColorSpaceHighValue=0;
}
alpha有两种模式,分别为DDOVERLAYCAPS_ALPHASRC和DDOVERLAYCAPS_ALPHADEST
两者的区别是:
DDOVER_ALPHADEST
alpha信息,或隶属于目标页面的alpha通道页面,作为该覆盖层的alpha通道。
DDOVER_ALPHASRC
alpha信息,或隶属于源页面的alpha通道页面,作为该覆盖层的源alpha通道。
然后要怎么配置才能实现alpha呢?
使用keycolor的时候需要设置dwUpdateFlags |= DDOVER_KEYSRCOVERRIDE
alpha应该也有类似的参数,查看DDOVER_KEYSRCOVERRIDE定义的地方
发现有两个变量可能与alpha有关
#define DDOVER_ALPHASRC 0x00000004
#define DDOVER_ALPHASRCNEG 0x00000008
它们的作用是
DDOVER_ALPHASRC
alpha信息,或隶属于源页面的alpha通道页面,作为该覆盖层的源alpha通道。
DDOVER_ALPHASRCNEG
alpha值的增大而增大(0为不透明)。
再看DDOVERLAYCAPS_ALPHASRC的定义
发现DDOVERLAYCAPS_ALPHASRCNEG的定义和DDOVERLAYCAPS_ALPHASRC一样
所以需要同时设置
DDOVER_ALPHASRC和DDOVER_ALPHASRCNEG
dwUpdateFlags |= (DDOVER_ALPHASRC | DDOVER_ALPHASRCNEG);
然后具体的参数要怎么设置呢
先看下DDOVERLAYFX这个结构体
typedef struct _DDOVERLAYFX
{
DWORD dwSize; // size of structure
DWORD dwAlphaConstBitDepth; // Bit depth used to specify alpha constant.
DWORD dwAlphaConst; // Constant to use as alpha channel.
DDCOLORKEY dckDestColorkey; // DestColorkey override
DDCOLORKEY dckSrcColorkey; // DestColorkey override
} DDOVERLAYFX, * LPDDOVERLAYFX;
其中有用到的有这么几个参数:
dwAlphaConstBitDepth
按照实际情况设置这两个参数就可以了,其中
dwAlphaConstBitDepth 控制位图的深度
dwAlphaConst 控制alpha的透明度
设置这两个参数,发现没有实现预想的功能,没办法,只好再上网搜资料,发现别人用的是
DDOVER_ALPHACONSTOVERRIDE
查下MSDN
Flag | Description |
---|---|
DDOVER_ALPHACONSTOVERRIDE | Uses the alpha information specified by dwAlphaConst from the lpDDOverlayFX argument. For this to be supported, the display hardware must support constant alpha blending, as indicated by DDOVERLAYCAPS_ALPHACONSTANT. |
原来要设置DDOVER_ALPHACONSTOVERRIDE才会使用dwAlphaConst指定的参数。
而要设置DDOVER_ALPHACONSTOVERRIDE需要硬件支持DDOVERLAYCAPS_ALPHACONSTANT
所以按照以下的方式设置就可以了
if (ddcaps.dwOverlayCaps & DDOVERLAYCAPS_ALPHACONSTANT)
{
dwUpdateFlags |= DDOVER_ALPHACONSTOVERRIDE;
ovfx.dwAlphaConst = 0x37;
ovfx.dwAlphaConstBitDepth = 8;
}
设置完毕,build以下,OK实现alpha overlaylay的功能了。
参考:
微软MSDN
wince ddraw sample
http://honwsn.itpub.net/post/41648/499213