終了メニューを設定する

プログラムの終了メニューを設定します。

前田稔(Maeda Minoru)の超初心者のプログラム入門

プロジェクトの作成

  1. 三角形ポリゴンの描画プログラムに、プログラムの終了メニューを設定します。
    空の新規プロジェクト(Main)を作成して下さい。
    このページからソースコード(Main.cpp)を取得して、プロジェクトのフォルダーに格納して下さい。
    詳細は D3D で三角形を描画する を参照して下さい。
  2. プログラム終了のメニューを設定します。
    [プロジェクト][リソースの追加][Menu][新規作成] で、親のメニュー「ファイル(&F)」を作成して下さい。
    [ファイル(&F)]の下の[ここへ入力]に「アプリケーションの終了(&X)」とタイプします。
    「アプリケーションの終了(&X)」を右クリックしてプロパティを選びます。
    キャプションに「アプリケーションの終了(&X)」を、ID に IDM_EXIT をタイプしてウインドウを閉じます。
    メニューの ID は次のようになります。
    メニュー IDR_MENU1(規定値)
    ファイル(&F)
    アプリケーションの終了(&X) IDM_EXIT
  3. リソースを登録するとプロジェクトのフォルダーに Main.rc と resource.h が作成されます。
    Main.rc の Main はプロジェクトの名前です。
    resource.h を #include して下さい。
        #include    "resource.h"
        

