【发布时间】:2013-01-29 21:39:57
【问题描述】:
我正在尝试使用 SharpDX 将 D3DImage sample 转换为纯 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 项目。
【问题讨论】:
-
你可以考虑从
CreateWindowEx开始 -
虚拟窗体窗体/用户控件不能完成这项工作吗?他们应该有一个句柄。
-
不清楚为什么要使用虚拟窗口。只需使用您在 WPF 中创建的常规窗口即可。使用 WindowInteropHelper.Handle 属性。
-
@HansPassant 因为这就是我链接到的 MSDN 示例所说的:“通常,您创建一个虚拟 HWND 供 Direct3D9 使用。”