c # — Создание фиктивного HWND для передачи в Direct3D

Я пытаюсь перевести Образец 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.

3

Решение

Документация для 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

2

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]