gpt4 book ai didi

c# - 创建一个虚拟 HWND 以传递给 Direct3D

转载 作者:太空狗 更新时间:2023-10-29 21:46:42 24 4
gpt4 key购买 nike

我正在尝试翻译 D3DImage sample到带有 SharpDX 的纯 C#。 Direct3D 需要一个 HWND 来初始化,这就是它在 C++ 中的完成方式:

WNDCLASSEX g_wc = { sizeof(WNDCLASSEX), CS_CLASSDC, nullptr, 0L, 0L,
GetModuleHandle(nullptr), nullptr, nullptr, nullptr, nullptr, L"Foo", nullptr };
HWND g_windowHandle;

// Create invisible window to get HWND
RegisterClassEx(&g_wc);
g_windowHandle = CreateWindow(L"Foo", L"Foo", WS_OVERLAPPEDWINDOW,
0, 0, 0, 0, nullptr, nullptr, nullptr, nullptr);

// then eventually we can create the device
Direct3DCreate9Ex(D3D_SDK_VERSION, &m_d3d);
m_d3d->CreateDeviceEx(D3DADAPTER_DEFAULT, D3DDEVTYPE_HAL, g_windowHandle,
vertexProcessing | D3DCREATE_MULTITHREADED | D3DCREATE_FPU_PRESERVE,
&d3dpp, nullptr, &m_d3dDevice);

在 C# 中获取此虚拟 HWND 的最佳方法是什么?它必须不同于主窗口的 HWND。我的应用程序是一个 WPF 项目。

最佳答案

IDirect3D9Ex::CreateDeviceEx 的文档说如果您处于窗口模式并且您的演示文稿 HWND 中的 HWND 参数是可选的 D3DPRESENT_PARAMETERS 结构已设置(后期编辑:糟糕,不能为空)

来自 IDirect3D9Ex::CreateDeviceEx @ MSDN

hFocusWindow [in]
Type: HWND
The focus window alerts Direct3D when an application switches from foreground mode to background mode. For full-screen mode, the window specified must be a top-level window. For windowed mode, this parameter may be NULL only if the hDeviceWindow member of pPresentationParameters is set to a valid, non-NULL value.

D3DPRESENT_PARAMETERS struct @ MSDN

要获得要使用的窗口句柄,您可以通过常规 .NET 框架方法创建另一个顶级窗口并获取其窗口句柄,而不是通过 Win32 方法调用来完成 Action 。

如果您发现无法使用 WPF 提供的句柄(根据 Hans Passant 的评论),您还可以制作一个虚拟 Windows 窗体并将其实例化为隐藏窗口,然后改用其句柄。

WindowInteropHelper (WPF) @ MSDN

Control.Handle (Windows Forms) @ MSDN

脚注:您现有的 WPF 主窗口句柄可能没问题,除非 SharpDX 中的某些机制或现有的 Viewport3D 与以这种方式使用 Direct3D9 有冲突。

3-D Graphics Overview (WPF) @ MSDN
Viewport3D Class (WPF) @ MSDN

关于c# - 创建一个虚拟 HWND 以传递给 Direct3D,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14592809/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com