Я пытаюсь перевести Образец D3DImage на чистый C # с SharpDX. 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);
Каков будет лучший способ получить этот манекен HWND в C #? Он должен отличаться от HWND главного окна. Мое приложение — проект WPF.
Документация для IDirect3D9Ex::CreateDeviceEx
говорит HWND
Параметр не обязателен, если вы находитесь в оконном режиме и ваша презентация HWND
в вашем D3DPRESENT_PARAMETERS
структура установлена (позднее редактирование: упс, не может быть пустым).
От IDirect3D9Ex :: CreateDeviceEx @ MSDN
hFocusWindow [in] Тип: HWND
Окно фокуса предупреждает Direct3D, когда приложение переключается из режима переднего плана в режим фона. Для полноэкранного режима указанное окно должно быть окном верхнего уровня. Для оконного режима этот параметр может иметь значение NULL, только если для элемента hDeviceWindow элемента pPresentationParameters установлено допустимое значение, отличное от NULL.
D3DPRESENT_PARAMETERS struct @ MSDN
Чтобы получить дескриптор окна для использования, вы можете создать другое окно верхнего уровня через обычные методы .NET Framework и захватить его дескриптор окна вместо того, чтобы проходить через движения с вызовами методов Win32.
Если вы обнаружите, что не можете использовать дескриптор, предоставленный WPF (согласно комментарию Ханса Пассанта), вы также можете создать фиктивную форму Windows и создать ее в качестве скрытого окна, а вместо этого использовать ее дескриптор.
WindowInteropHelper (WPF) @ MSDN
Control.Handle (Windows Forms) @ MSDN
Сноска. Ваш существующий дескриптор главного окна WPF, вероятно, работает нормально, если какой-либо механизм в SharpDX или существующий Viewport3D не конфликтует с использованием Direct3D9 таким образом.
Обзор трехмерной графики (WPF) @ MSDN
Viewport3D Class (WPF) @ MSDN
Других решений пока нет …