有。Duilib 或 DirectUI。
基于句柄的方式实现不了,有的所谓的实现还是存在瑕疵。

解决方案 »

  1.   


    使用Setlayeredwindowattributes函数可以实现透明窗口。之前使用SetWindowLong函数,使窗口拥有WS_EX_LAYERED扩展属性。Setlayeredwindowattributes函数的原型为
    BOOL SetLayeredWindowAttributes(
    HWND hwnd, // handle to the layered window
    COLORREF crKey, // specifies the color key
    BYTE bAlpha, // value for the blend function
    DWORD dwFlags // action
    );
    其中
    hWnd是透明窗体的句柄,
    crKey为掩码的颜色,可以用RGB(r,g,b)来指定。
    bAlpha是不透明度,取值范围是(0,255),其中0代表全透明,255代表不透明。
    dwFlags是透明方式,可以取两个值:
    当取值为LWA_ALPHA时,crKey参数无效,bAlpha参数有效;
    当取值为LWA_COLORKEY时,窗体中的所有颜色为crKey的地方将变为透明,bAlpha参数无效。
      

  2.   

    那些DirectUI一般是这样做的,绘制子窗口的时候,调用绘制父窗口的函数进行绘制,你传给他子窗口的DC即可。
    然后子窗口可以在Blend一张半透明的PNG作为遮罩。