ページ 11

DirectXのウィンドウ切り替え

Posted: 2010年6月15日(火) 15:37
by 夏天
[1] 質問文
現在DirectX SDK 2010(Feb)を使ってゲームプログラムを書いているのですが、
Alt+Enterで画面モードを切り替えるというものを作っています。
ですが画面モード自体は切り替えることはできたのですが、
切り替えた後クライアントエリアが真っ白になってしまいます。
いろいろ調べまわった結果、デバイスを作り直すというものを見つけたのですが、
内容がまったくわからない状態です。

 [1.1] やりたいこと:画面モードの切り替え
 [1.2] ソースコード:添付ファイルを参照
 [1.3] 躓いているところ:切り替え後、再描画されず画面が真っ白
 [1.4] 知りたいところ:画面モードの切り替え方法、デバイスの再構築

[2] 環境  
 [2.1] OS : WindowsXP SP2
 [2.2] コンパイラ名 : VS2008
[3] その他
 ・習熟度:高校3年間C言語で簡単なコンソールプログラムを作っていた程度
 ・DirectX SDK (February 2010)を使用しています

Re:DirectXのウィンドウ切り替え

Posted: 2010年6月15日(火) 17:29
by fr
あ、すみませんデバイスロストと混同してました。
フルスクリーンとの切替はデバイスの初期化だけでいいです。 画像

Re:DirectXのウィンドウ切り替え

Posted: 2010年6月15日(火) 17:41
by toyo
まずdirextx.cppのInit3D( )関数内の
D3DPRESENT_PARAMETERS   d3dpp;
をグローバル変数にします
また同関数内で
    d3dpp.BackBufferWidth    = 800;
    d3dpp.BackBufferHeight    = 600;
のように全画面時の解像度を指定しておきます

画面モード変更時にすること
1. draw.cppのInitialize( )関数で確保した頂点バッファg_pVBを開放
    RELEASE(g_pVB);
または
    Close(NULL);
2. d3dpp.Windowedを反転
    d3dpp.Windowed = !d3dpp.Windowed;
3. デバイスを変更したウィンドウモードでリセット
    g_pD3DDev->Reset(&d3dpp);
4. 頂点バッファを作成しなおす
    Initialize(g_pD3DDev);
になります

Re:DirectXのウィンドウ切り替え

Posted: 2010年6月15日(火) 23:12
by 夏天
すばやい解答ありがとうございます

>>fr様
デバイス再構築をせずに初期化だけでよかったのですね^^;
今後気をつけます><

>>toyo様
なんとか自分の求めていた結果になりました
ありがとうございます!

一応ChangeMode関数を貼っておきます
void ChangeMode(HWND hwnd)
{
    DEVMODE dv;
    Close(NULL);
    d3dpp.Windowed = !d3dpp.Windowed;
    g_bWindowMode = !g_bWindowMode;
    ShowCursor(g_bWindowMode);

    if (g_bWindowMode) {
        ShowWindow(hwnd, SW_HIDE);
        
        ChangeDisplaySettings(NULL, 0);

        SetWindowLongPtr(hwnd, GWL_STYLE, g_dwWindowStyle);
        SetWindowPos(hwnd, HWND_NOTOPMOST, g_rcWindow.left, g_rcWindow.top, g_rcWindow.right - g_rcWindow.left, g_rcWindow.bottom - g_rcWindow.top, 0);    
    }
    else {
        GetWindowRect(hwnd, &g_rcWindow);

        SetWindowLongPtr(hwnd, GWL_STYLE, WS_POPUP);
        SetWindowPos(hwnd, HWND_TOPMOST, 0, 0, g_cxClient, g_cyClient, 0);
        
        dv.dmSize       = sizeof(DEVMODE);
        dv.dmFields     = DM_PELSWIDTH | DM_PELSHEIGHT;
        dv.dmPelsWidth  = g_cxClient;
        dv.dmPelsHeight = g_cyClient;
        ChangeDisplaySettings(&dv, CDS_FULLSCREEN);
    }
    g_pD3DDev->Reset(&d3dpp);
    Initialize(g_pD3DDev);

    SetWindowPos(hwnd, NULL, 0, 0, 0, 0, SWP_NOMOVE | SWP_NOSIZE | SWP_NOZORDER | SWP_FRAMECHANGED);
    
    ShowWindow(hwnd, SW_SHOW);
}