2012年5月22日火曜日

【C++】DirectX初期化まで【次の二歩目】

前回の記事と見比べると、どの部分がDirectX初期化についてかよく分かると思います
http://aoisensi.blogspot.jp/2012/05/cdirectx_22.html


#pragma comment(lib, "d3d9.lib")

#include<windows.h>
#include<TCHAR.h>
#include<d3d9.h>

LPDIRECT3D9             g_pD3D = NULL;
LPDIRECT3DDEVICE9       g_pd3dDevice = NULL;
LPDIRECT3DVERTEXBUFFER9 g_pVB = NULL;


LRESULT CALLBACK WndProc( HWND, UINT, WPARAM, LPARAM );
void Render();
void Cleanup();
HRESULT InitD3D( HWND );

int WINAPI _tWinMain( HINSTANCE hInst, HINSTANCE hPrevInst, LPTSTR lpszCmdLine, int nShowCmd)
{
 HWND hWnd;
 MSG msg;
 WNDCLASS wc;
 
 
 
 //①ウィンドウクラスの定義・登録
 wc.style = CS_HREDRAW | CS_VREDRAW; //スタイル
 wc.lpfnWndProc = WndProc; //メッセージ処理関数
 wc.cbClsExtra = 0;
 wc.cbWndExtra = 0;
 wc.hInstance = hInst; //プログラムのハンドル
 wc.hIcon = NULL; //アイコン
 wc.hCursor = LoadCursor( NULL, IDC_ARROW ); //カーソル
 wc.hbrBackground = (HBRUSH)GetStockObject( WHITE_BRUSH ); //背景色
 wc.lpszMenuName = NULL; //メニュー
 wc.lpszClassName = _T("test"); //クラス名 
 if( !RegisterClass( &wc ) ) 
 {
  return 0;
 }

 //②ウィンドウの作成
 hWnd = CreateWindow( _T("test"), _T("Test"), WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, NULL, NULL, hInst, NULL );
 
 //③ウィンドウを表示

 if( SUCCEEDED( InitD3D( hWnd ) ) )
 {

  ShowWindow( hWnd, nShowCmd );
  UpdateWindow( hWnd );

 //④メインループ
  while( GetMessage( &msg, NULL, 0, 0 ) )
  {
   TranslateMessage( &msg );
   DispatchMessage( &msg );
  }
 }

 UnregisterClass( _T("D3D Tutorial"), wc.hInstance );

 return 0;
}

LRESULT CALLBACK WndProc( HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam )
{
 switch( msg )
 {
  case WM_DESTROY:
   Cleanup();
   PostQuitMessage( 0 );
   return 0;
  case WM_PAINT:
   Render();
   ValidateRect( hWnd, NULL );
   return 0;
  default:
   return( DefWindowProc( hWnd, msg, wParam, lParam) );
 }
}

void Render()
{
 if( NULL == g_pd3dDevice )
 {
  return;
 }
 g_pd3dDevice->Clear( 0, NULL, D3DCLEAR_TARGET, D3DCOLOR_XRGB(0x00, 0x00, 0xFF), 1.0f, 0 );

 if ( SUCCEEDED( g_pd3dDevice->BeginScene() ) )
 {
  g_pd3dDevice->EndScene();
 }

 g_pd3dDevice->Present( NULL, NULL, NULL, NULL );
}

void Cleanup()
{
 if( g_pd3dDevice != NULL)
 {
  g_pd3dDevice->Release();
 }

 if ( g_pD3D != NULL)
 { 
  g_pD3D->Release();
 }
}

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

 D3DPRESENT_PARAMETERS d3dpp;
 ZeroMemory( &d3dpp, sizeof(d3dpp) );
 d3dpp.Windowed = true;
 d3dpp.SwapEffect = D3DSWAPEFFECT_DISCARD;
 d3dpp.BackBufferFormat = D3DFMT_UNKNOWN;

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

メモ程度なので、コメントは残していません

0 件のコメント:

コメントを投稿