代码路径:https://github.com/falllingstar/Direct3DandOpenGLTransparentWindow
方法一:
该方法适用于OpenGL,
只要在创建OpenGL上下文之前,调用DWMApi的 DwmEnableBlurBehindWindow 即可。
这个函数在Windows7上是用来开启窗口的背景毛玻璃效果的
#include<dwmapi.h>
#pragma comment (lib, "dwmapi.lib")
DWM_BLURBEHINDbb={0};HRGNhRgn=CreateRectRgn(0,0,-1,-1);//应用毛玻璃的矩形范围,
//参数(0,0,-1,-1)可以让整个窗口客户区变成透明的,而鼠标是可以捕获到透明的区域
bb.dwFlags=DWM_BB_ENABLE|DWM_BB_BLURREGION;bb.hRgnBlur=hRgn;bb.fEnable=TRUE;DwmEnableBlurBehindWindow(hWnd,&bb);
![](https://img-blog.csdnimg.cn/img_convert/69f6942bff91cabc46ac936b860739fc.jpeg)
OpenGL
方法二:
适用于Direct3D / 2D 。
在Windows Vista 以上的系统,桌面使用支持硬件加速的DWM来渲染窗口。
每个窗口在创建时,会为窗口客户区创建一个离屏表面,窗口的内容(按钮、编辑框等等等...)最终会绘制到这个离屏表面。这样DWM在渲染窗口时,绘制一个窗口边框并把对应窗口的离屏表面和窗口边框组合在一起,就形成了整个电脑桌面。
窗口的离屏表面也叫做重定向表面
![](https://img-blog.csdnimg.cn/img_convert/a8bf357d39ec698ad1c0f538eae956b0.jpeg)
DWM的工作流程
在创建窗口是给定窗口扩展样式 WS_EX_NOREDIRECTIONBITMAP
这样创建出来的窗口就没有重定向表面,客户区显示出来是透明的。
然后用到 DirectComposition API
DirectComposition 可以在窗口上合成位图
具体代码见 d2d_code.cpp 的 InitDirect2D() 函数里,下面是摘取的代码片段
//............
//使用 DXGIFactory2 里面的 CreateSwapChainForComposition 来创建交换链
//..............................
//............
//创建CompositionDevice
DCompositionCreateDevice(
g_dxgidevice.Get(),
__uuidof(dcompDevice),
reinterpret_cast<void **>(dcompDevice.GetAddressOf()));
//用窗口句柄来创建一个CompositionTarget
dcompDevice->CreateTargetForHwnd(win.GetHwnd(),
true, // Top most
target.GetAddressOf());
//创建一个Visual,用来把Direct3D的渲染结果显示在窗口上
dcompDevice->CreateVisual(visual.GetAddressOf());
//把Visual和之前创建的交换链绑定
visual->SetContent(g_swapchain.Get());
target->SetRoot(visual.Get());
//提交显示
dcompDevice->Commit();
![](https://img-blog.csdnimg.cn/img_convert/2c6a25477e6ad17775e8040c0fc54a71.webp?x-oss-process=image/format,png)
Direct2D