Создание устройства D3D без входного параметра HWND для функции MSFT CreateDevice ()

Прошу прощения, если мои сомнения глупы или глупы. Я совершенно новичок в программировании DirectX. Просто имейте знания C ++ (очень базовые знания COM).

Ниже приведен пример кода из MSDN Создание устройства D3D который объясняет, как создать устройство D3D с нуля.

MyDoubt это :

Здесь функция «pD3D-> CreateDeviceEx ()«принимает параметр
HWND HWND. Что делать, если я пытаюсь создать устройство D3D из
Commadline C ++ Win32 приложение, где мне нужно использовать некоторые функции в интерфейсах устройства D3D. Как мне получить поле HWND. В этом случае
как создать устройство D3D. Пожалуйста, объясните подробно.

HRESULT InitD3D9Ex( /* IN */ HWND hWnd, /* OUT */ IDirect3DDevice9Ex ** ppD3DDevice )
{
HRESULT hr = E_FAIL;
IDirect3D9Ex * pD3D = NULL;
IDirect3DDevice9Ex * pDevice = NULL;

if(ppD3DDevice == NULL)
{
return hr;
}

// Create the D3D object, which is needed to create the D3DDevice.
if(FAILED(hr = Direct3DCreate9Ex( D3D_SDK_VERSION, &pD3D )))
{
*ppD3DDevice = NULL;
return hr;
}// Set up the structure used to create the D3DDevice.
D3DPRESENT_PARAMETERS d3dpp;
ZeroMemory( &d3dpp, sizeof(d3dpp) );
d3dpp.Windowed = TRUE;
d3dpp.SwapEffect = D3DSWAPEFFECT_DISCARD;
d3dpp.BackBufferFormat = D3DFMT_UNKNOWN;

// Create the Direct3D device.
if( FAILED( hr = pD3D->CreateDeviceEx( D3DADAPTER_DEFAULT, D3DDEVTYPE_HAL, hWnd,
D3DCREATE_SOFTWARE_VERTEXPROCESSING,
&d3dpp, NULL, &pDevice ) ) )

{
*ppD3DDevice = NULL;
return hr;
}

// Device state would normally be set here

*ppD3DDevice = pDevice;

return hr;
}

1

Решение

В Windows все визуальные элементы управляются дескрипторами окна. Вы не можете создать D3D «устройство» и прикрепить его к «ничто». Вы должны связать «устройство D3D» с некоторым окном (вашим собственным или рабочим столом).

Окно консоли создается системой, и вы не контролируете его флаги создания, поэтому даже если вы используете GetConsoleWindow функция, вы не можете использовать этот HWND в функциях создания устройства Direct3D (это могло измениться с появлением Aero).

Вы не можете избежать создания еще одного дескриптора окна в своем консольном приложении. Использовать RegisterWindowClass а также CreateWindow функции, чтобы создать новое окно или найти дескриптор для вашего рабочего стола (я сомневаюсь, что вы этого захотите).

3

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

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