2012年1月12日木曜日

IDirect3D9::EnumAdapterModes

EnumAdapterModesは,指定されたアダプタ,フォーマットで指定された番号のモードに関して,幅,高さ,リフレッシュレート,フォーマットを,最後の引数に渡したポインタが指す変数に返す.しかし,日本語のドキュメントが最後の引数が配列,と書いていたけど,英語だと単なるポインタになっているので,誤訳だと思われる.

#include <sdkddkver.h>

#define WIN32_LEAN_AND_MEAN
#include <Windows.h>

#include <tchar.h>
#include <sstream>
typedef std::basic_ostringstream<TCHAR> tostringstream;

#include <d3d9.h>

#include <memory>

template <typename T>
struct release_deleter {
    typedef T * pointer;

    void operator()(T * p) const
    {
        p->Release();
    }
};

typedef std::unique_ptr<IDirect3D9, release_deleter<IDirect3D9> > d3d_ptr;

int APIENTRY _tWinMain(HINSTANCE, HINSTANCE, LPTSTR, int)
{
    // IDirect3D9オブジェクトの生成
    d3d_ptr pD3D(Direct3DCreate9(D3D_SDK_VERSION));

    // エラーチェック
    if(pD3D == NULL){
        MessageBox(
            NULL,
            TEXT("IDirect3D9のオブジェクトを生成できませんでした."),
            TEXT("失敗"),
            MB_OK
        );
        return -1;
    }

    UINT n = pD3D->GetAdapterCount();
    for(UINT i = 0; i < n; ++i){

        UINT m = pD3D->GetAdapterModeCount(i, D3DFMT_X8R8G8B8);
        for(UINT j = 0; j < m; ++j){
            D3DDISPLAYMODE DisplayMode;
            pD3D->EnumAdapterModes(i, D3DFMT_X8R8G8B8, j, &DisplayMode);
            
            // EnumAdapterModes()の結果を文字列に
            tostringstream msg;
            msg << "Adapter " << i << " : Mode " << j << '\n';
            msg << "Format      : " << DisplayMode.Format << '\n';
            msg << "Width       : " << DisplayMode.Width << '\n';
            msg << "Height      : " << DisplayMode.Height << '\n';
            msg << "RefreshRate : " << DisplayMode.RefreshRate << '\n';

            /* 結果の表示は大量に出ることもあるのでコメントアウト
            MessageBox(
                NULL,
                msg.str().c_str(),
                TEXT("結果"),
                MB_OK
            );
            */
        }
    }
    
    return 0;
}

こっそり,IDirect3D9オブジェクトの解放をuniqu_ptrにやらせるように変更してみたり.

0 件のコメント:

コメントを投稿