開発環境 Microsoft Visual Studio Community 2019
実行環境 Microsoft Windows 10 Home (64bit)
プロジェクト テンプレート C++ 空のプロジェクト
プロジェクト名 dx9sample1



プロジェクト構成プロパティ
リンカ―/システム/サブシステム Windows (/SUBSYSTEM:WINDOWS)

dx9sample1.cpp
#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);
}
 
最終更新:2020年06月30日 11:12
添付ファイル