Как нарисовать прозрачный контент DirectX в прозрачном окне? - PullRequest
5 голосов
/ 29 сентября 2008

Я хочу нарисовать содержимое DirectX так, чтобы оно казалось поверх рабочего стола и любых других работающих приложений. Мне также нужно иметь возможность сделать содержимое DirectX полупрозрачным, чтобы другие вещи были понятны. Есть ли способ сделать это?

Я использую Managed DX с C #.

Ответы [ 4 ]

5 голосов
/ 30 сентября 2008

Я нашел решение, которое работает на 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 значение «none», и оно будет на 100% прозрачным, и только ваш контент будет выше всего.

4 голосов
/ 18 января 2015

Вы можете использовать DirectComposition, LayeredWindows, DesktopWindowManager или WPF. Все методы имеют свои преимущества и недостатки:

-DirectComposition является наиболее эффективным, но требует Windows 8 и ограничена частотой 60 Гц.

-LayeredWindows сложно работать с D3D через Direct2D-взаимодействие с использованием DXGI.

-WPF относительно прост в использовании через D3DImage, но также ограничен 60 Гц и DX9 и без MSAA. Возможно взаимодействие с более высокими версиями DX через DXGI, также можно использовать MSAA, когда цель MSAA-Rendertarget разрешается на нативную поверхность, отличную от MSAA.

-DesktopWindowManager отлично подходит для высокой производительности, доступной начиная с Windows Vista, но версии DirectX, по-видимому, ограничены версией, которую использует DWM (все еще DX9 в Vista). Обходные пути для более высоких версий DX должны быть возможны через DXGI, где это возможно

Если вам не нужно для каждого пикселя aplha, вы также можете использовать значение непрозрачности полупрозрачной формы. Я смог использовать все описанные методы с C # и SharpDX, но в случае DirectComposition и LayeredWindows потребовалось немного C ++ - Wrappercode. Для начала я бы предложил пройти через WPF.

2 голосов
/ 29 сентября 2008

Полагаю, это будет сложно без использования диспетчера окон рабочего стола, т. Е. Если вы хотите поддерживать Windows XP. С DWM все выглядит просто довольно просто .

Если скорость не является проблемой, вы можете избежать рендеринга на поверхность, а затем скопировать визуализированное изображение в многослойное окно. Не ожидайте, что это будет быстро, хотя.

1 голос
/ 27 октября 2008

WPF также является другим вариантом.

Разработанная Microsoft, Windows Presentation Foundation (или WPF) - это компьютерная графическая подсистема для визуализации пользовательских интерфейсов в приложениях на базе Windows.

...