5

DirectX コンテンツを描画して、デスクトップや実行中の他のアプリケーションの上に浮かんでいるように見せたいと考えています。また、directx コンテンツを半透明にして、他のものが透けて見えるようにする必要もあります。これを行う方法はありますか?

C# で Managed DX を使用しています。

4

4 に答える 4

5

OregonGhost が提供するリンクから始めて、Vista で動作するソリューションを見つけました。これは、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 を「none」に設定すると、100% 透明になり、コンテンツだけがすべての上に浮かんでいます。

于 2008-09-30T08:57:30.467 に答える
2

Windows XP をサポートしたい場合など、Desktop Window Manager を使用しないと難しいと思います。ただし、DWM を使用すると、かなり簡単なようです。

速度が問題にならない場合は、サーフェスにレンダリングしてから、レンダリングされたイメージをレイヤード ウィンドウにコピーすることで解決できます。ただし、それが速いとは思わないでください。

于 2008-09-29T11:12:02.757 に答える
1

WPFも別のオプションです。

Microsoft によって開発された Windows Presentation Foundation (または WPF) は、Windows ベースのアプリケーションでユーザー インターフェイスをレンダリングするためのコンピューター ソフトウェア グラフィカル サブシステムです。

于 2008-10-27T10:07:27.150 に答える