MapleStory Finger Point

๐Ÿ”ต C,C++,C#/C++ (MFC) ๊ฐœ๋…์ •๋ฆฌ

MFC 1

HYEJU01 2021. 10. 17. 01:06

โ–ถ์ด๋ฒคํŠธ ์‹œ์Šคํ…œ ํ (๋ฉ”์‹œ์ง€) ๋Œ€ํ•ด์„œ
โ–ถ๋ฉ”์„ธ์ง€ ๊ตฌ๋™ ๊ตฌ์กฐ

ํ•˜์ง€๋งŒ ๋Œ€๋ถ€๋ถ„์˜ ์œˆ๋„์šฐ ์‘์šฉ ํ”„๋กœ๊ทธ๋žจ์€ ์ˆœ์ฐจ์ ์œผ๋กœ ์‹คํ–‰๋˜์ง€ ์•Š๊ณ  ์–ด๋–ค ๋ฉ”์‹œ์ง€๋ฅผ ๋ฐ›๋Š”๊ฐ€์— ๋”ฐ๋ผ ์ฝ”๋“œ์˜ ์‹คํ–‰ ์ˆœ์„œ๊ฐ€ ๋‹ฌ๋ผ์ง„๋‹ค.

์™ธ๋ถ€์—์„œ ๋ฉ”์‹œ์ง€๋ฅผ ๋ฐœ์ƒ์‹œํ‚ค๋Š” ์ด๋ฒคํŠธ(Event)๊ฐ€ ๋ฐœ์ƒํ•˜๋ฉด ์šด์˜์ฒด์ œ๊ฐ€ ๊ด€๋ฆฌํ•˜๋Š” ์‹œ์Šคํ…œ ๋ฉ”์‹œ์ง€ ํ (Message Queue)์— ์ •๋ณด๊ฐ€ ์ €์žฅ๋œ๋‹ค. ๊ฐ๊ฐ์˜ ์‘์šฉํ”„๋กœ๊ทธ๋žจ์€ ์šด์˜์ฒด์ œ๋กœ๋ถ€ํ„ฐ ๋…๋ฆฝ์ ์ธ ๋ฉ”์‹œ์ง€ ํ๋ฅผ ํ• ๋‹น๋ฐ›์œผ๋ฉฐ ์šด์˜์ฒด์ œ๋Š” ์‹œ์Šคํ…œ ๋ฉ”์‹œ์ง€ ํ์— ์ €์žฅ๋œ ๋ฉ”์‹œ์ง€๋ฅผ ์ ์ ˆํ•œ ์‘์šฉํ”„๋กœ๊ทธ๋žจ ๋ฉ”์‹œ์ง€ ํ์— ๋ณด๋‚ธ๋‹ค. ์‘์šฉํ”„๋กœ๊ทธ๋žจ์€ ์ž์‹ ์˜ ๋ฉ”์‹œ์ง€ ํ๋ฅผ ๊ฐ์‹œํ•˜๋‹ค๊ฐ€ ๋ฉ”์‹œ์ง€๊ฐ€ ๋ฐœ์ƒํ•ด์„œ ํ์— ๋“ค์–ด์˜ค๋ฉด ํ•˜๋‚˜์”ฉ ๊บผ๋‚ด์„œ ์ฒ˜๋ฆฌํ•˜๊ณ  ๋ฉ”์‹œ์ง€๊ฐ€ ์—†์„ ๋•Œ๋Š” ๋Œ€๊ธฐํ•œ๋‹ค


โ–ถ๋ฉ€ํ‹ฐํƒœ์Šคํ‚น, ๋ฉ€ํ‹ฐ์Šค๋ ˆ๋”ฉ (๊ฐ/์ฃผ ๋ชจ๋ฆ„)
๋ฉ€ํ‹ฐํƒœ์Šคํ‚น(Multitasking)
์šด์˜์ฒด์ œ๊ฐ€ ์—ฌ๋Ÿฌ ๊ฐœ์˜ ์‘์šฉ ํ”„๋กœ๊ทธ๋žจ์„ ๋™์‹œ์— ์‹คํ–‰

๋ฉ€ํ‹ฐ์Šค๋ ˆ๋”ฉ(Multithreading)
์‘์šฉ ํ”„๋กœ๊ทธ๋žจ ๋‚ด๋ถ€์—์„œ ์—ฌ๋Ÿฌ ๊ฐœ์˜ ์‹คํ–‰ ํ๋ฆ„(=์Šค๋ ˆ๋“œ)์„ ๋™์‹œ์— ์ง„ํ–‰


โ–ถSDK ํ”„๋กœ๊ทธ๋žจ


