SetLayeredWindowAttributes 这个函数在2000以后才能用。我看了好多资料,98下实现方案基本上都是:先抓背景图片,然后对其进行半透明处理(这个好做),最后再将处理过的图片贴到程序窗口,模拟实现半透明(这些都很简单)。但是问题是:如果背景变了的话(这个是很经常的),程序就得重新抓图,然后再将半透明处理过的图片贴到程序窗口,请问这一步怎么做,苦思冥想无解。就像flashGet的那个悬浮框,移到什么地方都可以看到其窗口后面的东西。求高手指点一下如何做啊,100分送上。

解决方案 »

  1.   

    “但是问题是:如果背景变了的话(这个是很经常的),程序就得重新抓图,然后再将半透明处理过的图片贴到程序窗口,请问这一步怎么做,苦思冥想无解。”
    在WM_MOVE消息响应中做这一步
      

  2.   

    楼上你的意思是在WM_MOVE消息中重新捕获背景?这个我试过,但是被程序窗口所遮挡住的那部分背景是没法捕获到的啊,而这一部分正是我需要做半透明处理,然后贴到程序窗口的那部分啊。
      

  3.   

    两个建议:1是用AlphaBlend方法替换试试:参考这里的方法:http://www.codeproject.com/KB/winsdk/quaker1.aspx2
    SetLayeredWindowAttributes这个函数也是用在98下面用的,不能用静态加载,而应该是LoadLibrary("User32.dll") / GetProcAddress
    http://www.powerbasic.com/support/forums/Forum4/HTML/005095.html
      

  4.   

    AlphaBlend 就别想啦,不是不能用,而是需要处理一堆事件,才能知道底层窗口是否更新,还得想方设法获取它DC,如果下面在层叠几个窗口就更麻烦啦,应用层很难办到。SetLayeredWindowAttributes这是MSDN说的,
    Minimum DLL Version user32.dll 
    Header Declared in Winuser.h, include Windows.h 
    Import library User32.lib 
    Minimum operating systems Windows 2000 如LS所述可以式一下。
      

  5.   

    操作系统不支持的话,很难办到,把你的窗口重叠在播放FLASH或动画GIF的网页前面,用模拟的话,你的麻烦就大了。
      

  6.   

    其实这个以前做过,不过效果一般。
    可以在需要抓背景的时候,把显示透明窗口的窗口移出桌面,如移到(1000,2000)等。然后抓背景,再把窗口移回来就可以了。
    如果是视频窗口,gif窗口之前肯定只能抓到黑屏......
      

  7.   

    谢谢楼上各位提示。我是饺尽脑汁啊。也想不出来怎么办,3楼说的在98下动态加载SetLayeredWindowAttributes 函数我是不能用的,因为我的程序实际上最终要做到
    Wince系统的手机上的。因为看到2000以前都没有SetLayeredWindowAttributes 这个函数,而98下flashget可以实现半透明窗口,所以想问问
    98下该如何实现。我最大的问题是如何捕捉被自己程序窗口遮挡住的那部分背景。我想过:如果自己程序先隐藏自己窗口,然后sleep个几百毫秒,是可以捕捉到的,但是这种方法不能经常用。我的程序是:以手机的待机界面为父窗口,滚动显示新闻的程序。(只有当手机界面切换到待机界面才会出现)不会有背景窗口重叠在播放FLASH或动画GIF的网页前面的这种情况请大家帮帮忙啊。小弟感激不尽。
      

  8.   

    没有98系统,没法帮你试,不过flashget在其它系统中确实用到了SetLayeredWindowAttributes,这个你可以通过SPY查看窗口风格确定。
      

  9.   


    除非你拥有DesktopWindow的窗口绘制过程,不然你用 DesktopWindow的DC得到的就是你看到的windows下还是用动态导出SetLayeredWindowAttributes API 来实现吧
    至于手机上,你肯定知道下面的窗口的绘制过程,在绘制过程里保存一个bmp,然后再和你的窗口做alpha 像素混合就行了
      

  10.   

    HOOK不知道能否行得通,发现位于自己窗口下面的程序,截获WM_PAINT和WM_ERASEBKGND,WM_NCPAINT等等消息,提供一个自己的DC给他们画,完了做一下ALPHA混合显示到自己界面。
      

  11.   

    你要先找到DeskTop窗口句柄,然后将图拷下来,再透明化就可以了。
      

  12.   

    在手机上?
    这应该更好做呀
    手机界面才多大,就算把整个DeskTop窗口拷下来也没有多大。