我想在VC++中实现这样的一个效果:
一个对话框中贴着一个大背景图,我要让一个png格式的小图片在这个背景图上来回移动,实现若隐若现(即改变透明度)的效果,并且让这个png格式的小图片的透明区域部分不显示出来?大家知道怎么做吗?(100分)
---------------------------------------------
一定要同时实现这两种效果(1.透明区域不显示。2.不透明区域可以以任意透明度显示。),不能只实现单独的一种,不然我也能做得出来,呵呵~!请大家帮帮忙

解决方案 »

  1.   

    1.透明区域不显示
    ---------------------
    是背景不透明吧,你可以SetLayeredWindowAttributes,设置颜色透明。
     
    2.不透明区域可以以任意透明度显示
    -------------------------------
    这个只有用算法处理小图片了
      R(C)=R(A)*alpha+R(B)*(1-alpha)   
      G(C)=G(A)*alpha+G(B)*(1-alpha)   
      B(C)=B(A)*alpha+B(B)*(1-alpha)   
    ---------------------------------------
    如果用SetLayeredWindowAttributes也将背景的某些色彩去掉了,LZ可以不用,
    直接在内存DC上先画背景,然后用透明度算法处理小图片像素,再将小图片贴到内存DC上,后在显示DC上一起贴出来另外,DirectDraw可以做出来,而且速度又快,不知LZ有无兴趣
      

  2.   

    2楼的办法不行啊,png图片透明区域是没有颜色的,我怎么设置?
      

  3.   

    你能够读取PNG图了吧,所谓透明在转换为位图后其实也是一种颜色,然后用位图转换为区域(Region)的方法创建一个区域(CRgn),也就是抠图,然后在绘制的时候用SelectClipRegion来设置剪切区域,用AlphaBlend来绘制透明图形。在你的图形不改变的情况下这是很好的方法。
    如果追求速度,可以直接操作位图数据,把你的前景位图通过内存运算绘制到背景上,然后再把结果贴到界面上。
      

  4.   

    在我的程序中图片是不断移动的,而且速度是飞快的,如果用SelectClipRegion每移动一下就要做这么多运算,天哪,真的不敢想象,要是静态图像还可以!
    有没有更好的办法啊,比如直接调用一个函数什么的!