#pragma comment(lib, "d3d9")
#include <Windows.h>
#include <d3d9.h>
#define SAFE_RELEASE(p) if(p){p->Release();p=NULL;}
struct CUSTOM_VTX {
float x, y, z, w;
DWORD color;
};
#define CUSTOM_FVF (D3DFVF_XYZRHW | D3DFVF_DIFFUSE)
// 外部変数
LPDIRECT3D9 pD3D;
LPDIRECT3DDEVICE9 pD3DDev;
// 関数プロトタイプ宣言
LRESULT CALLBACK WndProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam);
HWND InitWindow(HINSTANCE hInstance, int nCmdShow);
HRESULT InitD3D(HWND hWnd);
void Cleanup();
int WINAPI wWinMain(HINSTANCE hInstance, HINSTANCE, LPWSTR, int nCmdShow)
{
HWND hWnd = InitWindow(hInstance, nCmdShow);
if (!hWnd) return -1;
HRESULT hr = InitD3D(hWnd);
if (FAILED(hr)) {
Cleanup();
return -1;
}
ShowWindow(hWnd, nCmdShow);
CUSTOM_VTX vtx[] = {
{ 200, 200, 0, 1, 0xff0000ff },
{ 200, 0, 0, 1, 0xff00ff00 },
{ 400, 200, 0, 1, 0xffff0000 },
};
MSG msg = { 0 };
while (msg.message != WM_QUIT) {
if (PeekMessage(&msg, NULL, 0, 0, PM_REMOVE)) {
TranslateMessage(&msg);
DispatchMessage(&msg);
}
else {
pD3DDev->Clear(0, NULL, D3DCLEAR_TARGET, D3DCOLOR_XRGB(0, 0, 0), 1, 0);
pD3DDev->BeginScene();
pD3DDev->SetFVF(CUSTOM_FVF);
pD3DDev->DrawPrimitiveUP(D3DPT_TRIANGLELIST, 1, vtx, sizeof CUSTOM_VTX);
pD3DDev->EndScene();
pD3DDev->Present(NULL, NULL, NULL, NULL);
}
}
Cleanup();
return msg.wParam;
}
LRESULT CALLBACK WndProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam)
{
switch (msg) {
case WM_DESTROY:
PostQuitMessage(0);
return 0;
}
return DefWindowProc(hWnd, msg, wParam, lParam);
}
HWND InitWindow(HINSTANCE hInstance, int nCmdShow)
{
WNDCLASSEX wc = { sizeof WNDCLASSEX };
wc.style = CS_HREDRAW | CS_VREDRAW;
wc.lpfnWndProc = WndProc;
wc.hInstance = hInstance;
wc.hbrBackground = HBRUSH(COLOR_WINDOW + 1);
wc.lpszClassName = L"dx9sample1";
if (!RegisterClassEx(&wc)) return NULL;
DWORD deStyle = WS_OVERLAPPEDWINDOW ^ WS_MAXIMIZEBOX ^ WS_THICKFRAME;
RECT rc = { 0, 0, 400, 400 };
AdjustWindowRect(&rc, deStyle, FALSE);
HWND hWnd = CreateWindow(
wc.lpszClassName, L"dx9sample1", deStyle,
CW_USEDEFAULT, 0, rc.right - rc.left, rc.bottom - rc.top,
NULL, NULL, hInstance, NULL);
return hWnd;
}
HRESULT InitD3D(HWND hWnd)
{
HRESULT hr;
pD3D = Direct3DCreate9(D3D_SDK_VERSION);
if (!pD3D) return E_FAIL;
D3DPRESENT_PARAMETERS d3dpp = { 0 };
d3dpp.BackBufferFormat = D3DFMT_UNKNOWN;
d3dpp.MultiSampleType = D3DMULTISAMPLE_NONE;
d3dpp.SwapEffect = D3DSWAPEFFECT_DISCARD;
d3dpp.Windowed = TRUE;
d3dpp.AutoDepthStencilFormat = D3DFMT_UNKNOWN;
d3dpp.PresentationInterval = D3DPRESENT_INTERVAL_DEFAULT;
hr = pD3D->CreateDevice(
D3DADAPTER_DEFAULT,
D3DDEVTYPE_HAL,
hWnd,
D3DCREATE_HARDWARE_VERTEXPROCESSING,
&d3dpp,
&pD3DDev);
if (FAILED(hr)) return hr;
return S_OK;
}
void Cleanup()
{
SAFE_RELEASE(pD3DDev);
SAFE_RELEASE(pD3D);
}