์œˆ๋„์šฐ ์šด์˜์ฒด์ œ์˜ ํŠน์ง•์—์„œ ์‚ดํŽด๋ณธ ๊ฒƒ์ฒ˜๋Ÿผ ์œˆ๋„์šฐ ์‘์šฉํ”„๋กœ๊ทธ๋žจ์€ ๋ฉ”์‹œ์ง€ ๊ตฌ๋™ ๊ตฌ์กฐ๋กœ ๋™์ž‘ํ•œ๋‹ค. ๋ฉ”์‹œ์ง€ ๊ตฌ๋™ ๊ตฌ์กฐ์—์„œ๋Š” ๋ฐ›๋Š” ๋ฉ”์‹œ์ง€์— ๋”ฐ๋ผ ์‹คํ–‰ ์ˆœ์„œ๊ฐ€ ๋‹ฌ๋ผ์ง€๋ฉฐ ํ•ด๋‹น ๋ฉ”์‹œ์ง€์— ์–ด๋–ป๊ฒŒ ๋ฐ˜์‘ํ•˜๋Š”๊ฐ€์— ๋”ฐ๋ผ ๋™์ž‘์ด ๋‹ฌ๋ผ์ง„๋‹ค. ๋ฉ”์‹œ์ง€๋ฅผ ๋ฐ›์•˜์„ ๋•Œ ๋™์ž‘์„ ๊ฒฐ์ •ํ•˜๋Š” ์ฝ”๋“œ๋ฅผ ํŽธ์˜์ƒ ๋ฉ”์‹œ์ง€ ํ•ธ๋“ค๋Ÿฌ (Message Handler)๋ผ ๋ถ€๋ฅด์ž. ํ”„๋กœ๊ทธ๋ž˜๋จธ๋Š” ํ‚ค๋ณด๋“œ ๋ฉ”์‹œ์ง€ ํ•ธ๋“ค๋Ÿฌ, ๋งˆ์šฐ์Šค ๋ฉ”์‹œ์ง€ ํ•ธ๋“ค๋Ÿฌ, ๋ฉ”๋‰ด ๋ฉ”์‹œ์ง€ ํ•ธ๋“ค๋Ÿฌ ๊ฐ™์€ ๋‹ค์–‘ํ•œ ๋ฉ”์‹œ์ง€ ํ•ธ๋“ค๋Ÿฌ๋ฅผ ์ž‘์„ฑํ•˜๊ฒŒ ๋œ๋‹ค.
๋ฉ”์‹œ์ง€ ํ•ธ๋“ค๋Ÿฌ์˜ ์ง‘ํ•ฉ์„ ์œˆ๋„์šฐ ํ”„๋กœ์‹œ์ €(Window Procedure)๋ผ ๋ถ€๋ฅธ๋‹ค. ์œˆ๋„์šฐ ์šด์˜์ฒด์ œ๋Š” ํ”„๋กœ๊ทธ๋žจ์ด ์ฒ˜๋ฆฌํ•˜์ง€ ์•Š์€ ๋ฉ”์‹œ์ง€๋ฅผ ์ž๋™์œผ๋กœ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ๋„๋ก ์šด์˜์ฒด์ œ ์ฐจ์›์˜ ๋ฉ”์‹œ์ง€ ํ•ธ๋“ค๋Ÿฌ๋ฅผ ์ œ๊ณตํ•œ๋‹ค.
๋ฉ”์‹œ์ง€์˜ ์ข…๋ฅ˜๊ฐ€ ๋งŽ์•„ windows.h๋ฅผ ์ฐธ๊ณ  ํ•˜์—ฌ ํ™•์ธํ† ๋ก ํ•œ๋‹ค. 
WM_ ์ ‘๋‘์–ด๋กœ ์‹œ์ž‘ํ•œ๋‹ค


WM_CREATE : CreateWindow() ํ•จ์ˆ˜ ํ˜ธ์ถœ
WM_LBUTTONDOWN : ํด๋ผ์ด์–ธํŠธ ์˜์—ญ์—์„œ ๋งˆ์šฐ์Šค ์™ผ์ชฝ ๋ฒ„ํŠผ ๋ˆ„๋ฅผ๋•Œ
WM_PAINT : ํด๋ผ์ด์–ธํŠธ ์˜์—ญ์—์„œ ์ผ๋ถ€ ๋˜๋Š” ์ „์ฒด๋ฅผ ๋‹ค์‹œ ๊ทธ๋ฆดํ•„์š”๊ฐ€ ์žˆ์„๋•Œ
WM_DESTROY : ์ข…๋ฃŒ ๋ฒ„ํŠผ์„ ๋ˆŒ๋ €์„๋•Œ

โ–ถ๊ธฐ๋ณธ๊ตฌ์กฐ (๊ธฐ๋ณธ์ ์œผ๋กœ MFC ์— ์žˆ๋Š” ๊ฒƒ๋“ค)
โ‘  ์‘์šฉ ํ”„๋กœ๊ทธ๋žจ ํด๋ž˜์Šค ์ •์˜
โ‘ก ๋ฉ”์ธ(=ํ”„๋ ˆ์ž„) ์œˆ๋„์šฐ ํด๋ž˜์Šค ์ •์˜
โ‘ข ์‘์šฉ ํ”„๋กœ๊ทธ๋žจ ๊ฐ์ฒด ์„ ์–ธ
โ‘ฃ ๋ฉ”์‹œ์ง€ ๋งต ์„ ์–ธ

