/*------------------------------------------------------------
DirectX Graphics サンプルプログラム
2007 Copyright(C) Toru
ToruのDirectXプログラミング講座
URL : http://toruweb.web.fc2.com/
Mail : toru_website@hotmail.com
--------------------------------------------------------------*/
#define STRICT
// インクルード
#include
#include
#include
#include
// インターフェイス解放
#define RELEASE(x) if(x){x->Release();x=NULL;}
// アプリケーション情報
HINSTANCE g_hInst;
HWND g_hWnd;
char g_szAppName[] = "DirectX Graphics Sample";
UINT g_uWidth = 320; // ウインドウサイズ・幅
UINT g_uHeight = 240; // ウインドウサイズ・高さ
// DirectX9 Graphicsの変数
LPDIRECT3D9 g_lpD3D = NULL;
LPDIRECT3DDEVICE9 g_lpD3DDevice = NULL;
LPDIRECT3DSURFACE9 g_lpBackBuffer = NULL;
LPDIRECT3DSURFACE9 g_lpSurface = NULL;
// メッセージ関数の定義
LRESULT CALLBACK MainWndProc( HWND hWnd, UINT msg, UINT wParam, LONG lParam );
// アプリケーションの初期化
BOOL InitApp( HINSTANCE hInst, INT nCmdShow )
{
// インスタンスハンドル保存
g_hInst = hInst;
// ウインドウクラスの登録
WNDCLASS wc;
ZeroMemory( &wc, sizeof(wc) );
wc.hCursor = LoadCursor( NULL, IDC_ARROW );
wc.lpszClassName = "Main Window";
wc.hbrBackground = (HBRUSH)GetStockObject( WHITE_BRUSH );
wc.hInstance = hInst;
wc.style = CS_BYTEALIGNCLIENT | CS_VREDRAW|CS_HREDRAW;
wc.lpfnWndProc = (WNDPROC)MainWndProc;
if( ! RegisterClass(&wc) )
{
DXTRACE_MSG( "ウインドウクラスの登録に失敗" );
return FALSE;
}
// メインウインドウの作成
g_hWnd = CreateWindowEx( 0, "Main Window", g_szAppName,
WS_OVERLAPPED | WS_SYSMENU | WS_CAPTION,
CW_USEDEFAULT, CW_USEDEFAULT, g_uWidth, g_uHeight,
(HWND)NULL, (HMENU)NULL, hInst, (LPSTR)NULL);
if( g_hWnd == NULL )
{
DXTRACE_MSG( "メインウインドウ作成に失敗" );
return FALSE;
}
// メインウインドウの表示
ShowWindow( g_hWnd, nCmdShow );
UpdateWindow( g_hWnd );
return TRUE;
}
// DirectXGraphicsの初期化
BOOL InitDXGraphics()
{
HRESULT hr;
// Direct3Dオブジェクトの作成
g_lpD3D = Direct3DCreate9( D3D_SDK_VERSION );
if( g_lpD3D == NULL ) return FALSE;
D3DPRESENT_PARAMETERS param;
ZeroMemory( ¶m, sizeof(param) );
param.BackBufferWidth = g_uWidth; // 解像度・幅
param.BackBufferHeight = g_uHeight; // 解像度・高さ
param.BackBufferFormat = D3DFMT_UNKNOWN; // ピクセルフォーマット(ウインドウモード時は「D3DFMT_UNKNOWN」もしくは調べる)
param.BackBufferCount = 1; // バックバッファ1つ
param.SwapEffect = D3DSWAPEFFECT_DISCARD;// バックバッファを表示する方法
param.Windowed = TRUE; // ウインドウモード
// 現在のピクセルフォーマットを取得,設定
/* D3DDISPLAYMODE mode;
hr = g_lpD3D->GetAdapterDisplayMode( D3DADAPTER_DEFAULT, &mode );
if( FAILED(hr)) return FALSE;
param.BackBufferFormat = mode.Format; // ピクセルフォーマット
*/
// デバイスの作成
hr = g_lpD3D->CreateDevice( D3DADAPTER_DEFAULT, // プライマリディスプレイアダプタ
D3DDEVTYPE_HAL, // HALを利用
g_hWnd, // ウインドウハンドル
D3DCREATE_SOFTWARE_VERTEXPROCESSING,// ソフトウェアによる頂点処理
¶m, // パラメータ
&g_lpD3DDevice ); //
if( FAILED(hr)) return FALSE;
// バックバッファを取得
hr = g_lpD3DDevice->GetBackBuffer( 0, 0, D3DBACKBUFFER_TYPE_MONO, &g_lpBackBuffer );
if( FAILED(hr) ) return FALSE;
// バックバッファの状態を取得
D3DSURFACE_DESC desc;
g_lpBackBuffer->GetDesc( &desc );
// 画像ファイルの情報を取得
LPCSTR szFileName = "bg.jpg";
D3DXIMAGE_INFO ImageInfo;
::ZeroMemory( &ImageInfo, sizeof(ImageInfo) );
hr = D3DXGetImageInfoFromFile( szFileName, &ImageInfo );
if( FAILED(hr) ) return FALSE;
// 画像ファイル読み込み(オフスクリーンサーフェースの作成)
hr = g_lpD3DDevice->CreateOffscreenPlainSurface( ImageInfo.Width, ImageInfo.Height, desc.Format, D3DPOOL_DEFAULT, &g_lpSurface, NULL );
if( FAILED(hr) ) return FALSE;
hr = D3DXLoadSurfaceFromFile( g_lpSurface, NULL, NULL, szFileName, NULL, D3DX_DEFAULT, 0, NULL );
if( FAILED(hr) ) return FALSE;
return TRUE;
}
BOOL ReleaseDXGraphics()
{
// 解放
RELEASE( g_lpSurface );
RELEASE( g_lpBackBuffer );
RELEASE( g_lpD3DDevice );
RELEASE( g_lpD3D );
return TRUE;
}
// 終了の処理
BOOL EndApp()
{
return TRUE;
}
// 描画処理
BOOL Draw()
{
if( ! g_lpD3D ) return FALSE;
if( ! g_lpD3DDevice ) return FALSE;
// バックバッファをクリア
g_lpD3DDevice->Clear( 0, NULL, D3DCLEAR_TARGET, D3DCOLOR_XRGB(0,0,0), 0, 0 );
// バックバッファへ描画
RECT SrcRect,DestRect;
SetRect( &SrcRect, 0, 0, g_uWidth, g_uHeight );
SetRect( &DestRect, 0, 0, g_uWidth, g_uHeight );
g_lpD3DDevice->StretchRect( g_lpSurface, &SrcRect, g_lpBackBuffer, &DestRect, D3DTEXF_NONE );
// バックバッファを表示
g_lpD3DDevice->Present( NULL, NULL, NULL,NULL );
return TRUE;
}
// ウィンドウ処理
LRESULT CALLBACK MainWndProc( HWND hWnd, UINT msg, UINT wParam, LONG lParam )
{
switch( msg )
{
case WM_PAINT:
Draw();
break;
case WM_DESTROY:
PostQuitMessage(0);
break;
default:
return DefWindowProc( hWnd, msg, wParam, lParam );
}
return 0L;
}
// メイン
int WINAPI WinMain( HINSTANCE hInst, HINSTANCE hPrevInst, LPSTR lpCmdLine, int nCmdShow )
{
MSG msg;
// アプリケーションの初期化
if( InitApp( hInst, nCmdShow ) )
{
// DirectXGraphicsの初期化
if( InitDXGraphics() )
{
// メッセージループ
while( GetMessage( &msg, 0, 0, 0 ) )
{
if( msg.message == WM_QUIT ) break;
TranslateMessage( &msg );
DispatchMessage( &msg );
}
}
}
// DirectXGraphicsの終了処理
ReleaseDXGraphics();
// アプリケーションの終了処理
EndApp();
return msg.wParam;
}
- Last Update 2007/1/21
- Copyright © 2002-2007 Toru. All Rights Reserved.
- toru_website@hotmail.com