Platform SDK: DirectX

ステップ 1.1 : ドライバ情報を列挙する

[Visual Basic]

ここでは、C および C++ でのアプリケーション開発について説明する。Visual Basic については、「Direct3D 直接モード Visual Basic チュートリアル」を参照すること。

[C++]

Enumeration アプリケーションでは、次のアプリケーション定義コールバック関数を使用して、システムにインストールされているすべての DirectDraw デバイスを列挙する。

static BOOL WINAPI DriverEnumCallback( GUID* pGUID, LPSTR strDesc,
                                       LPSTR strName, VOID*, HMONITOR )

第 1 パラメータ pGUID は、DirectDraw オブジェクトに固有の識別子のアドレスである。次の 2 つのパラメータは、ドライバの説明および名前を記述する文字列である。この関数の詳細については、SDK リファレンスの「DDEnumCallbackEx」の項目を参照すること。

ドライバ情報を列挙する前に、ディスプレイ ドライバを作成する必要がある。アプリケーション定義コールバック関数 DriverEnumCallback に渡されるグローバル ユニーク識別子 (GUID) を使用して、アプリケーションのディスプレイ ドライバを作成する。

hr = DirectDrawCreateEx( pGUID, (VOID**)&pDD, IID_IDirectDraw7, NULL );

引数 NULL は、アクティブなディスプレイ ドライバの使用を指定する。この時点で、Enumeration アプリケーションには、すべての Direct3D デバイスの列挙に使用される IDirect3D7 オブジェクトが作成される。

ドライバ データを D3DDEVICEINFO 構造体にコピーできる。これにより、ドライバ情報がユーザーのアプリケーション定義コールバック関数に渡される。

    // データをデータ情報構造体にコピーする。
    ZeroMemory( &d3dDeviceInfo, sizeof(D3DDEVICEINFO) );
    strncpy( d3dDeviceInfo.strDesc, strDesc, 39 );
    d3dDeviceInfo.ddDriverCaps.dwSize = sizeof(DDCAPS);
    d3dDeviceInfo.ddHELCaps.dwSize    = sizeof(DDCAPS);
    pDD->GetCaps( &d3dDeviceInfo.ddDriverCaps, &d3dDeviceInfo.ddHELCaps );
    d3dDeviceInfo.pDriverGUID = pGUID;

次のサンプル コードを調べて、D3DDEVICEINFO 構造体の ddsdModes メンバが、特定のデバイスでサポートされるディスプレイ モードを記述 (リスト) する DDSURFACEDESC2 型の配列であることに注目する。最終的には、コンボ ボックスをユーザーに表示し、現在のディスプレイ モード (ウィンドウ) のリストに続けて、デバイスでサポートされるフルスクリーン ディスプレイ モードのリストを表示できる。

注 :  このチュートリアルでは、Enumeration アプリケーションのグラフィカル ユーザー インタフェース (GUI) の設計および構造については触れない。詳細については、SDK のコードを参照すること。

次のサンプル コードでは、現在のディスプレイ モード設定のディスプレイ モードに関する情報を取得する。

    if( ( NULL == d3dDeviceInfo.pDriverGUID ) &&
        ( d3dDeviceInfo.ddDriverCaps.dwCaps2 & DDCAPS2_CANRENDERWINDOWED ) )
    {
        // 現在のディスプレイ深度を取得する。
        DEVMODE devmode;
        devmode.dmSize = sizeof(DEVMODE);
        EnumDisplaySettings( NULL, ENUM_CURRENT_SETTINGS, &devmode );
 
        // モード情報を設定する。
        DDSURFACEDESC2* pMode = &d3dDeviceInfo.ddsdModes[0];
        pMode->ddpfPixelFormat.dwRGBBitCount = devmode.dmBitsPerPel;
        pMode->dwWidth  = 0;
        pMode->dwHeight = 0;
 
        d3dDeviceInfo.dwNumModes = 1;
    }

上記のサンプル コードは、ddsdModes 配列の要素に現在のディスプレイ設定を格納する方法を示している。ddsdModes 配列の残りの要素に値が格納されるのは、各デバイスにフルスクリーン ディスプレイ モードが列挙され、選択された後である。EnumDisplaySettings メソッドは、現在のディスプレイ深度に関する情報の取得に使用されることに注意する。深度設定は DEVMODE 構造体に保存された後、ddsdModes 配列の最初の要素である ddpfPixelFormat.dwRGBBitCount メンバにコピーされる。

        pMode->ddpfPixelFormat.dwRGBBitCount = devmode.dmBitsPerPel;

ここでは、システムの DirectDraw ドライバを列挙して、現在のディスプレイ設定を保存した。次は、ディスプレイ モードを列挙する。

ディスプレイ モードの列挙については、「ステップ 1.2 : ディスプレイ モード情報を列挙する」で詳しく説明する。