๋”๋ณด๊ธฐ
#include <afxwin.h> // ์‘์šฉ ํ”„๋กœ๊ทธ๋žจ ํด๋ž˜์Šค๋ฅผ ์„ ์–ธํ•œ๋‹ค. class CHelloApp : public CWinApp { public: virtual BOOL InitInstance(); }; // ๋ฉ”์ธ ์œˆ๋„์šฐ ํด๋ž˜์Šค๋ฅผ ์„ ์–ธํ•œ๋‹ค. class CMainFrame : public CFrameWnd { public: CMainFrame(); protected: afx_msg void OnPaint(); afx_msg void OnLButtonDown(UINT nFlags, CPoint point); DECLARE_MESSAGE_MAP() }; // ์‘์šฉ ํ”„๋กœ๊ทธ๋žจ ๊ฐ์ฒด๋ฅผ ์„ ์–ธํ•œ๋‹ค. CHelloApp theApp; // ์‘์šฉ ํ”„๋กœ๊ทธ๋žจ ํด๋ž˜์Šค๋ฅผ ์ •์˜ํ•œ๋‹ค. BOOL CHelloApp::InitInstance() { m_pMainWnd = new CMainFrame; m_pMainWnd->ShowWindow(m_nCmdShow); return TRUE; } // ๋ฉ”์ธ ์œˆ๋„์šฐ ํด๋ž˜์Šค๋ฅผ ์ •์˜ํ•œ๋‹ค. CMainFrame::CMainFrame() { Create(NULL, _T("HelloMFC “)); // ์œ ๋‹ˆ์ฝ”๋“œ } void CMainFrame::OnPaint() { CPaintDC dc(this); TCHAR *msg = _T("Hello, MFC“); dc.TextOut(100, 100, msg, lstrlen(msg)); } void CMainFrame::OnLButtonDown(UINT nFlags, CPoint point) { MessageBox(_T("๋งˆ์šฐ์Šค ํด๋ฆญ!“) , _T( "๋งˆ์šฐ์Šค ๋ฉ”์‹œ์ง€“)); } // ๋ฉ”์‹œ์ง€ ๋งต์„ ์„ ์–ธํ•œ๋‹ค. BEGIN_MESSAGE_MAP(CMainFrame, CFrameWnd) ON_WM_PAINT() ON_WM_LBUTTONDOWN() END_MESSAGE_MAP()

โ–ท์œˆ๋„์šฐ ์šด์˜์ฒด์ œ์—์„œ ์ถœ๋ ฅ ์‹œ์Šคํ…œ์„ ์„ค๊ณ„ ์‹œ ๊ณ ๋ ค ์‚ฌํ•ญ
์žฅ์น˜ ๋ณ€๊ฒฝ์— ๋”ฐ๋ฅธ ํ”„๋กœ๊ทธ๋žจ ์ˆ˜์ • ์—†์Œ
๋ชจ๋‹ˆํ„ฐ, ๋น„๋””์˜ค ์นด๋“œ, ํ”„๋ฆฐํ„ฐ ๋“ฑ ์ถœ๋ ฅ์— ์‚ฌ์šฉ๋˜๋Š” ์ฃผ๋ณ€ ์žฅ์น˜๊ฐ€ ๋ณ€๊ฒฝ๋˜๋”๋ผ๋„ ํ”„๋กœ๊ทธ๋žจ์„ ์ˆ˜์ •ํ•  ํ•„์š”๊ฐ€ ์—†์–ด์•ผ ํ•œ๋‹ค.

โ–ทํ”„๋กœ๊ทธ๋žจ ์ถœ๋ ฅ ์˜์—ญ ์ œ์•ฝ
์—ฌ๋Ÿฌ ํ”„๋กœ๊ทธ๋žจ์ด ํ™”๋ฉด์„ ๋ถ„ํ• ํ•ด์„œ ์‚ฌ์šฉํ•˜๋ฏ€๋กœ ๊ฐ๊ฐ์˜ ํ”„๋กœ๊ทธ๋žจ์ด ์ถœ๋ ฅํ•˜๋Š” ์˜์—ญ์— ์ œ์•ฝ์„ ๊ฐ€ํ•ด์•ผ ํ•œ๋‹ค.
ํ™”๋ฉด์ด๋‚˜ ๊ธฐํƒ€ ์ถœ๋ ฅ ์žฅ์น˜์— ์ง์ ‘ ์ ‘๊ทผ(Direct Access)ํ•˜๊ฑฐ๋‚˜ ๋…์ ํ•ด์„œ ์‚ฌ์šฉ(Exclusive Use)ํ•˜๋Š” ๊ฒƒ์„ ์šด์˜์ฒด์ œ ์ˆ˜์ค€์—์„œ ๋ง‰์•„์•ผ ํ•œ๋‹ค.

โ–ท์œˆ๋„์šฐ ์‘์šฉ ํ”„๋กœ๊ทธ๋žจ์ด ํ™”๋ฉด์— ์ถœ๋ ฅ ์‹œ ๊ณ ๋ ค ์‚ฌํ•ญ
ํด๋ผ์ด์–ธํŠธ ์˜์—ญ์— ์ถœ๋ ฅํ•˜๋ ค๋ฉด ์ถœ๋ ฅ ๋Œ€์ƒ ์œˆ๋„์šฐ์˜ ์œ„์น˜๋ฅผ ์•Œ์•„์•ผ ํ•œ๋‹ค.
ํ™”๋ฉด์— ์œˆ๋„์šฐ๊ฐ€ ์—ฌ๋Ÿฌ ๊ฐœ ์žˆ์„ ๋•Œ, ์ถœ๋ ฅ ๊ฒฐ๊ณผ๊ฐ€ ๋‹ค๋ฅธ ์œˆ๋„์šฐ ์˜์—ญ์„ ์นจ๋ฒ”ํ•˜์ง€ ์•Š์•„์•ผ ํ•œ๋‹ค.
ํ˜„์žฌ ์ถœ๋ ฅํ•  ํ™”๋ฉด์ด ๋‹ค๋ฅธ ์œˆ๋„์šฐ์— ๊ฐ€๋ ค์กŒ๋‹ค๋ฉด ์ถœ๋ ฅํ•  ์ˆ˜ ์—†์–ด์•ผ ํ•œ๋‹ค.

 

