Frage

Ich möchte DirectX Inhalt ziehen, so dass es schwebend über oben auf dem Desktop und anderen Anwendungen zu sein scheint, die ausgeführt werden. Ich muß auch in der Lage sein, den directx Inhalt semi-transparent zu machen, so dass andere Dinge durch zeigen. Gibt es eine Möglichkeit, dies zu tun?

Ich verwende Managed DX mit C #.

War es hilfreich?

Lösung

Ich fand eine Lösung, die auf Vista arbeitet, von der Verbindung von OregonGhost vorgesehen beginnen. Dies ist der grundlegende Prozess, in C # Syntax. Dieser Code ist in einer Klasse von Form vererben. Es scheint nicht, wenn in einem Usercontrol zu arbeiten:

//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();
}

Schließlich wird ein Formular mit Standardeinstellung einen glasig sucht teilweise transparenten Hintergrund. Stellen Sie den Formborderstyle auf „none“ und es wird zu 100% transparent sein nur mit dem Inhalt über alles schwebt.

Andere Tipps

Sie können entweder DirectComposition, LayeredWindows, DesktopWindowManager oder WPF. Alle Methoden sind mit ihren Vor- und Nachteilen:

-DirectComposition ist die effizienteste, aber braucht Windows 8 und ist begrenzt auf 60 Hz.

-LayeredWindows sind schwierig mit D3D via Direct2D-Interop zum Laufen zu bringen DXGI verwendet wird.

-WPF ist relativ einfach über D3DImage zu bedienen, sondern auch auf 60 Hz und DX9 und ohne MSAA beschränkt. Interop zu höheren DX-Versionen über DXGI möglich ist, auch kann MSAA verwendet werden, wenn der MSAA-Rendertarget auf die native nonMSAA Oberfläche aufgelöst wird.

-DesktopWindowManager ist für hohe Leistung verfügbar seit Windows Vista, aber DirectX-Versionen scheinen von der Version der DWM Nutzungen (noch DX9 auf Vista) begrenzt werden. Abhilfen für höhere DX-Versionen sollten möglich sein, über DXGI, sofern verfügbar.

Wenn Sie nicht brauchen, pro Pixel aplha, können Sie auch die Opazität-Wert einer halbtransparenten Form verwenden.

Oder Sie verwenden die native Win32-Methode für das Window global alpha (erinnern Sie sich ein Alpha von 0 wird die Mauseingabe nicht fangen):

SetWindowLong(hWnd, GWL_EXSTYLE, GetWindowLong(hWnd, GWL_EXSTYLE) | WS_EX_LAYERED);
COLORREF color = 0;
BYTE alpha = 128;
SetLayeredWindowAttributes(hWnd, color, alpha, LWA_ALPHA);

Ich konnte alle beschriebenen Techniken mit C # und SharpDX, aber im Fall von DirectComposition, LayeredWindows und nativen Win32 ein wenig C ++ - Wrappercode benötigt wurde. Für den Anfang würde ich vorschlagen, über WPF zu gehen.

Ich denke, das wird schwer sein, ohne den Desktop Window Manager zu verwenden, das heißt, wenn Sie Windows XP unterstützen möchten. Mit der DWM, so scheint es zu sein, ziemlich einfach though.

Wenn die Geschwindigkeit kein Problem ist, können Sie weg mit einer Oberfläche Rendering und dann das Kopieren des gerenderten Bildes zu einem geschichteten Fenster. Sie nicht erwarten, dass obwohl schnell zu sein.

WPF ist auch eine weitere Option.

  

Entwickelt von Microsoft, die Windows Presentation Foundation (WPF oder) ist eine Computer-Software grafische Subsystem für das Rendern Benutzeroberflächen in Windows-basierten Anwendungen.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top