โถ์ด๋ฒคํธ ์์คํ
ํ (๋ฉ์์ง) ๋ํด์
โถ๋ฉ์ธ์ง ๊ตฌ๋ ๊ตฌ์กฐ
ํ์ง๋ง ๋๋ถ๋ถ์ ์๋์ฐ ์์ฉ ํ๋ก๊ทธ๋จ์ ์์ฐจ์ ์ผ๋ก ์คํ๋์ง ์๊ณ ์ด๋ค ๋ฉ์์ง๋ฅผ ๋ฐ๋๊ฐ์ ๋ฐ๋ผ ์ฝ๋์ ์คํ ์์๊ฐ ๋ฌ๋ผ์ง๋ค.
์ธ๋ถ์์ ๋ฉ์์ง๋ฅผ ๋ฐ์์ํค๋ ์ด๋ฒคํธ(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 ํจ์์ ์ ๋ฌํ์ฌ ์ญ์ ํ๋ค.