โ–ท์œˆ๋„์šฐ ์‘์šฉ ํ”„๋กœ๊ทธ๋žจ์˜ ์ถœ๋ ฅ ๊ณผ์ •
โ‘  ์šด์˜์ฒด์ œ์— ๋””๋ฐ”์ด์Šค ์ปจํ…์ŠคํŠธ๋ฅผ ์š”์ฒญํ•œ๋‹ค.
โ‘ก ์š”์ฒญ์„ ๋ฐ›์€ ์šด์˜์ฒด์ œ์˜ GDI๊ฐ€ ๋‚ด๋ถ€์ ์œผ๋กœ ๋””๋ฐ”์ด์Šค ์ปจํ…์ŠคํŠธ๋ฅผ ๋งŒ๋“  ํ›„, ๋””๋ฐ”์ด์Šค ์ปจํ…์ŠคํŠธ๋ฅผ ๊ฐ€๋ฆฌํ‚ค๋Š” ํ•ธ๋“ค(HDC ํƒ€์ž…)์„ ์‘์šฉ ํ”„๋กœ๊ทธ๋žจ์— ๋Œ๋ ค์ค€๋‹ค.
โ‘ข ์‘์šฉ ํ”„๋กœ๊ทธ๋žจ์€ (ํ•„์š”ํ•˜๋‹ค๋ฉด) ๋ฐ›์€ ๋””๋ฐ”์ด์Šค ์ปจํ…์ŠคํŠธ์˜ ์†์„ฑ์„ ์ผ๋ถ€ ๋ณ€๊ฒฝํ•œ๋‹ค. ๊ทธ๋Ÿฐ ๋‹ค์Œ, ๋””๋ฐ”์ด์Šค ์ปจํ…์ŠคํŠธ ํ•ธ๋“ค์„ ์œˆ๋„์šฐ API ํ•จ์ˆ˜์— ์ „๋‹ฌํ•˜์—ฌ ์ถœ๋ ฅ(→์žฅ์น˜ ๋…๋ฆฝ์ )์„ ์š”์ฒญํ•œ๋‹ค. ์ด ์š”์ฒญ์€ ๋‹ค์‹œ ์šด์˜์ฒด์ œ์˜ GDI์— ์ „๋‹ฌ๋œ๋‹ค.
โ‘ฃ GDI๊ฐ€ ๋””๋ฐ”์ด์Šค ์ปจํ…์ŠคํŠธ์— ํฌํ•จ๋œ ์ •๋ณด๋ฅผ ํ† ๋Œ€๋กœ ๋‹ค์–‘ํ•œ ์ƒํ™ฉ์„ ๊ณ ๋ คํ•˜์—ฌ ์ถœ๋ ฅ(→์žฅ์น˜ ์˜์กด์ )ํ•œ๋‹ค. ์ด๋•Œ ์žฅ์น˜๋ณ„ ์ถœ๋ ฅ์„ ์œ„ํ•ด ์žฅ์น˜ ๋“œ๋ผ์ด๋ฒ„๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค.


โ–ทSDK ํ”„๋กœ๊ทธ๋žจ ์ถœ๋ ฅ ๊ณผ์ •
์šด์˜์ฒด์ œ์— ๋””๋ฐ”์ด์Šค ์ปจํ…์ŠคํŠธ๋ฅผ ์š”์ฒญํ•œ๋‹ค.
๋””๋ฐ”์ด์Šค ์ปจํ…์ŠคํŠธ๋ฅผ ์ „๋‹ฌ ์ธ์ž๋กœ ์‚ฌ์šฉํ•ด API ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•˜์—ฌ ์ถœ๋ ฅํ•œ๋‹ค.
๋””๋ฐ”์ด์Šค ์ปจํ…์ŠคํŠธ ์‚ฌ์šฉ์ด ๋๋‚ฌ์Œ์„ ์šด์˜์ฒด์ œ์— ์•Œ๋ฆฐ๋‹ค.

โ–ทMFC ํ”„๋กœ๊ทธ๋žจ ์ถœ๋ ฅ ๊ณผ์ •
๋””๋ฐ”์ด์Šค ์ปจํ…์ŠคํŠธ ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•œ๋‹ค.
๊ฐ์ฒด์˜ ๋ฉค๋ฒ„ ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•˜์—ฌ ์ถœ๋ ฅํ•œ๋‹ค.


โ–ท์„  ๊ทธ๋ฆฌ๊ธฐ
ํ˜„์žฌ ์œ„์น˜๋ฅผ (x1,y1)์œผ๋กœ ์˜ฎ๊ธด๋‹ค.
ํ˜„์žฌ ์œ„์น˜๋Š” ๋””๋ฐ”์ด์Šค ์ปจํ…์ŠคํŠธ์˜ ์†์„ฑ ์ค‘ ํ•˜๋‚˜
ํ˜„์žฌ ์œ„์น˜์—์„œ (x2, y2)๊นŒ์ง€ ์„ ์„ ๊ทธ๋ฆฐ๋‹ค.
์™„๋ฃŒ๋˜๋ฉด ํ˜„์žฌ ์œ„์น˜๋Š” (x2,y2)๋กœ ์ž๋™ ๋ณ€๊ฒฝ๋จ


โ–ถ๋ฌดํšจํ™” ์˜์—ญ(ํ™”๋ฉด์„ ๋‹ค์‹œ ๊ทธ๋ ค์•ผ ํ•˜๋Š” ์ƒํ™ฉ)
โ–ถWM_PAINT ๋ฉ”์‹œ์ง€ ์ฒ˜๋ฆฌ ๋ฐฉ์‹
โ—‡HelloSDK ํ”„๋กœ๊ทธ๋žจ

