1

私の疑いがばかげているか愚かであるならば、親切に私を許してください。私はDirectXプログラミングにまったく慣れていません。C ++の知識(非常に基本的なCOMの知識)を持っているだけです。

以下のコードサンプルは、MSDNのD3Dデバイスの作成からのものであり、D3Dデバイスを最初から作成する方法を説明しています。

MyDoubtは

ここで、関数「pD3D-> CreateDeviceEx()」はパラメーターHWNDhwndを取ります。D3Dデバイスのインターフェイスでいくつかの関数を使用する必要があるコンマドライン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;
}
4

1 に答える 1

3

Windowsでは、すべての視覚的なものはウィンドウハンドルによって制御されます。D3Dの「デバイス」を作成して「何もない」に接続することはできません。「D3Dデバイス」を何らかのウィンドウ(独自のウィンドウまたはデスクトップ)に関連付ける必要があります。

コンソールウィンドウはシステムによって作成され、その作成フラグを制御しないため、GetConsoleWindow関数を使用しても、Direct3Dデバイス作成関数でこのHWNDを使用することはできません(これはAeroの導入により変更された可能性があります)。

コンソールアプリケーションでさらに別のウィンドウハンドルを取得することを避けられません。RegisterWindowClassand関数を使用CreateWindowして、新しいウィンドウを作成するか、デスクトップへのハンドルを見つけます(これが必要になるとは思えません)。

于 2012-10-30T11:00:21.537 に答える