wince6.0下ddraw实现alpha overlay学习笔记

记录下学习在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
Bit depth used to specify the alpha constant for a source.
dwAlphaConst
Constant to use as the alpha channel for a source.

 

按照实际情况设置这两个参数就可以了,其中

 

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

 

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值