case WM_PAINT: hdc = BeginPaint(hwnd, &ps); TextOut(hdc, 100, 100, str, lstrlen(str)); EndPaint(hwnd, &ps); return 0;

โ—‡HelloMFC ํ”„๋กœ๊ทธ๋žจ

void CMainFrame::OnPaint() { /* ์ƒ์„ฑ์ž์—์„œ ::BeginPaint() ํ˜ธ์ถœ! */ CPaintDC dc(this); TCHAR *msg = _T("Hello, MFC"); dc.TextOut(100, 100, msg, lstrlen(msg)); } /* ์†Œ๋ฉธ์ž์—์„œ ::EndPaint() ํ˜ธ์ถœ! */

โ—‡WM_PAINT ๋ฉ”์‹œ์ง€ ๋ฐœ์ƒ ์ƒํ™ฉ
์œˆ๋„์šฐ๊ฐ€ ์ƒ์„ฑ๋  ๋•Œ
์œˆ๋„์šฐ์˜ ํฌ๊ธฐ๊ฐ€ ๋ณ€๊ฒฝ๋  ๋•Œ
์œˆ๋„์šฐ๊ฐ€ ์ตœ์†Œํ™” ๋˜๋Š” ์ตœ๋Œ€ํ™”๋˜์—ˆ์„ ๋•Œ
๋‹ค๋ฅธ ์œˆ๋„์šฐ๊ฐ€ ๊ฐ€๋ ธ๋‹ค๊ฐ€ ๋“œ๋Ÿฌ๋‚  ๋•Œ (์ด์  ์•„๋‹ˆ๋‹ค)

๋ฌดํšจ ์˜์—ญ ์ƒ์„ฑ ํ•จ์ˆ˜ void CWnd::Invalidate(BOOL bErase = TRUE); !! void CWnd::InvalidateRect(LPCRECT lpRect, BOOL bErase = TRUE); void CWnd::InvalidateRgn(CRgn* pRgn, BOOL bErase = TRUE);

โ–ทGDI(Graphics Device Interface)
์œˆ๋„์šฐ ์šด์˜์ฒด์ œ์˜ ํ•˜์œ„ ์‹œ์Šคํ…œ ์ค‘ ํ•˜๋‚˜๋กœ DLL๋กœ ์กด์žฌ
์‘์šฉ ํ”„๋กœ๊ทธ๋žจ์˜ ์š”์ฒญ์„ ๋ฐ›์•„ ์‹ค์ œ ์ถœ๋ ฅ ์žฅ์น˜์ธ ๋ชจ๋‹ˆํ„ฐ๋‚˜ ํ”„๋ฆฐํ„ฐ์— ์ถœ๋ ฅํ•˜๋Š” ์—ญํ• ์„ ๋‹ด๋‹น

โ–ทGDI ๊ฐ์ฒด
GDI์—์„œ ์ถœ๋ ฅํ•  ๋•Œ ์‚ฌ์šฉํ•˜๋Š” ๋„๊ตฌ

GDI ๊ฐ์ฒด ์šฉ๋„ ํด๋ž˜์Šค ์ด๋ฆ„
ํŽœ ์„ ์„ ๊ทธ๋ฆด ๋•Œ CPen
๋ธŒ๋Ÿฌ์‹œ ๋ฉด์˜ ๋‚ด๋ถ€๋ฅผ ์ฑ„์šธ ๋•Œ CBrush
ํฐํŠธ ๊ธ€์ž๋ฅผ ์ถœ๋ ฅํ•  ๋•Œ CFont
๋น„ํŠธ๋งต ๊ทธ๋ฆผ์„ ์ถœ๋ ฅํ•  ๋•Œ CBitmap
ํŒ”๋ ˆํŠธ ์ถœ๋ ฅ๋  ์ƒ‰์˜ ์ง‘ํ•ฉ์„ ๋‹ค๋ฃฐ ๋•Œ CPalette
๋ฆฌ์ „ ๋‹ค์–‘ํ•œ ํ˜•ํƒœ์˜ ๋ฉด์„ ์ •์˜ํ•  ๋•Œ CRgn


โ–ทGDI ๊ฐ์ฒด ์‚ฌ์šฉ ๋ฐฉ๋ฒ•
โ‘  GDI ๊ฐ์ฒด๋ฅผ ์Šคํƒ์— ์ƒ์„ฑํ•œ๋‹ค.
โ‘ก ์ƒ์„ฑ๋œ GDI ๊ฐ์ฒด๋ฅผ CDC::SelectObject( ) ํ•จ์ˆ˜์— ์ „๋‹ฌํ•˜์—ฌ ๋””๋ฐ”์ด์Šค ์ปจํ…์ŠคํŠธ์— ์„ ํƒํ•œ๋‹ค.
โ‘ข CDC ํด๋ž˜์Šค ๋ฉค๋ฒ„ ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•˜์—ฌ ์ถœ๋ ฅํ•œ๋‹ค.
โ‘ฃ ์ด์ „์˜ GDI ๊ฐ์ฒด๋ฅผ CDC::SelectObject( ) ํ•จ์ˆ˜์— ์ „๋‹ฌํ•˜์—ฌ ๋ณต์›ํ•œ๋‹ค.
โ‘ค ํ•จ์ˆ˜๊ฐ€ ๋๋‚˜๋ฉด GDI ๊ฐ์ฒด์˜ ์†Œ๋ฉธ์ž๊ฐ€ ์ž๋™์œผ๋กœ ํ˜ธ์ถœ๋˜์–ด ํŒŒ๊ดด๋œ๋‹ค



