如何在透明窗口中绘制透明的DirectX内容?

我想绘制DirectX内容,以便它看起来是悬浮在桌面和任何其他正在运行的应用程序的顶部。 我也需要能够使directx内容半透明,所以其他的东西显示。 有没有办法做到这一点?

我正在使用C#托pipeDX。

Solutions Collecting From Web of "如何在透明窗口中绘制透明的DirectX内容?"

我发现一个解决方案在Vista上运行,从OregonGhost提供的链接开始。 这是C#语法中的基本过程。 此代码位于从Form继承的类中。 它似乎不工作,如果在UserControl中:

//this will allow you to import the necessary functions from the .dll using System.Runtime.InteropServices; //this imports the function used to extend the transparent window border. [DllImport("dwmapi.dll")] static extern void DwmExtendFrameIntoClientArea(IntPtr hWnd, ref Margins pMargins); //this is used to specify the boundaries of the transparent area internal struct Margins { public int Left, Right, Top, Bottom; } private Margins marg; //Do this every time the form is resized. It causes the window to be made transparent. marg.Left = 0; marg.Top = 0; marg.Right = this.Width; marg.Bottom = this.Height; DwmExtendFrameIntoClientArea(this.Handle, ref marg); //This initializes the DirectX device. It needs to be done once. //The alpha channel in the backbuffer is critical. PresentParameters presentParameters = new PresentParameters(); presentParameters.Windowed = true; presentParameters.SwapEffect = SwapEffect.Discard; presentParameters.BackBufferFormat = Format.A8R8G8B8; Device device = new Device(0, DeviceType.Hardware, this.Handle, CreateFlags.HardwareVertexProcessing, presentParameters); //the OnPaint functions maked the background transparent by drawing black on it. //For whatever reason this results in transparency. protected override void OnPaint(PaintEventArgs e) { Graphics g = e.Graphics; // black brush for Alpha transparency SolidBrush blackBrush = new SolidBrush(Color.Black); g.FillRectangle(blackBrush, 0, 0, Width, Height); blackBrush.Dispose(); //call your DirectX rendering function here } //this is the dx rendering function. The Argb clearing function is important, //as it makes the directx background transparent. protected void dxrendering() { device.Clear(ClearFlags.Target, Color.FromArgb(0, 0, 0, 0), 1.0f, 0); device.BeginScene(); //draw stuff here. device.EndScene(); device.Present(); } 

最后,具有默认设置的窗体将具有透明的部分透明背景。 将FormBorderStyle设置为“无”,它将是100%透明的,只有您的内容浮动高于一切。

您可以使用DirectComposition,LayeredWindows,DesktopWindowManager或WPF。 所有的方法都有其优点和缺点:

直接组合是最有效的,但是需要Windows 8并且被限制在60Hz。

LayeredWindows使用DXGI通过Direct2D-interop来处理D3D是非常棘手的。

-WPF通过D3DImage相对比较容易使用,但是也限制在60Hz和DX9,而不是MSAA。 通过DXGI交互到更高的DX版本也是可能的,当MSAA-Rendertarget解析到本机非MSAA表面时,也可以使用MSAA。

-DesktopWindowManager对于Windows Vista以后的高性能来说非常棒,但是DirectX版本似乎受到DWM使用的版本的限制(仍然是Vista上的DX9)。 更高DX版本的解决方法应该可以通过DXGI进行

如果您不需要每像素aplha,也可以使用半透明窗体的不透明度值。 我已经能够使用所有描述的技术与C#和SharpDX,但在DirectComposition和LayeredWindows的情况下需要一点点C ++ – Wrappercode。 对于初学者,我会建议通过WPF去。

我想这将是很难不使用桌面窗口管理器,即如果你想支持Windows XP。 有了DWM,它似乎相当容易 。

如果速度不是问题,那么您可能会脱离渲染到表面,然后将渲染的图像复制到分层窗口。 不要指望这是快速的。

WPF也是另一种选择。

Windows Presentation Foundation(或WPF)是由Microsoft开发的一种计算机软件图形子系统,用于呈现基于Windows的应用程序中的用户界面。