有人能分析透明窗体是如何实现的吗能不能自己写出透明窗体的函数 实现他的功能

解决方案 »

  1.   

    int CMainFrame::SetTransparent(HWND hWnd,int nValue)
    {
    BOOL bRet = FALSE;
    //SetWindowLong(this->GetSafeHwnd(),GWL_EXSTYLE,GetWindowLong(this->GetSafeHwnd(),GWL_EXSTYLE)^0x80000);
    SetWindowLong(hWnd,GWL_EXSTYLE,GetWindowLong(hWnd,GWL_EXSTYLE)^0x80000);
    HINSTANCE hInst = LoadLibrary("User32.DLL"); 
    if(hInst) 

    typedef BOOL (WINAPI *MYFUNC)(HWND,COLORREF,BYTE,DWORD); 
    MYFUNC fun = NULL;
    fun=(MYFUNC)GetProcAddress(hInst, "SetLayeredWindowAttributes");
    if(fun)
    {
    bRet = fun(hWnd,0, nValue, 2); 
    }
    FreeLibrary(hInst); 
    }
    return bRet;
    }
      

  2.   

    可能我没有说清楚 不是说这个函数怎么用,而是这个函数的实现原理是什么,能不能自己写代码代替这个函数api  :)
      

  3.   

    先设置分层窗口样式,然后调用api透明,这个用法我知道的。只是在实现过程中发现,当半透明的窗体覆盖在视频播放器的窗口上时候,
    相交部分会有闪烁。看过现在许多透明的程序,都存在这个问题。问上面一个问题是我想绕过window api 自己实现,或许能够解决这个问题。
      

  4.   

    如何 自己实现 SetLayeredWindowAttributes 所具备的功能?
      

  5.   

    可以实现他的部分功能!! 但是完全想系统函数这样的很难
    例如你要透明一个dialog
    你可以采用在此dialog上不断的画他下层的界面的方法这样看出去就是透明效果
    但是具体微软是怎么做的,就很难说清楚了
      

  6.   

    先取得窗口句柄 一层一层的去取
    然后取得窗口dc ,把dc直接copy过来就可以了
    当然写起来比较复杂,很麻烦!!
      

  7.   

    这个功能是操作系统支持的,必须是WIN2000及以上版本,98就不支持,操作系统绘制桌面时把窗口半透明画上去是小菜一碟,但如果想不依赖Windows版本实现的话基本就不太可能了,因为无法获得被窗口覆盖的图象,尤其是动画显示的图象,典型的就是桌面属性的效果里设置拖动时显示窗口内容,然后隐藏任务栏,把窗口拖到桌面下方,鼠标移下去让任务栏从你窗口后面升起来,两个关键问题:
    1、如何知道你窗口后面有别的窗口移动。
    2、如何获得窗口后面的图象并且要连续获得。
    获得窗口后面的图象我只想到是让窗口瞬间隐藏抓屏然后再显示,这样窗口就会闪并且无法拖动。
    总之,不用SetLayeredWindowAttributes,只能模拟出一部分功能,好象没办法完全模拟。也没见到过能在WIN98运行的此类程序。
      

  8.   

    很难实现。如果被覆盖的窗口是运动的,几乎就能难搞定,比如覆盖住一个动态的网页,网页中有播放的Gif或flash.
      

  9.   

    我认为原理上是这样:
        我们看到的窗口等是由操作系统支持显示的,操作系统和显卡通信,告诉它显示的数据。在显卡里有一个叫做色键的东西,就是Alpha通道的问题,只要把你显示的数据和原有的数据用alpha混合的方式叠加就可以实现。
      

  10.   

    實現原理與 DirectX Draw 有著莫大的關系,實質上,Windows 2000及以上的版本,它們的桌面顯示都是以 DirectX Draw 來實現的,隻不過相差的隻是版本不同而已,窗體之間的相互覆蓋,是整個桌面進行的,調用的是對象的OnDraw 方法,但是實質上是將要刷新的 layer 數據傳入 桌面的刷新體系中去。
    当半透明的窗体覆盖在视频播放器的窗口上时候,相交部分会有闪烁。是因為兩個窗體在刷新數據時,數據更新頻率跟不上拍,當然,這也是 DirectX Draw 本身的缺陷了。