#ํŽœ ๋“ฑ๋ก/ ์‚ญ์ œ



#ํŽœ ์ƒ์„ฑ <๊ฐ๊ด€์‹>

 ๋ฐฉ๋ฒ• 1 CPen pen(PS_SOLID, 2, RGB(255, 0, 0)); // ํญ์ด 2์ธ ๋นจ๊ฐ„์ƒ‰ ํŽœ 
๋ฐฉ๋ฒ• 2 CPen pen; pen.CreatePen(PS_SOLID, 2, RGB (255, 0, 0)); // ํญ์ด 2์ธ ๋นจ๊ฐ„์ƒ‰ ํŽœ
CPaintDC dc(this); // ๋””๋ฐ”์ด์Šค ์ปจํ…์ŠคํŠธ ๊ฐ์ฒด๋ฅผ ๋งŒ๋“ ๋‹ค.
CPen pen(PS_SOLID, 1, RGB(0, 0, 255)); // ํŽœ ๊ฐ์ฒด๋ฅผ ๋งŒ๋“ ๋‹ค. 
CPen *pOldPen = dc.SelectObject(&pen); // ์ƒˆ๋กœ์šด ํŽœ ์„ ํƒ, ์ด์ „ ํŽœ ์ €์žฅ
dc.Rectangle(100, 100, 200, 200);// ์ง์‚ฌ๊ฐํ˜•์„ ๊ทธ๋ฆฐ๋‹ค. 
dc.SelectObject(pOldPen); // ์ด์ „ ํŽœ ๋ณต์›, ์‚ฌ์šฉํ•˜๋˜ ํŽœ ์„ ํƒ ํ•ด์ œ
CPaintDC dc(this);// ๋””๋ฐ”์ด์Šค ์ปจํ…์ŠคํŠธ ๊ฐ์ฒด๋ฅผ ๋งŒ๋“ ๋‹ค. 
CPen pen(PS_SOLID, 1, RGB(0, 0, 255));// ํŽœ ๊ฐ์ฒด๋ฅผ ๋งŒ๋“ ๋‹ค.
dc.SelectObject(&pen); // ์ƒˆ๋กœ์šด ํŽœ์„ ์„ ํƒํ•œ๋‹ค. 
dc.Rectangle(100, 100, 200, 200);// ์ง์‚ฌ๊ฐํ˜•์„ ๊ทธ๋ฆฐ๋‹ค.




#๋ธŒ๋Ÿฌ์‰ฌ <๊ฐ๊ด€์‹>

CPaintDC dc(this);// ๋””๋ฐ”์ด์Šค ์ปจํ…์ŠคํŠธ ๊ฐ์ฒด๋ฅผ ๋งŒ๋“ ๋‹ค.
CBrush brush(RGB(255, 0, 0));// ๋ธŒ๋Ÿฌ์‹œ ๊ฐ์ฒด๋ฅผ ๋งŒ๋“ ๋‹ค.
CBrush *pOldBrush = dc.SelectObject(&brush);// ์ƒˆ๋กœ์šด ๋ธŒ๋Ÿฌ์‹œ ์„ ํƒ, ์ด์ „ ๋ธŒ๋Ÿฌ์‹œ ์ €์žฅ
dc.Ellipse(100, 100, 200, 200); // ์›์„ ๊ทธ๋ฆฐ๋‹ค.
dc.SelectObject(pOldBrush); // ์ด์ „ ๋ธŒ๋Ÿฌ์‹œ ๋ณต์›, ์‚ฌ์šฉํ•˜๋˜ ๋ธŒ๋Ÿฌ์‹œ ์„ ํƒ ํ•ด์ œ
CPaintDC dc(this); // ๋””๋ฐ”์ด์Šค ์ปจํ…์ŠคํŠธ ๊ฐ์ฒด๋ฅผ ๋งŒ๋“ ๋‹ค.
CBrush brush(RGB(255, 0, 0)); // ๋ธŒ๋Ÿฌ์‹œ ๊ฐ์ฒด๋ฅผ ๋งŒ๋“ ๋‹ค.
dc.SelectObject(&brush); // ์ƒˆ๋กœ์šด ๋ธŒ๋Ÿฌ์‹œ๋ฅผ ์„ ํƒํ•œ๋‹ค.
dc.Ellipse(100, 100, 200, 200); // ์›์„ ๊ทธ๋ฆฐ๋‹ค.



#๊ธฐ๋ณธ์ž…์ถœ๋ ฅ ๋„ํ˜• (๊ทธ๋ฆฌ๊ธฐํ•จ์ˆ˜๋“ค)
#์ ์ฐ๊ธฐ

์ด๋ฆ„ ๊ธฐ๋Šฅ
GetPixel() ํ™”๋ฉด (x, y) ์ง€์ ์˜ ์ƒ‰์„ ์–ป๋Š”๋‹ค.
SetPixel() ํ™”๋ฉด (x, y) ์ง€์ ์— ํŠน์ • ์ƒ‰์ƒ์˜ ์ ์„ ์ฐ๊ณ , ์›๋ž˜ ์ ์˜ ์ƒ‰์„ ๋ฆฌํ„ดํ•œ๋‹ค.
SetPixelV() SetPixel( ) ํ•จ์ˆ˜์™€ ์ถœ๋ ฅ์€ ๊ฐ™์ง€๋งŒ, ์›๋ž˜ ์ ์˜ ์ƒ‰์„ ๋ฆฌํ„ดํ•˜์ง€ ์•Š์œผ๋ฏ€๋กœ ์†๋„๊ฐ€ ์ข€๋” ๋น ๋ฅด๋‹ค.

