開発環境 Microsoft Visual C++ 2010 Express (SP1)
実行環境 Microsoft Windows XP Home Edition (SP3)
プロジェクトの種類 Win32 プロジェクト
プロジェクト名 dxbase2
アプリケーションの種類 Windows アプリケーション
追加のオプション 空のプロジェクト
文字セット Unicode

Microsoft DirectX SDK (February 2010)
必要な時しか再描画しない。

参考

dxbase2.cpp
/*
プロジェクトのプロパティ
[構成プロパティ]-[VC++ ディレクトリ]
[インクルード ディレクトリ]
C:\Program Files\Microsoft DirectX SDK (February 2010)\Include
[ライブラリ ディレクトリ]
C:\Program Files\Microsoft DirectX SDK (February 2010)\Lib\x86
 
Unicode
*/
#pragma comment(lib, "d3d9.lib")
#pragma comment(lib, "d3dx9.lib")
 
#include <d3d9.h>
#include <d3dx9.h>
#include <stdio.h>
 
#define WIDTH(rect) ((rect).right - (rect).left)
#define HEIGHT(rect) ((rect).bottom - (rect).top)
#define SAFE_RELEASE(p) { if(p) { (p)->Release(); (p)=NULL; } }
 
#define APP_NAME L"dxbase2"
 
// 関数プロトタイプ宣言
HRESULT InitD3D(HWND hWnd);
 
LRESULT CALLBACK WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam);
void Cleanup(void);
void Render(void);
 
// 外部変数
LPDIRECT3D9 g_pD3D;		// Direct3D9
LPDIRECT3DDEVICE9 g_pd3dDev;	// レンダリングデバイス
LPD3DXFONT g_pFont;		// フォント
 
//==============================================================================
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE, LPSTR, int nCmdShow)
{
	// ウィンドウクラスの登録
	WNDCLASSEX wcx;
	ZeroMemory(&wcx, sizeof wcx);
	wcx.cbSize		= sizeof wcx;
	wcx.style		= CS_CLASSDC;
	wcx.lpfnWndProc		= WndProc;
	wcx.hInstance		= hInstance;
	wcx.hCursor		= LoadCursor(NULL, MAKEINTRESOURCE(IDC_ARROW));
	wcx.lpszClassName	= APP_NAME;
	if (RegisterClassEx(&wcx) == 0) {
		return 0;
	}
 
	// ウィンドウサイズの計算
	RECT rect;
	SetRect(&rect, 0, 0, 640, 480);
	AdjustWindowRect(&rect, WS_OVERLAPPEDWINDOW, FALSE);
 
	// ウィンドウの作成
	HWND hWnd = CreateWindow(
		APP_NAME, APP_NAME,
		WS_OVERLAPPEDWINDOW,
		CW_USEDEFAULT, 0,
		WIDTH(rect), HEIGHT(rect),
		NULL, NULL, hInstance, NULL);
	if (hWnd == NULL) {
		return 0;
	}
 
	// Direct3D初期化
	if (FAILED(InitD3D(hWnd))) {
		return 0;
	}
 
	// ウィンドウ表示
	ShowWindow(hWnd, nCmdShow);
	UpdateWindow(hWnd);
 
	// メッセージループ
	MSG msg;
	while (GetMessage(&msg, NULL, 0, 0)) {
		TranslateMessage(&msg);
		DispatchMessage(&msg);
	}
	UnregisterClass(APP_NAME, hInstance);
	return msg.wParam;
}
 
//------------------------------------------------------------------------------
HRESULT InitD3D(HWND hWnd)
{
	// Direct3D
	g_pD3D = Direct3DCreate9(D3D_SDK_VERSION);
	if (g_pD3D == NULL) {
		return E_FAIL;
	}
 
	// デバイス生成用のパラメタ
	D3DPRESENT_PARAMETERS d3dpp;
	ZeroMemory(&d3dpp, sizeof d3dpp);
	d3dpp.BackBufferFormat		= D3DFMT_UNKNOWN;		// モニタの設定と同じ
	d3dpp.BackBufferCount		= 1;				// バックバッファの数
	d3dpp.MultiSampleType		= D3DMULTISAMPLE_NONE;		// マルチサンプリングしない
	d3dpp.SwapEffect		= D3DSWAPEFFECT_DISCARD;	// Direct3Dに任せる
	d3dpp.hDeviceWindow		= hWnd;				// カバーウィンドウ
	d3dpp.Windowed			= TRUE;				// ウィンドウモード
	d3dpp.EnableAutoDepthStencil	= TRUE;				// 深度バッファ自動管理
	d3dpp.AutoDepthStencilFormat	= D3DFMT_D16;			// 深度バッファフォーマット
	d3dpp.PresentationInterval	= D3DPRESENT_INTERVAL_DEFAULT;	// モニタの垂直回帰を待つ
 
	// Direct3Dデバイスの生成
	HRESULT hr = g_pD3D->CreateDevice(D3DADAPTER_DEFAULT, D3DDEVTYPE_HAL,
		hWnd, D3DCREATE_HARDWARE_VERTEXPROCESSING, &d3dpp, &g_pd3dDev);
 
	if (SUCCEEDED(hr)) {
		hr = D3DXCreateFont(g_pd3dDev, 40, 0, FW_HEAVY, 1, FALSE,
			SHIFTJIS_CHARSET, OUT_TT_ONLY_PRECIS, ANTIALIASED_QUALITY,
			FF_DONTCARE, L"MS Pゴシック", &g_pFont);
	}
	return hr;
}
 
//==============================================================================
LRESULT CALLBACK WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
	switch (uMsg) {
	case WM_PAINT:
		Render();
		ValidateRect(hWnd, NULL);
		return 0;
	case WM_SIZE:
		InvalidateRect(hWnd, NULL, TRUE);
		return 0;
	case WM_DESTROY:
		Cleanup();
		PostQuitMessage(0);
		return 0;
	}
	return DefWindowProc(hWnd, uMsg, wParam, lParam);
}
 
//------------------------------------------------------------------------------
void Cleanup(void)
{
	SAFE_RELEASE(g_pFont);
	SAFE_RELEASE(g_pd3dDev);
	SAFE_RELEASE(g_pD3D);
}
 
//------------------------------------------------------------------------------
void Render(void)
{
	static int frame = 0;
 
	if (g_pd3dDev == NULL) return;
 
	// バックバッファのクリア
	g_pd3dDev->Clear(0, NULL, D3DCLEAR_TARGET, D3DCOLOR_XRGB(0x7f,0x7f,0xff), 1.0f, 0);
	g_pd3dDev->BeginScene();
 
	RECT rect;
	TCHAR szBuf[16];
	SetRect(&rect, 0, 0, 50, 20);
	swprintf_s(szBuf, L"frame=%d", frame++);
	g_pFont->DrawText(NULL, szBuf, -1, &rect, DT_LEFT | DT_NOCLIP,
		D3DCOLOR_ARGB(0xff,0xff,0xff,0xff));
 
	// バックバッファを表画面に反映
	g_pd3dDev->EndScene();
	g_pd3dDev->Present(NULL, NULL, NULL, NULL);
}
 
最終更新:2012年11月26日 07:59