์ด ํฌ์คํ ์ ์ฟ ํก ํํธ๋์ค ํ๋์ ์ผํ์ผ๋ก, ์ด์ ๋ฐ๋ฅธ ์ผ์ ์ก์ ์์๋ฃ๋ฅผ ์ ๊ณต๋ฐ์ ์ ์์ต๋๋ค.
MFC์ ๊ตฌ์กฐ
์๋์ฐ ํ๋ก๊ทธ๋๋ฐ ๊ฒฝํ์ด ์๋ค๋ฉด MFC๋ฅผ ์ดํดํ๊ธฐ๊ฐ ์ฌ์ธ ๊ฒ์ด๋ค. ๋ง์ผ ์๋์ฐ ํ๋ก๊ทธ๋๋ฐ ๊ฒฝํ ์ค์๋ SDKํ๋ก๊ทธ๋๋ฐ ๊ฒฝํ์ด ์๋ค๋ฉด ํจ์ฌ ๋ ์ดํดํ๊ธฐ ์ฌ์ธ ๊ฒ์ด๋ค. ์๋ํ๋ฉด MFC๋ SDK์ ๊ตฌ์กฐ๋ฅผ ๊ฑฐ์ ๊ทธ๋๋ก ํด๋์ค๋ก ๊ฐ์ ธ๋ค ๋ง๋ค์๊ธฐ ๋๋ฌธ์ด๋ค. ์ด์ ๋ถํฐ ํ๋ ์ค๋ช
์ ์ฃผ๋ก SDK์ ๊ด๋ จํ ๋ด์ฉ์ด ๋ง๋ค.
MFC์ ํ๋ถ ๊ตฌ์กฐ๊ฐ SDK์ด๊ณ ์ด๋ฒ ์ฅ์ ๊ทธ ๊ตฌ์กฐ๋ฅผ ์ค๋ช
ํ๋ ๋ถ๋ถ์ด๊ธฐ ๋๋ฌธ์ด๋ค. ๋ฐ๋ผ์ SDK ํ๋ก๊ทธ๋๋ฐ์ ํด ๋ณธ ๊ฒฝํ์ด ์๋ค๋ฉด ์ดํดํ๊ธฐ๊ฐ ํ๋ค ๊ฒ์ด๋ค. ํ์ง๋ง ์ด ์ฅ์ MFC์ ๋ด๋ถ๋ฅผ ์ค๋ช
ํ๋ ๋ถ๋ถ์ด๋ฏ๋ก ๋ชฐ๋ผ๋ ๋ณ ์๊ด์ ์์ง๋ง ๋ด์ฉ์ ์ ์ดํดํ๋ค๋ฉฐ ๊ทธ๋งํผ ํ๋ก๊ทธ๋๋ฐ์ ํ๊ธฐ๋ ์ฌ์ธ ๊ฒ์ด๋ค. ์ด์ ๋ถํฐ SDK๋ฅผ ๋ฐํ์ผ๋ก MFC์ ๋ด๋ถ ๊ตฌ์กฐ๊ฐ ์ด๋ค ์์ผ๋ก ๊ตฌ์ฑ๋์ด ์๋์ง C++์ ์ค์ฌ์ผ๋ก ์์๋ณด์.
SDK ์๋์ฐ ํ๋ก๊ทธ๋๋ฐ์ ํ๋ค๋ณด๋ฉด ํธ๋ค์ด๋ ๋ง์ ๋ง์ด ๋ฃ๊ฒ ๋๋ค. ํธ๋ค์ด๋ ์๋์ฐ, ๋๋ฐ์ด์ค ์ปจํ ์คํธ, ๋นํธ๋งต, ๋ฉ๋ชจ๋ฆฌ ๋ฑ์ ์ค๋ธ์ ํธ๋ผ ํ ์ ์๋ ๊ฒ์ ์ง์นญํ๋๋ฐ ์ฌ์ฉ๋๋ค. ํธ๋ค์ ์ด๋ค ์ค๋ธ์ ํธ๋ฅผ ๊ตฌ๋ณํ๊ธฐ ์ํด ์ฌ์ฉํ๋ ์ผ์ข ์ ์ผ๋ จ๋ฒํธ๋ผ๊ณ ์๊ฐํด๋ ๋ ๋ฏํ๋ค. ์๋ฅผ ๋ค์ด ์๋์ฐ ํธ๋ค์ด๋ ๊ฐ ์๋์ฐ๋ฅผ ๊ตฌ๋ณํ๊ธฐ ์ํด ์๋์ฐ๋ณ๋ก ํ ๋น๋ ๋ฒํธ๋ผ๊ณ ์๊ฐํ๋ ๊ฒ์ด๋ค. ์๋์ฐ์ ๊ด๊ณ๋ ๋ชจ๋ API์๋ ์กฐ์ ๋์์ด ๋๋ ์๋์ฐ๋ฅผ ์ง์นญํ๋ ๋ฌด์์ธ๊ฐ๊ฐ ํ์ํ๋ค. ๊ทธ๋์ ๊ทธ๋ฐ API๋ค์ ์ธ์๋ฅผ ์ดํด๋ณด๋ฉด ๊ทธ๋ฐ ์ฉ๋๋ก ์ฌ์ฉ๋๋ ์ธ์๊ฐ ์๋ค .๋ฐ๋ก ๊ทธ ์ธ์๋ก ์๋์ฐ ํธ๋ค์ด ์ฌ์ฉ๋๋ ๊ฒ์ด๋ค. ์๋ฅผ ๋ค์ด ์๋์ฐ์ ํฌ๊ธฐ๋ฅผ ์ป๊ณ ์ถ์ผ๋ฉด GetClientRect API๋ฅผ ์ฌ์ฉํ๋ฉด ๋๋ค. ์ฌ์ฉ๋ฒ์ ๋ค์๊ณผ ๊ฐ๋ค.
RECT rc;
GetClientRect(hwnd, &rc); // hwnd ๋ ์๋์ฐ ํธ๋ค
๋ ์๋์ฐ์ ํฌ๊ธฐ๋ ์์น๋ฅผ ๋ณ๊ฒฝํ๊ณ ์ถ๋ค๋ฉด MoveWindow API๋ฅผ ์ด์ฉํ๋ฉด ๋๋ค.
MoveWindow(hwnd, x, y, x2, y2, TRUE);
์์ ๋ API๋ฅผ ๋ณด๋ฉด ์์ ๋์์ธ ์๋์ฐ๋ฅผ ์ง์นญํ๊ธฐ ์ํด ์ฒซ ๋ฒ์งธ ์ธ์๋ก ์๋์ฐ ํธ๋ค์ ์ ๋ ฅ๋ฐ๊ณ ์์์ ์ ์ ์๋ค. ์ด๋ฐ ์๋์ฐ ํธ๋ค๊ณผ ์๋์ฐ ๊ด๋ จ API๋ฅผ ๋ฐํ์ผ๋ก MFC์์๋ CWnd๋ผ๋ ํด๋์ค๋ฅผ ์์ฑํ์๋ค. CWnd ํด๋์ค์๋ ์๋์ฐ์ ๊ด๋ จ์๋ ๋ชจ๋ SDK์ ํจ์๋ค์ด ๋ค์ด๊ฐ ์๋ค. ์์ ์์ ๋น์ถ์ด ๋ณด์๋ฉด ๋๋ต ๋ค์๊ณผ ๊ฐ์ ๋ชจ์์ ๋ ๊ฒ ๋๋ค.
class CWnd : public CCmdTarget
{
HWND m_hWnd;
.......
BOOL GetClientRect(LPRECT lpRect);
BOOL MoveWindow(int x, int y, int width, int height, BOOL bDraw = TRUE);
........
}
์์ CWnd ํด๋์ค์ ์ ์๋ฅผ ์์ฃผ ์ฝ๊ฐ ๋ณด์๋๋ฐ ์ค์ CWnd ํด๋์ค์ ์ ์๋ฅผ ๋ณด๊ณ ์ถ์ผ๋ฉด MSDEV\MFC\INCLUDE ๋๋ ํ ๋ฆฌ์ ์๋ AFXWIN.H๋ฅผ ๋ณด๊ธฐ ๋ฐ๋๋ค. ์๊ฐ๋ณด๋ค ๋ฉ์น๊ฐ ๊ต์ฅํ ํด ๊ฒ์ด๋ค. AFXWIN.H์๋ MFCํด๋์ค ๋๋ถ๋ถ์ ์ ์๊ฐ ๋ค์ด์๋ค. ์์ CWnd ํด๋์ค๋ฅผ ๋ณด๋ฉด ๋ฐ์ดํฐ ๋ฉค๋ฒ๋ก m_hWnd ๊ฐ ์๋ค. ๋ฐ๋ก ์๋์ฐ ํธ๋ค์ด๋ค.
๋ฉค๋ฒํจ์๋ก๋ ์๋์ฐ์๊ฒ ๋ฌด์์ธ๊ฐ ์์
์ ํ ์ ์๋ ๊ฒ๋ค์ด ์๊ธฐ ๋ง๋ จ์ธ์ผํ
๋ฐ MFC๋ ๊ทธ ํจ์๋ค์ ์ด๋ฆ์ SDK์์์ ๊ฐ์ ์ด๋ฆ์ผ๋ก ์ฌ์ฉํ๊ณ ์๋ค. ์์ ์ดํด๋ณธ ๊ฒ์ฒ๋ผ GetClientRect๋ MoveWindow ์ญ์ SDK์์์ ๊ฐ์ ์ด๋ฆ์ ๊ทธ๋๋ก ์ฌ์ฉํ๊ณ ์์์ ์ ์ ์๋ค. ๊ทธ๋ ๊ธฐ ๋๋ฌธ์ SDK์ ๋ํ ๊ฒฝํ์ด ์๋ ์ฌ๋์ด MFC๋ฅผ ๋ฐฐ์ฐ๊ธฐ๊ฐ ์ ๋ฆฌํ๋ค๋ ๊ฒ์ด๋ค. ์ด๋ค ํจ์๋ ์ค์ ๋ก ์ด๋ป๊ฒ ๊ตฌํ๋์ด ์์๊น? ๋ค์๊ณผ ๊ฐ์ด ๋ฐ์ดํฐ ๋ฉค๋ฒ์ธ m_hWnd๋ฅผ ์ด์ฉํด SDK์ ์๋ ์๋์ฐ API๋ฅผ ๋ฐ๋ก ํธ์ถํด ๋ฒ๋ฆฐ๋ค.
BOOL CWnd::GetClientRect(LPRECT lpRect)
{
::GetClientRect(m_hWnd, lpRect);
}
BOOL MoveWindow(int x, int y, int width, int height, BOOL bDraw = TRUE)
{
::MoveWindow(m_hWnd, x, y, width, height)
}
CWnd ํด๋์ค์ ๋ฉค๋ฒํจ์๋ค์ ๋ณด๋ฉด SDK ํ๋ก๊ทธ๋จ์์ ๋ณผ ์ ์๋ ์ด๋ฆ๋ค์ด ๋ง์์ ์ ์ ์๋๋ฐ ๋ชจ๋ SDK์์์๋ ๋ฌ๋ฆฌ ์ธ์์ค์ ์๋์ฐ ํธ๋ค์ด ๋น ์ ธ์์์ ์ ์ ์์ ๊ฒ์ด๋ค. ๊ทธ ์ด์ ๋ ์์์์ฒ๋ผ ์๋์ฐ ํธ๋ค์ ๋ฐ์ดํฐ ๋ฉค๋ฒ๋ก ์จ๊ฒจ ๋๊ณ ๋์ค์ ์ด์ฉํ๊ธฐ ๋๋ฌธ์ด๋ค.
์ด๋ฐ ๋ฐฉ์์ผ๋ก MFC์ ํด๋์ค๋ ๊ตฌ์ฑ๋์ด ์๋ค. ์ฆ MFC์ ๋ฐ๋ฐํ์ด SDK๋ผ๋ ๋ง์ ์๋ฏธ๋ฅผ ์ดํดํ ์ ์์ ๊ฒ์ด๋ค. ์์ ์๋ฅผ ๋ณด๋ฉด์ MFC๋ SDK ์์ ํ ๊ฒน์ ๋ ์์๋ ์
์ด๋ ์๋๊ฐ ๋ง์ด ๋๋ ค์ง๊ฒ ๊ตฌ๋ ๋ผ๊ณ ์๊ฐํ ์ง๋ ๋ชจ๋ฅด๊ฒ ๋ค. ํ์ง๋ง ๊ผญ ๊ทธ๋ ์ง๋ ์๋ค. ์ฌ์ค ์์ ํจ์๋ค์ ์ธ๋ผ์ธ ํจ์๋ก ์ ์๋์ด ์๊ธฐ ๋๋ฌธ์ ์ปดํ์ผ์ ์์ ๋งคํฌ๋ก์ฒ๋ผ ์นํ๋์ด ๋ฒ๋ฆฌ๊ธฐ ๋๋ฌธ์ด๋ค. MFC์์ ์ง์ SDK API๋ฅผ ๋ถ๋ฅด๋ ๋ชจ๋ ํจ์๋ ์ธ๋ผ์ธ ํจ์๋ก ๊ตฌํ๋์ด ์๋ค. MFC์ ์ธ๋ผ์ธ ํจ์๋ \MSDEV\MFC\INCLUDE ๋๋ ํ ๋ฆฌ์ ๊ฐ๋ณด๋ฉด *.inl ์ด๋ผ๋ ํ์ผ๋ค์ด ์์ํ
๋ฐ ๊ฑฐ๊ธฐ์ ๋ชจ๋ ์ ์๋์ด ์๋ค.
์ด๋ฒ์๋ ๋๋ฐ์ด์ค ์ปจํ
์คํธ๋ฅผ ๊ฐ๊ณ ์๋ฅผ ๋ค์ด๋ณด์. ๋๋ฐ์ด์ค ์ปจํ
์คํธ๋ ์๋์ฐ์์ ์ถ๋ ฅ์ฅ์น์ ๋ฌด์์ธ๊ฐ๋ฅผ ์ถ๋ ฅํ๊ณ ์ ํ๋ฉด ๋ฐ๋์ ํ์ํ๋ค. ๋๋ฐ์ด์ค ์ปจํ
์คํธ๋ ์ถ๋ ฅ๋์์ ์ง์นญํ๋ ๊ฒ์ด๋ผ๊ณ ์๊ฐํ๋ฉด ๋๋ค.
ํ๋ฉด์ ๋ฌด์์ธ๊ฐ๋ฅผ ์ถ๋ ฅํ๊ณ ์ ํ๋ฉด ํ๋ฉด์ ๋ํ ๋๋ฐ์ด์ค ์ปจํ
์คํธ๊ฐ ํ์ํ๊ณ ํ๋ฆฐํฐ์ ๋ฌด์์ธ๊ฐ ์ถ๋ ฅํ๊ณ ์ ํ๋ฉด ์ญ์ ํ๋ฆฐํฐ์ ๋ํ ๋๋ฐ์ด์ค ์ปจํ
์คํธ๊ฐ ํ์ํ๋ค. ๊ทธ๋ฐ๋ฐ ๋๋ฐ์ด์ค ์ปจํ
์คํธ๋ฅผ ์์ฑํ๋ฉด ๊ทธ๊ฒ์ ๋ฒํธ๊ฐ ๋ฆฌํด๋๋ค. ์ด๋ฅผ ์ธ์๋ก ์ถ๋ ฅํจ์๋ฅผ ํธ์ถํ๋ฉด ๊ทธ๋ฆฌ๋ก ์ถ๋ ฅ์ด ๋๊ฐ๋ค. ์๋ฅผ ๋ค์ด ํ๋ฉด์ ์ฌ๊ฐํ๊ณผ ํ
์คํธ๋ฅผ ์ถ๋ ฅํ๊ณ ์ ํ๋ค๋ฉด Rectangle ์ด๋ผ๋ ํจ์์ TextOut ์ด๋ ํจ์๋ฅผ ์ด์ฉํ๋ฉด ๋๋ค.
HDC hDC = GetDC(hWnd); // ํ๋ฉด์ ๋ํ ๋๋ฐ์ด์ค ์ปจํ ์คํธ๋ฅผ ์ป๋๋ค.
Rectangle(hDC, 10, 10, 100, 100); // ์ฌ๊ฐํ์ ๊ทธ๋ฆฐ๋ค.
TextOut(hDC, 10, 10, "Sample", 6); // ํ
์คํธ๋ฅผ ์ถ๋ ฅํ๋ค.
ReleaseDC(hWnd, hDC); // ํ๋ฉด์ ๋ํ ๋๋ฐ์ด์ค ์ปจํ
์คํธ๋ฅผ ๋ฐํํ๋ค.
GetDC๋ผ๋ ํจ์๊ฐ ๋ฐ๋ก ์๋์ฐ ํ๋ฉด์ ๋ํ ๋๋ฐ์ด์ค ์ปจํ ์คํธ๋ฅผ ์์ฑํ์ฌ ๊ทธ ๋ฒํธ(ํธ๋ค)๋ฅผ ๋๋ ค์ฃผ๋ ํจ์์ด๋ค. Rectangle๊ณผ TextOut๊ณผ ๊ฐ์ด ๋๋ฐ์ด์ค ์ปจํ ์คํธ๋ก์ ์ถ๋ ฅ์ ์ฌ์ฉ๋๋ ํจ์๋ฅผ GDI(Graphic Device Interface) ํจ์๋ผ ํ๋๋ฐ ์ด ํจ์๋ค์ ํน์ง์ ์ถ๋ ฅํจ์์ด๊ธฐ ๋๋ฌธ์ ์ธ์๋ก ์ถ๋ ฅ๋์์ ์ง์นญํ๋ ๋๋ฐ์ด์ค ์ปจํ ์คํธ ํธ๋ค์ด ํ์ํ๋ค๋ ๊ฒ์ด๋ค. MFC์์๋ ์ด๋ฐ GDI๋ค๊ณผ ๋๋ฐ์ด์ค ์ปจํ ์คํธ ํธ๋ค์ CDC๋ผ๋ ํด๋์ค ์์ผ๋ก ์ง์ด๋ฃ์ด ๋ฒ๋ ธ๋ค. CDC๋ ๋ค์๊ณผ ๊ฐ์ ๊ตฌ์กฐ๋ฅผ ๊ฐ๊ณ ์๋ค.
class CDC : public CObject
{
HDC m_hDC;
..............
BOOL Rectangle(int x1, int y1, int x2, int y2);
BOOL TextOut(int x, int y, LPSTR lpstr, int size);
...............
}
์์ CDC ํด๋์ค์ Rectangle ๊ณผ TextOut ๋ฉค๋ฒํจ์๋ ์ด๋ค ๊ตฌ์กฐ๋ฅผ ๊ฐ๊ณ ์์๊น? ์ด๋ ์ ๋ ๊ฐ์ด ์กํ๋ค๋ฉด MFC์ ์กด์ฌํ๋ ํด๋์ค๋ค์ ๊ธฐ๋ณธ๊ตฌ์กฐ๋ ์ ๊ฒ์ด๋ ๋ค๋ฆ์๋ค. (๋ค๋ง ๊ธฐ๋ณธ์ ์ธ ๊ตฌ์กฐ์ผ ๋ฟ์ด์ง๋ง..) ์ ๋ต์ ๋ค์๊ณผ ๊ฐ๋ค.
BOOL CDC::Rectangle(int x1, int y1, int x2, int y2)
{
::Rectangle(m_hDC, x1, y1, x2, y2);
}
BOOL TextOut(int x, int y, LPSTR lpstr, int size)
{
::TextOut(m_hDC, x, y, lpstr, size);
}
CWnd ์์์ฒ๋ผ ๋ด๋ถ์ ์ผ๋ก ์ ์งํ๊ณ ์๋ ๋๋ฐ์ด์ค ์ปจํ ์คํธ ํธ๋ค์ ์ธ์ง๋ก ํ์ฌ SDK์ ์๋ API๋ฅผ ๊ทธ๋๋ก ํธ์ถํ๊ณ ์๋ค. ์์ ๊ฒ ์ญ์ ์ธ๋ผ์ธ ํจ์๋ก ์ ์๋์ด ์๋ค.
๊ฒฐ๋ก ์ ์ผ๋ก MFC์ ํ๋ถ๊ตฌ์กฐ๋ SDK์ ์๋ API๋ก ๋์ด ์์์ ์ ์ ์๋ค. ๊ฒฐ๊ตญ MFC๋ SDK API๋ฅผ ๊ธฐ๋ฅ์ ์ผ๋ก ๊ตฌ๋ถํ์ฌ ๊ทธ ์์ ํด๋์ค๋ ์ท์ ์
ํ ๊ฒ์ด๋ผ ํ ์ ์๋ค. ๊ทธ ๊ธฐ๋ฅ์ ์ธ ๋ถ๋ฅ๊ฐ ์์ ๋ณธ ๊ฒ์ฒ๋ผ ํธ๋ค์ ์ค์ฌ์ผ๋ก ์ด๋ฃจ์ด์ ธ ์๋ค.
์ด๋ ์ด๋๊น์ง๋ ๊ธฐ๋ณธ์ ์ธ ํด๋์ค์ ๊ฒฝ์ฐ์ ํด๋นํ๋ ๊ฒ์ด๊ณ ์ข๋ ๋ณต์กํ๊ณ ๊ฐ๋ ฅํ ๊ธฐ๋ฅ์ ์ ๊ณตํ๋ ํด๋์ค๋ค์ ์ด๋ฅผ ๋ฐํ์ ์กด์ฌํ๊ณ ์๋ค.