#์„ ๊ทธ๋ฆฌ๊ธฐ

์ด๋ฆ„ ๊ธฐ๋Šฅ
MoveTo() ํ˜„์žฌ ์œ„์น˜๋ฅผ (x, y) ์œ„์น˜๋กœ ์˜ฎ๊ธด๋‹ค.
LineTo() ํ˜„์žฌ ์œ„์น˜์—์„œ (x, y) ์œ„์น˜๊นŒ์ง€ ์„ ์„ ๊ทธ๋ฆฌ๊ณ , ํ˜„์žฌ ์œ„์น˜๋ฅผ (x, y)๋กœ ๋ณ€๊ฒฝํ•œ๋‹ค.
Polyline() POINT ๊ตฌ์กฐ์ฒด ๋ฐฐ์—ด๋กœ ์ „๋‹ฌ๋œ ์ ๋“ค์„ ์ฐจ๋ก€๋กœ ์ด์–ด์„œ ์„ ์„ ๊ทธ๋ฆฐ๋‹ค.


#๋„ํ˜•๊ทธ๋ฆฌ๊ธฐ

์ด๋ฆ„ ๊ธฐ๋Šฅ
Rectangle() ์ง์‚ฌ๊ฐํ˜•์„ ๊ทธ๋ฆฐ๋‹ค.
Ellipse() ์ง์‚ฌ๊ฐํ˜•์— ๋‚ด์ ‘ํ•˜๋Š” ํƒ€์›์„ ๊ทธ๋ฆฐ๋‹ค.
RoundRect() ํ…Œ๋‘๋ฆฌ๊ฐ€ ๋‘ฅ๊ทผ ์ง์‚ฌ๊ฐํ˜•์„ ๊ทธ๋ฆฐ๋‹ค.
Polygon() POINT ๊ตฌ์กฐ์ฒด ๋ฐฐ์—ด๋กœ ์ „๋‹ฌ๋œ ์ ๋“ค์„ ์ฐจ๋ก€๋กœ ์ด์–ด์„œ ๋‹ค๊ฐํ˜•์„ ๊ทธ๋ฆฐ๋‹ค.

#๊ธ€์“ฐ๊ธฐ

์ด๋ฆ„ ๊ธฐ๋Šฅ
TextOut() (x, y) ์œ„์น˜์— ๋ฌธ์ž์—ด์„ ์ถœ๋ ฅํ•œ๋‹ค.
DrawText() ์ง์‚ฌ๊ฐํ˜• ์˜์—ญ ๋‚ด๋ถ€์— ๋ฌธ์ž์—ด์„ ์ถœ๋ ฅํ•œ๋‹ค.


#๊ฐ์ข… ๋ช…๋ น์–ด

 


โ–ท๋””๋ฐ”์ด์Šค ์ปจํ…์ŠคํŠธ(DC, Device Context)
GDI๊ฐ€ ์ƒ์„ฑํ•˜๊ณ  ๊ด€๋ฆฌํ•˜๋Š” ๋ฐ์ดํ„ฐ ๊ตฌ์กฐ์ฒด
๋ฉ€ํ‹ฐํƒœ์Šคํ‚น GUI ํ™˜๊ฒฝ์—์„œ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ๋Š” ๋ณต์žกํ•œ ์ƒํ™ฉ๋“ค์„ ์‹ ๊ฒฝ์“ฐ์ง€ ์•Š๊ณ  ์žฅ์น˜์— ์ž์œ ๋กญ๊ฒŒ ์ถœ๋ ฅ ๊ฐ€๋Šฅ


โ–ท๋‹ค์–‘ํ•œ ๋””๋ฐ”์ด์Šค ์ปจํ…์ŠคํŠธ ํด๋ž˜์Šค

ํด๋ž˜์Šค ์ด๋ฆ„ ์šฉ๋„
CPaintDC ํด๋ผ์ด์–ธํŠธ ์˜์—ญ์— ์ถœ๋ ฅํ•  ๋•Œ
(WM_PAINT ๋ฉ”์‹œ์ง€ ํ•ธ๋“ค๋Ÿฌ์—์„œ๋งŒ ์‚ฌ์šฉ)
CClientDC ํด๋ผ์ด์–ธํŠธ ์˜์—ญ์— ์ถœ๋ ฅํ•  ๋•Œ
(WM_PAINT ๋ฉ”์‹œ์ง€ ํ•ธ๋“ค๋Ÿฌ๋ฅผ ์ œ์™ธํ•œ
๋‹ค๋ฅธ ๋ชจ๋“  ๊ณณ์—์„œ ์‚ฌ์šฉ)
CWindowDC ์œˆ๋„์šฐ ์ „์ฒด ์˜์—ญ(ํด๋ผ์ด์–ธํŠธ ์˜์—ญ +
๋น„ํด๋ผ์ด์–ธํŠธ ์˜์—ญ)์— ์ถœ๋ ฅํ•  ๋•Œ
CMetaFileDC ๋ฉ”ํƒ€ํŒŒ์ผ(Metafile)์— ์ถœ๋ ฅํ•  ๋•Œ

 


