none
C++ DirextX9でフルスクリーン表示 RRS feed

  • 質問

  • はじめまして、よろしくお願いします。
    15歳からはじめるDirectX9 を見ながら
    ウィンドウ表示、フルスクリーン表示をやっています。
    ウインドウ表示はうまく動作したのですが、フルスクリーンはエラーが返されフルスクリーンになりません。
    書籍には「環境によってはフルスクリーン表示できないこともあります」
    とあるのですが
    DirextX9はインストール済み、ビデオカードはGeforce 9600なので
    大丈夫だとおもうのですが・・・
    どうすればフルスクリーン表示できるようになるでしょうか。


    以下ソースコード

    HRESULT InitD3D_Full( HWND hWnd )
    {
        if( NULL == ( g_pD3D = Direct3DCreate9( D3D_SDK_VERSION ) ) )
            return E_FAIL;

     D3DDISPLAYMODE dispmode;
     g_pD3D->GetAdapterDisplayMode(D3DADAPTER_DEFAULT,&dispmode);
     
     
     D3DPRESENT_PARAMETERS d3dpp;
        ZeroMemory( &d3dpp, sizeof(d3dpp) );
        d3dpp.Windowed = FALSE;
     d3dpp.BackBufferWidth=dispmode.Width;
     d3dpp.BackBufferHeight=dispmode.Height;
     d3dpp.BackBufferFormat=dispmode.Format;
     d3dpp.FullScreen_RefreshRateInHz=dispmode.RefreshRate;
        d3dpp.SwapEffect = D3DSWAPEFFECT_DISCARD;
        d3dpp.BackBufferFormat = D3DFMT_UNKNOWN;

       if( FAILED( g_pD3D->CreateDevice( D3DADAPTER_DEFAULT, D3DDEVTYPE_HAL, hWnd,
                                          D3DCREATE_HARDWARE_VERTEXPROCESSING,
                                          &d3dpp, &g_pd3dDevice ) ) ){

         if( FAILED( g_pD3D->CreateDevice( D3DADAPTER_DEFAULT, D3DDEVTYPE_HAL, hWnd,
                                          D3DCREATE_SOFTWARE_VERTEXPROCESSING,
                                          &d3dpp, &g_pd3dDevice ) ) ){
            return E_FAIL;
           }
     }
        return S_OK;
    }

    2009年4月17日 1:06

回答

  • まずは失敗の原因を探ってみましょう。
    たぶん CreateDevice が失敗しているのだと思いますが、CreateDevice は失敗するとその原因を返してくれます。

    失敗した場合は、次のいずれかの値を返す。

    D3DERR_INVALIDCALL メソッドの呼び出しが無効である。たとえば、メソッドのパラメータに無効な値が設定されている場合などである。
    D3DERR_NOTAVAILABLE このデバイスは、問い合わせたテクニックをサポートしていない。
    D3DERR_OUTOFVIDEOMEMORY Direct3D が処理を行うのに十分なディスプレイ メモリがない。

    引用元: http://msdn.microsoft.com/ja-jp/library/cc324295.aspx

    CreateDevide を HRESULT で受けて、その中身を確認してみてください。
    ...
    HRESULT hr = g_pD3D->CreateDevice(...
    if (FAILED(hr)) {
        hr = g_pD3D->CreateDevice(...
        if (FAILED(hr)) {
            return E_FAIL;
        }
    }
    ...
    • 回答としてマーク sk7474 2009年5月1日 9:12
    2009年4月17日 9:49
  • 無事フルスクリーンを青表示できたのですが
    カーソルがずっと砂時計マークになっているのですが、これはなぜでしょうか?


    これだけでは何とも言えないのですが、まずは RegisterClassEx で何を渡しているかを調べてみましょう。
    ここで指定した hCursor がデフォルトのカーソルになります。
    • 回答としてマーク sk7474 2009年5月1日 9:11
    2009年4月20日 1:29

すべての返信

  • まずは失敗の原因を探ってみましょう。
    たぶん CreateDevice が失敗しているのだと思いますが、CreateDevice は失敗するとその原因を返してくれます。

    失敗した場合は、次のいずれかの値を返す。

    D3DERR_INVALIDCALL メソッドの呼び出しが無効である。たとえば、メソッドのパラメータに無効な値が設定されている場合などである。
    D3DERR_NOTAVAILABLE このデバイスは、問い合わせたテクニックをサポートしていない。
    D3DERR_OUTOFVIDEOMEMORY Direct3D が処理を行うのに十分なディスプレイ メモリがない。

    引用元: http://msdn.microsoft.com/ja-jp/library/cc324295.aspx

    CreateDevide を HRESULT で受けて、その中身を確認してみてください。
    ...
    HRESULT hr = g_pD3D->CreateDevice(...
    if (FAILED(hr)) {
        hr = g_pD3D->CreateDevice(...
        if (FAILED(hr)) {
            return E_FAIL;
        }
    }
    ...
    • 回答としてマーク sk7474 2009年5月1日 9:12
    2009年4月17日 9:49
  • アドバイスありがとうございます。
    値を調べた結果「D3DERR_INVALIDCALL」が返ってきていました。
    もう一度 d3dppにセットした値を確認すると
    バックバッファーに
    d3dpp.BackBufferFormat = D3DFMT_UNKNOWN;
    なんてものをセットしていました・・、ありがとうございます。


    無事フルスクリーンを青表示できたのですが
    カーソルがずっと砂時計マークになっているのですが、これはなぜでしょうか?
    普通にAlt+F4でウィンドウを閉じることができるので
    ループには入ってなさそうなのですが。

    2009年4月18日 1:30
  • 無事フルスクリーンを青表示できたのですが
    カーソルがずっと砂時計マークになっているのですが、これはなぜでしょうか?


    これだけでは何とも言えないのですが、まずは RegisterClassEx で何を渡しているかを調べてみましょう。
    ここで指定した hCursor がデフォルトのカーソルになります。
    • 回答としてマーク sk7474 2009年5月1日 9:11
    2009年4月20日 1:29
  • こんにちは。中川俊輔です。

    zakioさん、回答ありがとうございます。

    鉄さん、はじめまして。フォーラムのご利用ありがとうございます。
    その後いかがでしょうか?カーソルの問題はj解決しましたか?

    有用な情報と思われたため、勝手ながらzakioさんの回答へ回答マークをつけさせていただきました。
    また何か疑問がありましたら、是非フォーラムをご利用ください。

    それでは!
    マイクロソフト株式会社 フォーラム オペレータ 中川 俊輔
    2009年5月1日 9:15