プログラムの作成

  1. Main.cpp の全ソースコードです。
    /*********************************************/
    /*  DirectX9  メニューを設定する    前田 稔  */
    /*********************************************/
    #define     NAME        "DirectX9 Graphics"
    #define     TITLE       "DirectX9 Tutorial"
    #include    <d3d9.h>
    #include    <d3dx9.h>
    #include    "resource.h"
    
    #pragma     once
    #pragma     comment(lib,"d3d9.lib")
    #pragma     comment(lib,"d3dx9.lib")
    #pragma     comment(lib,"dxguid.lib")
    #define     SAFE_RELEASE(p) { if (p) { (p)->Release(); (p)=NULL; } }
    
    //DirectXオブジェクト
    LPDIRECT3D9             g_pD3D= NULL;
    LPDIRECT3DDEVICE9       g_pDEV= NULL;
    
    //頂点フォーマット
    #define D3DFVF_VERTEX  (D3DFVF_XYZRHW | D3DFVF_DIFFUSE)
    typedef struct
    {   float x,y,z;
        float rhw;
        DWORD color;
    }   D3DVERTEX;
    
    D3DVERTEX v[3]=
    { {  300.0f, 100.0f, 0.0f, 1.0f, 0xffff0000  },     //頂点=赤
      {  450.0f, 250.0f, 0.0f, 1.0f, 0xff00ff00  },     //右辺=緑
      {  150.0f, 250.0f, 0.0f, 1.0f, 0xff0000ff  },     //左辺=青
    };
    
    //Function Prototype
    LRESULT CALLBACK MsgProc(HWND hWnd,UINT msg,UINT wParam,LONG lParam);
    
    HRESULT Init3DDev(HWND hWnd)
    {   HRESULT                 hr;
        D3DPRESENT_PARAMETERS   d3dpp;
    
        // デバイス/モード等の初期化
        g_pD3D = Direct3DCreate9(D3D_SDK_VERSION);
        if (g_pD3D==NULL)   return E_FAIL;
    
        // D3DDeviceオブジェクトの作成
        ZeroMemory(&d3dpp, sizeof(d3dpp));
        d3dpp.BackBufferFormat            = D3DFMT_UNKNOWN;
        d3dpp.BackBufferCount             = 1;
        d3dpp.MultiSampleType             = D3DMULTISAMPLE_NONE;
        d3dpp.SwapEffect                  = D3DSWAPEFFECT_DISCARD;
        d3dpp.hDeviceWindow               = hWnd;
        d3dpp.Windowed                    = TRUE;
        d3dpp.EnableAutoDepthStencil      = FALSE;
        d3dpp.AutoDepthStencilFormat      = D3DFMT_UNKNOWN;
        d3dpp.PresentationInterval        = D3DPRESENT_INTERVAL_IMMEDIATE;
    
        hr = g_pD3D->CreateDevice(D3DADAPTER_DEFAULT, D3DDEVTYPE_HAL, hWnd,
                     D3DCREATE_HARDWARE_VERTEXPROCESSING, &d3dpp, &g_pDEV);
        if (FAILED(hr))
        {   hr = g_pD3D->CreateDevice(D3DADAPTER_DEFAULT, D3DDEVTYPE_REF, hWnd,
                         D3DCREATE_SOFTWARE_VERTEXPROCESSING, &d3dpp, &g_pDEV);
            if (FAILED(hr))
            {  MessageBox(NULL,"Create Device Error","Surface Error",MB_OK); return E_FAIL;  }
        }
        return S_OK;
    }
    
    //終了の処理
    void Cleanup(void)
    {   SAFE_RELEASE(g_pDEV);
        SAFE_RELEASE(g_pD3D);
    }
    
    //描画処理
    void Draw(void)
    {   g_pDEV->Clear(0,NULL,D3DCLEAR_TARGET,D3DCOLOR_XRGB(0,0,0),1.0,0);
        if (SUCCEEDED(g_pDEV->BeginScene()))
        {   g_pDEV->SetFVF(D3DFVF_VERTEX);
            g_pDEV->DrawPrimitiveUP(D3DPT_TRIANGLELIST,1,v,sizeof(D3DVERTEX));
            g_pDEV->EndScene();
        }
        g_pDEV->Present(NULL,NULL,NULL,NULL);
    }
    
    //ウィンドウ処理
    LRESULT WINAPI MsgProc(HWND hWnd,UINT msg,WPARAM wParam,LPARAM lParam)
    {
        switch(msg)
        {   case WM_PAINT:
                Draw();
                break;
            case WM_KEYDOWN:
                switch(wParam)
                {   case VK_ESCAPE:
                    case VK_F12:
                        PostMessage(hWnd,WM_CLOSE,0,0);
                        return 0L;
                }
                break;
            case WM_COMMAND:
                switch(LOWORD(wParam))
                {   case IDM_EXIT:
                        PostMessage(hWnd,WM_CLOSE,0,0);
                        return 0L;
                    default:
                        return DefWindowProc(hWnd, msg, wParam, lParam);
                }
                break;
            case WM_DESTROY:
                PostQuitMessage(0);
                return 0L;
        }
        return DefWindowProc(hWnd,msg,wParam,lParam);
    }
    
    //★Win Main
    INT WINAPI WinMain(HINSTANCE hInst, HINSTANCE, LPSTR, INT)
    {   MSG     msg;
    
        WNDCLASSEX wc = { sizeof(WNDCLASSEX),CS_CLASSDC,MsgProc,0L,0L,hInst,
                          NULL,NULL,NULL,MAKEINTRESOURCE(IDR_MENU1),NAME,NULL };
        if (RegisterClassEx(&wc)==0)    return FALSE;
        HWND hWnd = CreateWindowEx(0,NAME,TITLE,WS_OVERLAPPEDWINDOW,
                            CW_USEDEFAULT,CW_USEDEFAULT,CW_USEDEFAULT,CW_USEDEFAULT,
                            NULL,NULL,hInst,NULL);
        // Initialize Direct3D
        if (FAILED(Init3DDev(hWnd)))    return FALSE;
    
        ShowWindow(hWnd,SW_SHOWDEFAULT);
        UpdateWindow(hWnd);
        ZeroMemory(&msg,sizeof(msg));
        while(msg.message!=WM_QUIT)
        {   if (PeekMessage(&msg,NULL,0U,0U,PM_REMOVE))
            {   TranslateMessage(&msg);
                DispatchMessage(&msg);
            }
        }
        Cleanup();
        UnregisterClass(NAME,wc.hInstance);
        return 0;
    }
    
  2. WM_COMMAND: でメニューを検出します。
    IDM_EXIT: が選択されたとき、PostMessage(hWnd,WM_CLOSE,0,0); でプログラムを終了します。
    三角形ポリゴンの描画は D3D で三角形を描画する を参照して下さい。
            case WM_COMMAND:
                switch(LOWORD(wParam))
                {   case IDM_EXIT:
                        PostMessage(hWnd,WM_CLOSE,0,0);
                        return 0L;
                    default:
                        return DefWindowProc(hWnd, msg, wParam, lParam);
                }
                break;
        

超初心者のプログラム入門(DirectX9 game program)

超初心者のプログラム入門(DirectX10 game program)