/*
プロジェクトのプロパティ
[構成プロパティ]-[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);
}