GGym's Practice Notes

DirectX 쓰기 전 WinAPI 준비 본문

DirectX

DirectX 쓰기 전 WinAPI 준비

GGym_ 2020. 8. 12. 03:50

Device 생성 (헤더파일, cpp파일)

Device.h

#pragma once

// Function
void InitWindow(HINSTANCE hInstance, int nCmdShow);
void Destroy();
WPARAM Running();
LRESULT CALLBACK WndProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam);

// Scene
void InitScene();
void DestroyScene();
void Update();
void Render();

Device.cpp

#include "stdafx.h"
#include "Device.h"

int APIENTRY WinMain
(
	HINSTANCE hInstance,
	HINSTANCE prevInstance,
	LPSTR lPCmdLine,
	int nCmdShow
){
	InitWindow(hInstance, nCmdShow);	// 윈도우 초기화

	Running();
	Destroy();

	return 0;
}

// extern 전역 변수
UINT Width = 800;
UINT Height = 600;

HWND Hwnd = NULL;
wstring Title = L"D2D";

IDXGISwapChain* SwapChain = NULL;
ID3D11Device* Device = NULL;
ID3D11DeviceContext* DeviceContext = NULL;
ID3D11RenderTargetView* RTV = NULL;

void InitWindow(HINSTANCE hInstance, int nCmdShow) {
	// Register Wnd Class
	{
		WNDCLASSEX wc; // 윈도우 클래스 생성
		wc.cbSize = sizeof(WNDCLASSEX);
		wc.style = CS_HREDRAW | CS_VREDRAW; // 수직, 수평크기 변할시 다시 그림
		wc.lpfnWndProc = WndProc; // 윈도우 메세지 처리함수 지정
		wc.cbClsExtra = NULL; // 예약 영역
		wc.cbWndExtra = NULL;
		wc.hInstance = hInstance; // 응용 프로그램 인스턴스
		wc.hIcon = LoadIcon(NULL, IDI_APPLICATION); // 최소화 되었을때 출력될 아이콘
		wc.hCursor = LoadCursor(NULL, IDC_ARROW); // 사용할 마우스 커서
		wc.hbrBackground = static_cast<HBRUSH>(WHITE_BRUSH); // 배경색상 브러시 지정
		wc.lpszMenuName = NULL; // 프로그램이 사용할 메뉴 지정
		wc.lpszClassName = Title.c_str(); //윈도우 클래스 이름
		wc.hIconSm = LoadIcon(NULL, IDI_APPLICATION);

		WORD check = RegisterClassEx(&wc);
		assert(check != NULL);
	}
	// Create Window & Show Window
	{
		Hwnd = CreateWindowEx(	// 윈도우 생성
			NULL,
			Title.c_str(),	// 타이틀 클래스 이름
			Title.c_str(),	// 타이틀 바 이름
			WS_OVERLAPPEDWINDOW,	// 윈도우 스타일
			CW_USEDEFAULT,	// 생성될 좌표 x
			CW_USEDEFAULT,	// 생성될 좌표 y
			Width,	// 너비 크기
			Height,	// 높이 크기
			NULL,	// 소유주 핸들 지정
			NULL,	// 메뉴의 핸들 지정
			hInstance,	// 인스턴스 핸들 지정
			NULL	// lParam으로 전달될 구조체의 포인터
		);
		assert(Hwnd != NULL);
	}

	ShowWindow(Hwnd, nCmdShow);
	UpdateWindow(Hwnd);
}

void Destroy() {
	
}

WPARAM Running() {
	MSG msg;
	ZeroMemory(&msg, sizeof(MSG));

	InitScene();

	while (true) {
		// 메세지가 들어와 있는지 검사 후 리턴
		if (PeekMessage(&msg, NULL, 0, 0, PM_REMOVE)) {
			if (msg.message == WM_QUIT) break;
			TranslateMessage(&msg); // 해석
			DispatchMessage(&msg); // 보고
		}
		else {
			Update();
			Render();
		}
	}

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

 

실제 코드작성은 Main에서 이루어진다.

Main.cpp

#include "stdafx.h"
#include "Systems/Device.h"

void InitScene() {

}

void DestroyScene() {

}

void Update() {

}

void Render() {

}