์ฝ์ด(Core)๋ ๋ง๊ทธ๋๋ก ์ค์ฌ์ด๋ผ๋ ์๋ฏธ๋ก ์ฃผ์ํ ๊ธฐ๋ฅ์ ์ ๊ณตํ๊ณ ์ ๋ฐ์ ์ธ ํ๋ก๊ทธ๋จ ๊ตฌ์กฐ๋ฅผ ์ ์ํ๋ฉฐ ์ฑ๊ธํค(singleton)์ ํด๋์ค์ ์ธ์คํด์ค๊ฐ ๋จ ํ๋๋ง ์์ฑ๋๋๋ก ๋ณด์ฅํ๋ ์ํํธ์จ์ด ํจํด์ด๋ค. ์ฐ๋ฆฌ๊ฐ ํ๋ก๊ทธ๋จ์ ๋ง๋ค ๋ ์ฝ์ด ํด๋์ค์ ๊ฐ์ฒด๊ฐ ์ค์ฌ์ด ๋ ๊ฒ์ด๊ธฐ์ ์ด ๊ฐ์ฒด๋ ์ฌ๋ฌ ๊ฐ์ผ ์๊ฐ ์์ด ์ฑ๊ธํค ํจํด์ผ๋ก ๊ตฌํํ๊ณ ์ ํ๋ค.
- Core class ( ๋์ ํ ๋น Heap ์์ญ ์ฌ์ฉ )
// Core.h
class Core {
private:
static Core* pInst;
Core();
~Core();
public:
static Core* Instance()
{
if (pInst == nullptr) {
return new Core;
}
return pInst;
}
static void Release()
{
if (pInst != nullptr) {
delete pInst;
pInst = nullptr;
}
}
};
// Core.cpp
#include "Core.h"
Core* Core::pInst = nullptr;
// main.cpp - wWinMain
Core* pCore = Core::Instance();
์ฐ์ ๊ฐ์ฒด์ ์์ฑ์ ํ๋๋ก ์ ํํ๋ ค๋ฉด ์ด๋ป๊ฒ ํด์ผ ํ๋๊ฐ?
→ ์์ฑ์์ ์๋ฉธ์๋ private์ผ๋ก ์ ์ธํด์ฃผ๋ฉด ๋๋ค. ์ค๋ก์ง ๋ฉค๋ฒ ํจ์๋ก๋ง ๋ง๋ค๊ณ ์ง์ฐ๊ณ ์์ฑ๋ ์ ์๊ฒ ํ๋ค.
์ด๋์๋ ์ฝ๊ฒ ์ ๊ทผํ๋ ค๋ฉด?
→ ์๊ธฐ ์์ ์ ํฌ์ธํฐ๋ฅผ ๋ฐํํ๋ ํจ์๋ก ๋ง๋ค๋ฉด ๋๋ค. ๋ค๋ง, ์์ฑ์์ ์๋ฉธ์๊ฐ private์ผ๋ก ์ ์ธ๋ ๊ฒฝ์ฐ ์ธ๋ถ์์ ๊ฐ์ฒด๋ฅผ ๋ง๋ค ์ ์๊ฒ ๋๋ค(ํ๋ผ์ด๋น์ด๋ผ ์์ฑ์๋ก ์ ๊ทผ์ด ๋ถ๊ฐ๋ฅํจ). ๊ฐ์ฒด๊ฐ ์๋๋ฐ ๋ฉค๋ฒ ํจ์์ ๋ฉค๋ฒ ๋ณ์์ ์ ๊ทผ์ด ๊ฐ๋ฅํ๊ฐ?
→ No. ๋๊ฐ ํจ์๋ฅผ ํธ์ถํ๋์ง ์ ์ ์์ด(this๊ฐ ์์) ์ ๊ทผ์ด ๋ถ๊ฐ๋ฅํ๋ค.
→ ๋ฉค๋ฒ ์์ด ํธ์ถํ๋ ค๋ฉด static(์ ์ )์ผ๋ก ์ ์ธํ ํ์๊ฐ ์๋ค
→ ์ ์ ๋ฉค๋ฒ ํจ์๋ ๋ด๋ถ ์ ์ ๋ฉค๋ฒ๋ก๋ง ์ ๊ทผํ ์ ์๋ค.
์ ์ (static) ๋ณ์ ์ ์ธ์ ๋ํ์ฌ
1. ํจ์ ์์ ์ ์ธ → data ์์ญ (ํจ์๊ฐ ์ข
๋ฃ๋๋๋ผ๋ ํ ๋น๋ ๊ณต๊ฐ์ ๋จ์์์ -> ํด๋น ํจ์์์๋ง ์ ๊ทผ ๊ฐ๋ฅ)
2. ํ์ผ ์์ ์ ์ธ → data์์ญ, ํ์ผ ์์์๋ง ์ ๊ทผ์ด ๊ฐ๋ฅ
3. ํด๋์ค ์์ ์ ์ธ → data์์ญ / ํด๋์ค์ ์ฌ์ด์ฆ(ํฌ๊ธฐ)์๋ ์๊ด ์๊ฒ , ํด๋์ค ๋ด๋ถ์์๋ง ์ ๊ทผ ๊ฐ๋ฅ
→ ์ด๋์๋ ๋ง๋ค๋๋ผ๋ ๋ฐ์ดํฐ ์์ญ์ ์๋ ๊ฒ
* ์ ์ ๋ฉค๋ฒ๋ ๋ฌด์กฐ๊ฑด ํด๋์ค ์ธ๋ถ์์ ์ด๊ธฐํ ํด์ค์ผํจ → ์ํ๋ฉด ๋งํฌ ์ค๋ฅ
Core ํด๋์ค์ ๋ฉค๋ฒ ํจ์๋ก ๋ ๊ฐ์ง๋ฅผ ๋ง๋ค์
1. ์ธ์คํด์ค๋ฅผ ์ป๋ ํจ์ ( static Core* Instance() )
์๊ธฐ ์์ ์ ํฌ์ธํฐํ์ ๋ฐํํ๋ Instanceํจ์๋ฅผ ๋ง๋ ๋ค
→ ์ต์ด ํธ์ถ๋๋ ๊ฒฝ์ฐ (pInst๊ฐ nullptr์ธ ๊ฒฝ์ฐ) : ๋์ ์ผ๋ก Core ๊ฐ์ฒด ํ๋๋ฅผ ๋ง๋ค์ด ๊ทธ ์ฃผ์๋ฅผ ๋ฐํํ๋ค.
→ 2๋ฒ ์ด์ ํธ์ถ์ธ ๊ฒฝ์ฐ ์๋ฌด ๊ฒ๋ ํ์ง ์๋๋ค.
2. ํด์ ํ๋ ํจ์ ( static void Release() )
๋์ ์ผ๋ก ์ฌ์ฉํ ๊ฐ์ฒด๋ ํด์ ๊ฐ ํ์ํ๋ค. pInst๊ฐ nullptr์ด ์๋๋ผ๋ฉด(๊ฐ์ฒด๊ฐ ์๋ค๋ฉด) ๋ฉ๋ชจ๋ฆฌ๋ฅผ ํด์ ํ๊ณ ๊ทธ ๊ณต๊ฐ์ nullptr๋ก ๋ฐ๊พผ๋ค.
pInst๋ Core.cpp์์ ๋ฌด์กฐ๊ฑด ์ด๊ธฐํํ๋ค.
- Core class ( Data์์ญ ์ฌ์ฉ )
class Core {
private:
Core();
~Core();
public:
static Core* Instance() {
static Core core;
return &core;
}
};
๊ฐ๋จํ๋ค. Core์ ์ฃผ์๋ฅผ ์ป์ด์ ์ ๊ทผํ๋ฉด ๋๋๋ฐ ํด์ ํ ํ์๊ฐ ์๊ณ ๊ฐ๋จํ๋ค๋ ์ฅ์ ์ด ์์ง๋ง, ๋จ์ ์ผ๋ก๋ ํ๋ก๊ทธ๋จ ์ค๊ฐ์ ์ง์ธ ์ ์๋ค๋ ์ฌ์ค์ด๋ค. ๋ณดํต Manager์์ ์ฐ์ด๋ฉฐ ๊ตณ์ด ์ง์ธ ํ์ ์์ ๋ ๋ง์ด ์ฌ์ฉ๋๋ค.
์์ฃผ ์ฌ์ฉํ๋ ๊ฒ๋ค์ ๋งคํฌ๋ก๋ก ์ ํด๋๋ฉด ์ข๋ค์ฐ์ ๊ทธ ์ ์ ๋ฏธ๋ฆฌ ๋ง๋ค๊ณ ๋ค์ ์ดํด๋ณผ ๊ฒฝ์ฐ๊ฐ ์๋ ๊ฒ๋ค์ ๋ชจ์ pch.h๋ก ๋ง๋ค๊ณ , ๋ฏธ๋ฆฌ ์ปดํ์ผ ๋ ํค๋๋ก ๋ง๋ค์ด ๋์.๋ฏธ๋ฆฌ ์ปดํ์ผ ๋ ํค๋๋ ๋ชจ๋ cppํ์ผ์ ์กด์ฌํด์ผ ํ๋ฉฐ ์ด๋ฅผ ์ฌ์ฉํ๋ฉด ์ปดํ์ผ ์๋๋ฅผ ์ฌ๋ฆด ์ ์๋ค.
// pch.h
#pragma once
#include <windows.h>
#include "define.h"
* ํ๋ก์ ํธ์ ์์ฑ → C/C++ → ๋ฏธ๋ฆฌ ์ปดํ์ผ๋ ํค๋ → ๋งจ ์์ ์ค์ ๋ง๋ค๊ธฐ + ๋ ๋ฒ์งธ ํค๋ ํ์ผ ์ด๋ฆ ์ค์
define.h ๋ด๋ถ์ Core ํด๋์ค์ instance๋ถ๋ถ์ ๋งคํฌ๋ก๋ก ์ง์ ํ๋ค.
#include "pch.h"
# define SINGLE(type) public:\
static Core* Instance()\
{\
static Core mgr;\
return &mgr;\
}
์ฌ๊ธฐ์ ๋ฐฑ์ฌ๋์ฌ(\)๋ ๋งคํฌ๋ก ๋ด์์ ํ ์ค ๋์ฐ๋ ๊ฒ์ ์๋ฏธํ๋ค. public๋ ์์ง๋ง์.๋ชจ๋ cpp ํ์ผ ๋ด์ pch.h๋ฅผ ์ถ๊ฐํ๋ค๋ฉด,์์ Core ํด๋์ค ํ์ผ์ ์๋์ ๊ฐ์ด ์ธ ์ ์๋ค.
#pragma once
class Core {
SINGLE(Core);
private:
Core();
~Core();
public:
};
- Core class๋ฅผ ์ด์ฉํด์ ํด์๋ ์ค์ ๊ณผ ์ฌ๊ฐํ ๊ทธ๋ฆฌ๊ธฐ
๋ณธ๊ฒฉ์ ์ผ๋ก Core class๋ฅผ ์ด์ฉํด ๋ง๋ค์ด๋ณด์.
// Core.class
class Core {
SINGLE(Core);
private:
HWND handle;
POINT ptResolution;
HDC hDC;
Core();
~Core();
public:
int Init(HWND _hWnd, POINT _ptResolution);
void Progress();
};
Core ํด๋์ค ๋ด๋ถ์ ์ฐฝ ํธ๋ค์ ๋ฐ์ ๋ณ์(handle)์, ํด์๋๋ฅผ ๋ฐ์ ๋ณ์(ptResolution)์ ๋ง๋ ๋ค, hDC๋ ๊ทธ๋ฆฌ๊ธฐ ์ํ ๋ณ์๋ก ์กฐ๊ธ ์ด๋ฐ๊ฐ ๋ฐ์์ ์ค๋ช ํ๊ฒ ๋ค.
์ด ๋ณ์๋ค์ ๋ชจ๋ private์ผ๋ก ์ด ๊ฐ๋ค์ ๊ฐ์ง๊ณ ์ค์ ํ๊ธฐ ์ํ ํจ์๋ค์ public์ผ๋ก ์ค์ ํ๋ค.
#include "pch.h"
#include "Core.h"
Core::Core()
:handle(0)
, ptResolution{}
, hDC(0)
{
}
Core::~Core()
{
ReleaseDC(handle, hDC);
}
int Core::Init(HWND _handle, POINT _ptResolution)
{
handle = _handle;
ptResolution = _ptResolution;
RECT rt = {0, 0 , ptResolution.x, ptResolution.y };
AdjustWindowRect(&rt, WS_OVERLAPPEDWINDOW, true);
SetWindowPos(handle, nullptr, 100, 100, rt.right - rt.left, rt.bottom - rt.top, 0);
return S_OK;
}
void Core::Progress()
{
}
Core.cpp์ ์ดํด๋ณด๊ฒ ๋ค. ์ฐ์ ์์ฑ์์์ ๊ฐ ๋ณ์์ ๋ํ ์ด๊ธฐํ๋ฅผ, ์๋ฉธ์์์ ์ถํ์ ์ธ hDC๋ฅผ ํด์ ํ๋ ๋ถ๋ถ์ ์จ์ค๋ค.
Init()ํจ์๋ class ๊ฐ์ฒด๊ฐ ์์ํ ๋ ์ด๊ธฐํํด์ผ ํ๋ ๋ถ๋ถ์ ๋ฃ์ ํจ์๋ค. ํธ๋ค ๊ฐ(_handle)๊ณผ ์ค์ ํ ํด์๋ ๊ฐ(_ptResolution)์ ๋งค๊ฐ๋ณ์๋ก ๋ฐ๋๋ค.
๊ฐ ๋งค๊ฐ๋ณ์ ๊ฐ์ ๋ฉค๋ฒ ๋ณ์ handle์ ptResolution์ ๋ฃ๋๋ค.
AdjustWindowRect() ํจ์๋ ์๋์ฐ๊ฐ ์ค์ ๋ก ๊ทธ๋ฆด ์ ์๋ ์์ญ์ ๊ณ์ฐํ๋๋ฐ, ๋ฉ๋ด๋ฐ๋ ์๋์ฐ ์ฐฝ ์ฃผ๋ณ์ผ๋ก ์๊ฒจ์๋ ํ ๋๋ฆฌ ์์ญ(8pixel ์ ๋)๋ฅผ ์ ์ธํ ์์ญ์ ์๋ฏธํ๋ค. ๊ฐ ๋งค๊ฐ๋ณ์์ ์๋ฏธ๋ ๋ค์๊ณผ ๊ฐ๋ค.
IpRect : ์๋์ฐ์ ํฌ๊ธฐ์ ์์น๋ฅผ ์ง์ ํ๋ RECT ๊ตฌ์กฐ์ฒด์ ๋ํ ํฌ์ธํฐ
dwStyle : ์๋์ฐ์ ์คํ์ผ (๋ชจ์๊ณผ ๋์ - ํ ๋๋ฆฌ, ์ ๋ชฉ ํ์์ค, ํฌ๊ธฐ ์กฐ์ ์ด ๊ฐ๋ฅํ์ง ๋ฑ)
bMenu : ๋ฉ๋ด๋ฐ
ํ์ฌ RECT ๊ตฌ์กฐ์ฒด๋ฅผ ์ด์ฉํด์ ์๋์ฐ ํฌ๊ธฐ๋ฅผ ์กฐ์ ํ๋ฉฐ SetWindowPos() ํจ์๋ฅผ ์ฌ์ฉํด ์๋์ฐ์ ์์น์ ํฌ๊ธฐ๋ฅผ ์ค์ ํ๋ค.
rt-right - rt.left ์ rt.bottom - rt.top์ ๊ฐ๊ฐ ์๋์ฐ์ ๋๋น์ ๋์ด๋ฅผ ์๋ฏธํ๋ค.
hWnd: ์๋์ฐ ํธ๋ค
hWndInsertAfter: ์๋ก์ด Z ์์๋ฅผ ์ค์
X: ์๋์ฐ์ x ์ขํ
Y: ์๋์ฐ์ y ์ขํ
cx: ์๋์ฐ์ ๋๋น
cy: ์๋์ฐ์ ๋์ด
uFlags: ์๋์ฐ ์์น์ ํฌ๊ธฐ๋ฅผ ์ค์ ํ๋ ๋ฐ ์ฌ์ฉ๋๋ ํ๋๊ทธ
๋ค์์ main์ ์์ ํด ๋ฐ์ํด์ฃผ์ด์ผ ํ๋ค.
int APIENTRY wWinMain(_In_ HINSTANCE hInstance,
_In_opt_ HINSTANCE hPrevInstance,
_In_ LPWSTR lpCmdLine,
_In_ int nCmdShow)
{
UNREFERENCED_PARAMETER(hPrevInstance);
UNREFERENCED_PARAMETER(lpCmdLine);
LoadStringW(hInstance, IDS_APP_TITLE, szTitle, MAX_LOADSTRING);
LoadStringW(hInstance, IDC_WINDOWSPROJECT, szWindowClass, MAX_LOADSTRING);
MyRegisterClass(hInstance);
if (!InitInstance (hInstance, nCmdShow))
{
return FALSE;
}
if (FAILED(Core::Instance()->Init(hWnd, POINT{ 1280, 768 }))) {
MessageBox(nullptr, L"Core ๊ฐ์ฒด ์ด๊ธฐํ ์คํจ", L"ERROR", MB_OK);
return FALSE;
}
HACCEL hAccelTable = LoadAccelerators(hInstance, MAKEINTRESOURCE(IDC_WINDOWSPROJECT));
MSG msg;
while (true){
if (PeekMessage(&msg, nullptr, 0, 0, PM_REMOVE)) {
if (WM_QUIT == msg.message)
break;
if (!TranslateAccelerator(msg.hwnd, hAccelTable, &msg)) {
TranslateMessage(&msg);
DispatchMessage(&msg);
}
}
else{
Core::Instance()->Progress();
}
}
return (int) msg.wParam;
}
์์ ๋ค๋ฃจ์๋ฏ์ด Core ๊ฐ์ฒด๋ Instance()๋ฅผ ์ด์ฉํด ์์ฑํด์ ์ ๊ทผํด์ผ ํ๋ค.
์ด๋ฅผ ์ด์ฉํด ์ด๊ธฐํ ์์ ์ ์คํํ์.
ํ์ฌ ์ฐ๋ฆฌ๊ฐ ๋ค๋ฃจ๊ณ ์๋ ์ฐฝ์ handle ๊ฐ๊ณผ 1280, 768์ ํด์๋ ๊ฐ์ผ๋ก ์ ๋ฌํ๊ฒ ๋ค.
๋ง์ฝ ์ด ์์ ์ ์คํจํ๋ฉด FALED ๊ฐ์ด true๊ฐ ๋์ด ๋ฉ์ธ์ง ๋ฐ์ค๋ฅผ ์์ฑํ๊ณ ์ข ๋ฃํ๋๋ก ํ์.
์ด์ ์ฌ๊ฐํ์ ๊ทธ๋ ค๋ณด์.
์ด์ ๋ Core class ๋ด๋ถ์ Progress() ํจ์ ๋ด๋ถ์ ๊ณ์ ์คํ๋๋ ๋ถ๋ถ์ ์ฌ๊ธฐ์ ์ฝ๋ฉํ ๊ฒ์ด๋ค.
๊ทธ๋ฆฌ๊ธฐ ์์ ๋ํ ์ฌ๊ธฐ์ ์งํํ ์ ์๋๋ฐ ๋ฉ์ธ์ง์์ ์ฒ๋ฆฌํ๋ ๊ฒ๊ณผ ๋๊ฐ์ด DC๊ฐ ํ์ํ๋ค. ๋ฐ๋ผ์ ํด๋์ค ๋ด๋ถ์ HDC ๋ฉค๋ฒ ๋ณ์๋ฅผ ํ๋ ๋ง๋ค์ด ์ค ๊ฒ.
์ด๋ฅผ ์ด์ฉํด์ ํด๋์ค ๋ด๋ถ ํจ์์์ ์ด๋ป๊ฒ ๊ทธ๋ฆด ๊ฒ์ธ๊ฐ?
Object ํด๋์ค๋ฅผ ํ๋ ๋ง๋ค๊ฒ ๋ค
// Object.h
#pragma once
class Object {
public:
POINT ptPos;
POINT ptScale;
public:
Object();
~Object();
};
// Object.cpp
#include "pch.h"
#include "Object.h"
Object::Object()
: ptPos{}
, ptScale{}
{
}
Object::~Object()
{
}
์์ผ๋ก ์ด Object class๋ฅผ ์ด์ฉํด ๊ฒ์์ ์กด์ฌํ๋ ๋ฌผ์ฒด๋ฅผ ๋ง๋ค ๊ฒ์ด๋ค. ๋ณดํต ํ์ฌ ๋ฉค๋ฒ ๋ณ์๋ค์ private์ ์ด์ฉํด ๋ง๋๋ ๊ฒ์ด ์ณ์ง๋ง, public์ผ๋ก ์ผ๋จ ์ค์ ํ๊ฒ ๋ค.
// Core.cpp
#include "Object.h"
Object obj;
// ...
int Core::Init(HWND _handle, POINT _ptResolution)
{
// ...
hDC = GetDC(handle);
obj.ptPos = POINT{ ptResolution.x, ptResolution.y };
obj.ptScale = POINT{ 100,100 };
return S_OK;
}
void Core::Progress()
{
Rectangle(hDC, 10, 10, 110, 110);
}
hDC ๋ณ์์ handle ๊ฐ์ ์ด์ฉํด DC๋ฅผ ๊ฐ์ ธ์ค๊ณ , ์ฌ๊ฐํ์ ๊ทธ๋ฆด ๋ ํ์ํ ๊ฐ๋ค์ ๊ตฌ์กฐ์ฒด์ ์ ๋ฌํด์ฃผ๋๋ก ํ๋ค.
์ดํ Progress() ํจ์ ๋ด์์ ์ฌ๊ฐํ์ ๊ทธ๋ ค์ฃผ๋ฉด ๋๋ค.
๋ฉ์ธ์ง ๋ฐฉ์์ด ์๋๋ผ ๊ณ์ํด์ ๊ฐฑ์ ํ๋ ๋ฐฉ๋ฒ์ผ๋ก ์ฌ๊ฐํ์ ๊ทธ๋ฆฐ ๊ฒ์ด๋ค.
(์ค์ ๊ฒ์์ ๊ฐ ์ฅ๋ฉด์ ๋ค์ ๊ทธ๋ฆฐ๋ค. ์ด๋ฅผ ๋ ๋๋ง์ด๋ผ ํ๊ณ 1์ด 60๋ฒ ํด์ผ ์์ฐ์ค๋ฝ๊ฒ ๋ณด์ )
๋ค์์ ํค ์ ๋ ฅ์ ๋ฐ์์ ์ฌ๊ฐํ์ ์ด๋์์ผ๋ณด์
- ํค ์ ๋ ฅํด์ ์ฌ๊ฐํ ์ด๋ํ๊ธฐ (Updateํฉ์์ Renderํจ์)
// Core.h
class Core {
SINGLE(Core);
private:
HWND handle;
POINT ptResolution;
HDC hDC;
Core();
~Core();
private:
void Update(); // ์ถ๊ฐ
void Render(); // ์ถ๊ฐ
public:
int Init(HWND _hWnd, POINT _ptResolution);
void Progress();
};
// Core.cpp
// Init ํจ์
obj.ptPos = POINT{ ptResolution.x / 2, ptResolution.y / 2 }; // ์์
oid Core::Progress()
{
Update();
Render();
}
void Core::Update()
{
// ํค์
๋ ฅ..
if (GetAsyncKeyState(VK_LEFT) & 0x8000) {
obj.ptPos.x -= 1;
}
if (GetAsyncKeyState(VK_RIGHT) & 0x8000) {
obj.ptPos.x += 1;
}
}
void Core::Render()
{
Rectangle(hDC,
obj.ptPos.x - obj.ptScale.x / 2,
obj.ptPos.y - obj.ptScale.y / 2,
obj.ptPos.x + obj.ptScale.x / 2,
obj.ptPos.y + obj.ptScale.y / 2);
}
Update() ํจ์๋ ๋ฌผ์ฒด์ ๋ณ๊ฒฝ๋ ์ขํ๋ฅผ ์ถ์ ํ๊ณ ์ ๋ฐ์ดํธํ๋ ํจ์๋ฉฐ, Render()์ ์ด ์ ๋ณด๋ฅผ ํ ๋๋ก ๊ทธ๋ฆฌ๋ ๊ธฐ๋ฅ์ ์ํํ๋ ํจ์๋ค.
GetAsyncKeyState() ํจ์๋ฅผ ์ด์ฉํ๋ฉด ๋นํธ๋ฅผ ํตํด ์ฌ๋ฌ ์ ๋ณด๋ฅผ ๊ฐ์ ธ์ฌ ์ ์๋๋ฐ 0x8000๊ณผ ๋นํธ์ฐ์ฐ ํด์ฃผ๋ฉด ํค๊ฐ ๋๋ ธ๋์ง๋ฅผ ํ์ธํ ์ ์๋ค. ํค๊ฐ ๋๋ ธ์ ๋ ํด๋น ์ขํ๋ฅผ ๋๋ฆฌ๊ณ ์ค์ด๋ ์ฝ๋๋ค.
๊ฒฐ๊ณผ๋ฅผ ๋ด๋ณด์
ํค๋ณด๋ ์ค๋ฅธ์ชฝ ๋ฐฉํฅํค๋ฅผ ๋๋ฅด๋ฉด ์ด๋ ๊ฒ ๋๋ค
์๋ชป๋๊ฒ ์๋๋ผ ํ์ฌ ์ฝ๋์์ Progress()ํจ์๊ฐ 1์ด์ 4๋ง๋ฒ ์ ๋๊ฐ ๋์๊ฐ์(๋๋ฌด ๋นจ๋ผ์) ์๊ธฐ๋ ๋ฌธ์ ๋ค
์ด๋ฅผ ํด๊ฒฐํ๊ธฐ ์ํ ๋ฐฉ์์ ๋ค์ ์๊ฐ์..
'๐ค Study > winAPI' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[winAPI 06] Key Manager (1) | 2024.06.04 |
---|---|
[winAPI 05] Double Buffering (0) | 2024.06.04 |
[winAPI 04] Timer (0) | 2024.04.09 |
[winAPI 02] ๋ง์ฐ์ค๋ก ์ฌ๊ฐํ ๊ทธ๋ฆฌ๊ธฐ & ๊ฒ์ ๋ฉ์ธ์ง ์ฒ๋ฆฌ ๊ตฌ์กฐ (0) | 2024.04.08 |
[winAPI 01] Handle, DC, Window Event & ์ฌ๊ฐํ ๊ทธ๋ฆฌ๊ธฐ (0) | 2024.04.03 |