// WinMain.cpp
#include <windows.h>
#include "Render.h"
LRESULT CALLBACK WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam);
int CALLBACK WinMain(
HINSTANCE hInstance,
HINSTANCE hPrevInstance,
LPSTR lpCmdLine,
int nCmdShow) {
const wchar_t szClassName[] = L"directx11";
WNDCLASSEX wc = { };
wc.cbSize = sizeof(wc);
wc.style = CS_OWNDC;
wc.lpfnWndProc = WndProc;
wc.hInstance = hInstance;
wc.lpszClassName = szClassName;
if (!RegisterClassEx(&wc)) {
MessageBox(NULL, L"RegisterClassEx Error", L"Title", MB_ICONEXCLAMATION | MB_OK);
return 1;
}
HWND hWnd = CreateWindowEx(
0, szClassName, L"Window Name",
WS_CAPTION | WS_MAXIMIZEBOX | WS_SYSMENU | WS_MINIMIZEBOX,
300, 300, 640, 480,
NULL, NULL, hInstance, NULL);
if (!hWnd) {
MessageBox(NULL, L"hWnd Error", L"Title", MB_ICONEXCLAMATION | MB_OK);
return 1;
}
ShowWindow(hWnd, SW_SHOW);
UpdateWindow(hWnd);
MSG msg = { 0 };
BOOL result;
Renderer(hWnd);
DXGI_SWAP_CHAIN_DESC swapChainDesc = { 0 };
while ((result = GetMessage(&msg, NULL, 0, 0))) {
TranslateMessage(&msg);
DispatchMessage(&msg);
BeginFrame();
EndFrame();
}
if (result == -1)
return -1;
return (int)msg.wParam;
}
LRESULT CALLBACK WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam) {
switch (uMsg) {
case WM_CLOSE: {
PostQuitMessage(0);
break;
}
default: {
//OutputDebugStringA("default\n");
break;
}
}
return DefWindowProc(hWnd, uMsg, wParam, lParam);
}
// Render.h
#pragma once
#include <d3d11.h>
void CreateDeviceAndSwapChain(HWND hWnd);
void CreateRenderTarget();
void Renderer(HWND hWnd);
void BeginFrame();
void EndFrame();
ID3D11Device* getDevice();
// Render.cpp
#include "Render.h"
ID3D11Device* m_device = nullptr;
IDXGISwapChain* m_swapChain = nullptr;
D3D11_TEXTURE2D_DESC m_backBufferDesc;
ID3D11DeviceContext* m_deviceContext = nullptr;
ID3D11RenderTargetView* m_renderTargetView = nullptr;
void CreateDeviceAndSwapChain(HWND hWnd) {
DXGI_SWAP_CHAIN_DESC swapChainDesc = { 0 };
swapChainDesc.BufferCount = 1;
swapChainDesc.BufferDesc.Format = DXGI_FORMAT_R8G8B8A8_UNORM;
swapChainDesc.BufferUsage = DXGI_USAGE_RENDER_TARGET_OUTPUT;
swapChainDesc.OutputWindow = hWnd;
swapChainDesc.SampleDesc.Count = 1;
swapChainDesc.Windowed = true;
auto result = D3D11CreateDeviceAndSwapChain(
nullptr, D3D_DRIVER_TYPE_HARDWARE, nullptr, 0,
nullptr, 0, D3D11_SDK_VERSION,
&swapChainDesc, &m_swapChain,
&m_device, nullptr, &m_deviceContext);
if (result != S_OK) {
MessageBox(nullptr, L"Error creating DirectX 11", L"Error", MB_OK);
exit(0);
}
}
void CreateRenderTarget() {
ID3D11Texture2D* backBuffer = nullptr;
m_swapChain->GetBuffer(0, __uuidof(ID3D11Texture2D), (void**)&backBuffer);
m_device->CreateRenderTargetView(backBuffer, nullptr, &m_renderTargetView);
backBuffer->Release();
}
void Renderer(HWND hWnd) {
CreateDeviceAndSwapChain(hWnd);
CreateRenderTarget();
}
void BeginFrame() {
m_deviceContext->OMSetRenderTargets(1, &m_renderTargetView, nullptr);
// background color
float color[] = { .15f, .35f, 0.5, 1 };
m_deviceContext->ClearRenderTargetView(m_renderTargetView, color);
}
void EndFrame() {
m_swapChain->Present(1, 0);
}