Welcome to collectivesolver - Programming & Software Q&A with code examples. A website with trusted programming answers. All programs are tested and work.

Contact: aviboots(AT)netvision.net.il

Buy a domain name - Register cheap domain names from $0.99 - Namecheap

Scalable Hosting That Grows With You

Secure & Reliable Web Hosting, Free Domain, Free SSL, 1-Click WordPress Install, Expert 24/7 Support

Semrush - keyword research tool

Boost your online presence with premium web hosting and servers

Disclosure: My content contains affiliate links.

39,950 questions

51,892 answers

573 users

How to initialize Direct3D11 with C++ Win32 API

3 Answers

0 votes
#include <windows.h>
#include <d3d11.h>

ID3D11Device* m_device = nullptr;
IDXGISwapChain* m_swapChain = nullptr;
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);
}


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);

	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);
}






/*
run:


*/



answered Mar 22, 2023 by avibootz
edited Mar 23, 2023 by avibootz
0 votes
// 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);
}

 



answered Mar 27, 2023 by avibootz
edited Mar 27, 2023 by avibootz
0 votes
#include <windows.h>
#include <d3d11.h>

static IDXGISwapChain* swapchain = nullptr;
static ID3D11Device* dev = nullptr;
static ID3D11DeviceContext* devcon = nullptr;

void InitD3D11(HWND hWnd) {
	// create a struct for swap chain
	DXGI_SWAP_CHAIN_DESC scd;

	// clear struct 
	ZeroMemory(&scd, sizeof(DXGI_SWAP_CHAIN_DESC));

	// fill the swap chain struct
	scd.BufferCount = 1;                                    // one back buffer
	scd.BufferDesc.Format = DXGI_FORMAT_R8G8B8A8_UNORM;     // 32-bit color
	scd.BufferUsage = DXGI_USAGE_RENDER_TARGET_OUTPUT;      
	scd.OutputWindow = hWnd;                                
	scd.SampleDesc.Count = 4;                               // 4 multisamples
	scd.Windowed = TRUE;                                    

	auto result = D3D11CreateDeviceAndSwapChain(
		NULL,
		D3D_DRIVER_TYPE_HARDWARE,
		NULL,
		NULL,
		NULL,
		NULL,
		D3D11_SDK_VERSION,
		&scd,
		&swapchain,
		&dev,
		NULL,
		&devcon);

	if (result != S_OK) {
		MessageBox(nullptr, L"Error creating D3D11CreateDeviceAndSwapChain", L"Error", MB_OK);
		exit(0);
	}
}

void CleanD3D11() {
    swapchain->Release();
    dev->Release();
    devcon->Release();
}

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;

	InitD3D11(hWnd);
	CleanD3D11();

	while ((result = GetMessage(&msg, NULL, 0, 0))) {
		TranslateMessage(&msg);
		DispatchMessage(&msg);
	}

	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);
}





/*
run:


*/

 



answered Aug 12, 2023 by avibootz
...