โ–ถDC (4๊ฐ€์ง€)
โ—‡CPaintDC
WM_PAINT ๋ฉ”์‹œ์ง€ ํ•ธ๋“ค๋Ÿฌ์—์„œ๋งŒ ์‚ฌ์šฉ ๊ฐ€๋Šฅ
ํด๋ผ์ด์–ธํŠธ ์˜์—ญ์—๋งŒ ์ถœ๋ ฅ ๊ฐ€๋Šฅ

ํด๋ž˜์Šคํ˜•ํƒœ์˜ dc
#private : pen, brush, font
#public : textout, selectObject, create

#Textout
x,y์ขŒํ‘œ์—์„œ๋ถ€ํ„ฐ ๊ธ€์”จ๋ฅผ ์“ด๋‹ค

pDC->TextOut(100,100, "Hello World"); //ASCII์ฝ”๋“œ pDC->TextOut(100,100,_T"Hello World"); //๋ฉ€ํ‹ฐ๋ฐ”์ดํŠธ์ฝ”๋“œ pDC->TextOut(100,100, L"Hello World"); //์œ ๋‹ˆ์ฝ”๋“œ

#DrawText
์˜์—ญ์„ ์ •ํ•˜๊ณ  ๊ธ€์”จ๋ฅผ ์“ด๋‹ค.
๋‹ค์–‘ํ•œ ์˜ต์…˜์ด์žˆ์Œ
-๊ธ€์ž๊ฐ€ ๋“ค์–ด๊ฐ€๊ณ 
-๋ช‡๊ฐœ๊นŒ์ง€ ์“ธ๊ฒƒ์ด๋ƒ
-์ •๋ ฌ์˜์—ญ (๋‘๊ฐœ์˜ ์ ์ด ํ•˜๋‚˜์˜ ์˜์—ญ์„ ๋งŒ๋“ฌ)


โ—‡CClientDC
WM_PAINT ๋ฉ”์ง€์‹œ ํ•ธ๋“ค๋Ÿฌ๋ฅผ ์ œ์™ธํ•œ ๊ณณ์—์„œ ์‚ฌ์šฉ ๊ฐ€๋Šฅ
ํด๋ผ์ด์–ธํŠธ ์˜์—ญ์—๋งŒ ์ถœ๋ ฅ ๊ฐ€๋Šฅ

void CChildView::OnLButtonDown(UINT nFlags, CPoint point) { CClientDC dc(this); dc.Rectangle(point.x-20, point.y-20, point.x+20, point.y+20); }

โ—‡CWindowDC
์œˆ๋„์šฐ ์ „์ฒด(ํด๋ผ์ด์–ธํŠธ+๋น„ํด๋ผ์ด์–ธํŠธ)์˜์—ญ์— ์ถœ๋ ฅ
CPaintDC/CClientDC ํด๋ž˜์Šค์™€ ์‚ฌ์šฉ๋ฒ• ๋™์ผ
๋‹จ, ์ขŒํ‘œ์˜ ์›์  ์œ„์น˜๊ฐ€ ๋‹ค๋ฆ„

๋””๋ฐ”์ด์Šค ์ปจํ…์ŠคํŠธ๋ณ„ ์›์  ์œ„์น˜


โ—‡CMetaFileDC
-๋ฉ”ํƒ€ํŒŒ์ผ(Metafile)
GDI ๋ช…๋ น์„ ์ €์žฅํ•  ์ˆ˜ ์žˆ๋Š” ํŒŒ์ผ

-CMetaFileDC ์‚ฌ์šฉ ๋ฐฉ๋ฒ•
โ‘  CMetaFileDC ๊ฐ์ฒด๋ฅผ ๋งŒ๋“ค๊ณ , CMetaFileDC:: CreateEnhanced() ํ•จ์ˆ˜๋กœ ์ดˆ๊ธฐํ™”ํ•œ๋‹ค.
โ‘ก ํ™•์žฅ ๋ฉ”ํƒ€ํŒŒ์ผ ๊ฐ์ฒด๋ฅผ ์ผ๋ฐ˜ ๋””๋ฐ”์ด์Šค ์ปจํ…์ŠคํŠธ ๊ฐ์ฒด๋กœ ๊ฐ„์ฃผํ•˜์—ฌ ์ถœ๋ ฅ ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•œ๋‹ค.
โ‘ข CMetaFileDC::CloseEnhanced() ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•˜์—ฌ ํ™•์žฅ ๋ฉ”ํƒ€ํŒŒ์ผ ํ•ธ๋“ค(HENHMETAFILE ํƒ€์ž…)์„ ์–ป๋Š”๋‹ค.
โ‘ฃ ํ™•์žฅ ๋ฉ”ํƒ€ํŒŒ์ผ ํ•ธ๋“ค์„ CDC::PlayMetaFile() ํ•จ์ˆ˜์— ์ „๋‹ฌํ•˜์—ฌ ์žฌ์ƒํ•˜๋ฉด ์ €์žฅ๋œ GDI ๋ช…๋ น๋“ค์ด ์ˆ˜ํ–‰๋œ๋‹ค.
โ‘ค ํ™•์žฅ ๋ฉ”ํƒ€ํŒŒ์ผ ์‚ฌ์šฉ์ด ๋๋‚˜๋ฉด ํ•ธ๋“ค์„ ::DeleteEnhMetaFile() API ํ•จ์ˆ˜์— ์ „๋‹ฌํ•˜์—ฌ ์‚ญ์ œํ•œ๋‹ค.