๐ Visual C++ MFC 2017, ์ฝ๊ณ ๋น ๋ฅด๊ฒ ์๋์ฐ ํ๋ก๊ทธ๋๋ฐ ๋ง์คํฐํ๊ธฐ: ์ด๋ณด์๋ฅผ ์
ํ ํ์คํ ๊ฐ์ด๋!
๋ชฉ์ฐจ
- ์๋ก : ์ Visual C++ MFC์ธ๊ฐ?
- Visual C++ 2017 ๊ฐ๋ฐ ํ๊ฒฝ ์ค์
- Visual Studio 2017 ์ค์น ๋ฐ MFC ๊ตฌ์ฑ ์์ ํ์ธ
- ์ MFC ํ๋ก์ ํธ ์์ฑํ๊ธฐ
- MFC ๊ธฐ์ด: ์๋์ฐ์ ๋ฉ์์ง ๋ฃจํ ์ดํด
- MFC์ ํต์ฌ ๊ตฌ์กฐ:
CWinApp,CFrameWnd,CDocument,CView - ๋ฉ์์ง ๋งต(Message Map)๊ณผ ๋ฉ์์ง ์ฒ๋ฆฌ ์๋ฆฌ
- MFC์ ํต์ฌ ๊ตฌ์กฐ:
- ๋ฆฌ์์ค ํธ์ง๊ธฐ๋ฅผ ํ์ฉํ UI ๋์์ธ ๊ฐ์ํ
- ๋ํ ์์(Dialog Box) ๊ธฐ๋ฐ ํ๋ก์ ํธ ํ์ฉ
- ์ปจํธ๋กค(Control) ๋ฐฐ์น ๋ฐ ์์ฑ ์ค์
- ์์ฃผ ์ฌ์ฉ๋๋ ์ปจํธ๋กค ๋ค๋ฃจ๊ธฐ
- ๋ฒํผ(Button) ์ด๋ฒคํธ ์ฒ๋ฆฌ:
BN_CLICKED - ์๋ํธ ์ปจํธ๋กค(Edit Control)๋ก ๋ฐ์ดํฐ ์ ์ถ๋ ฅ
- ๋ฆฌ์คํธ ์ปจํธ๋กค(List Control)๋ก ๋ฐ์ดํฐ ๋ชฉ๋ก ํ์
- ๋ฒํผ(Button) ์ด๋ฒคํธ ์ฒ๋ฆฌ:
- MFC์ ํต์ฌ ๊ธฐ๋ฅ: ๋ฐ์ดํฐ ๊ตํ (DDX/DDV)
- DDX(Dialog Data Exchange)๋ฅผ ์ด์ฉํ ์ปจํธ๋กค-๋ณ์ ๊ฐ ๋ฐ์ดํฐ ๋๊ธฐํ
- DDV(Dialog Data Validation)๋ฅผ ์ด์ฉํ ์ฌ์ฉ์ ์ ๋ ฅ ๊ฒ์ฆ
- ๊ฐ๋จํ ์ ํ๋ฆฌ์ผ์ด์
์ ์ ์ค์ต ์์ : ๊ณ์ฐ๊ธฐ
- UI ๊ตฌ์ฑ ๋ฐ ์ด๋ฒคํธ ํธ๋ค๋ฌ ์ถ๊ฐ
- ๊ฐ๋จํ ์ฌ์น์ฐ์ฐ ๋ก์ง ๊ตฌํ
- ๊ฒฐ๋ก : MFC๋ก ์๋์ฐ ํ๋ก๊ทธ๋๋ฐ์ ๋ฌธ์ ์ด๋ค
1. ์๋ก : ์ Visual C++ MFC์ธ๊ฐ?
์๋์ฐ ์ด์์ฒด์ (OS)์์ ๊ตฌ๋๋๋ ๋ฐ์คํฌํฑ ์ ํ๋ฆฌ์ผ์ด์ ์ ๊ฐ๋ฐํ๋ ๋ฐฉ๋ฒ์ ๋ค์ํ์ง๋ง, ์ค๋ ๊ธฐ๊ฐ ๋์ ์์ ์ฑ๊ณผ ์ฑ๋ฅ์ ์ธ์ ๋ฐ์ ์จ ์ ํต์ ์ธ ๋ฐฉ๋ฒ ์ค ํ๋๋ ๋ง์ดํฌ๋ก์ํํธ์ **Visual C++ MFC(Microsoft Foundation Classes)**๋ฅผ ํ์ฉํ๋ ๊ฒ์ ๋๋ค. ํนํ 2017๋ ๋ฒ์ ์ Visual C++ ํ๊ฒฝ์ ์์ ์ ์ธ ๊ฐ๋ฐ ๋๊ตฌ์ ํจ๊ป MFC ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์ ๊ณตํ์ฌ, C++์ ๊ฐ๋ ฅํ ๊ธฐ๋ฅ๊ณผ ์๋์ฐ API์ ์ ๊ทผ์ฑ์ ๊ฒฐํฉํ ๋น ๋ฅธ ๊ฐ๋ฐ์ด ๊ฐ๋ฅํฉ๋๋ค. MFC๋ ๋ณต์กํ ์๋์ฐ API ํธ์ถ์ ๊ฐ์ฒด ์งํฅ์ ์ผ๋ก ์ถ์ํํ์ฌ, ๊ฐ๋ฐ์๊ฐ UI ์์์ ์ ํ๋ฆฌ์ผ์ด์ ๋ก์ง์ ์ง์คํ ์ ์๋๋ก ๋์ต๋๋ค. ๋น๋ก ์ต๊ทผ์๋ C#/.NET, WPF ๋ฑ์ ์๋ก์ด ๊ธฐ์ ๋ค์ด ๋ฑ์ฅํ์ง๋ง, ์ฌ์ ํ ๋์ ์ฑ๋ฅ, ์๋์ฐ OS์ ๊น์ ์ดํด, ๋ ๊ฑฐ์ ์์คํ ์ ์ง๋ณด์ ๋ฑ์ ์ด์ ๋ก MFC๋ ์ค์ํ ์์น๋ฅผ ์ฐจ์งํ๊ณ ์์ต๋๋ค. ์ด ๊ธ์ Visual C++ 2017 ํ๊ฒฝ์์ MFC๋ฅผ ํ์ฉํ์ฌ ์๋์ฐ ํ๋ก๊ทธ๋๋ฐ์ ์ฝ๊ณ ๋น ๋ฅด๊ฒ ์์ํ ์ ์๋ ๊ตฌ์ฒด์ ์ด๊ณ ์ค์ฉ์ ์ธ ๋ฐฉ๋ฒ์ ์ ์ํฉ๋๋ค.
2. Visual C++ 2017 ๊ฐ๋ฐ ํ๊ฒฝ ์ค์
Visual Studio 2017 ์ค์น ๋ฐ MFC ๊ตฌ์ฑ ์์ ํ์ธ
Visual C++ MFC ํ๋ก์ ํธ๋ฅผ ์์ํ๊ธฐ ์ํด์๋ ๋จผ์ Visual Studio 2017์ด ์ค์น๋์ด ์์ด์ผ ํฉ๋๋ค. ์ค์น ๊ณผ์ ์์ ๋ฐ๋์ 'C++๋ฅผ ์ฌ์ฉํ ๋ฐ์คํฌํฑ ๊ฐ๋ฐ' ์ํฌ๋ก๋๋ฅผ ์ ํํด์ผ ํ๋ฉฐ, ์ ํ๋ ์ํฌ๋ก๋์ ๊ฐ๋ณ ๊ตฌ์ฑ ์์ ๋ชฉ๋ก์์ 'MFC ๋ฐ ATL ์ง์(x86 ๋ฐ x64)' ํญ๋ชฉ์ด ์ฒดํฌ๋์ด ์๋์ง ํ์ธํด์ผ ํฉ๋๋ค. ์ด ๊ตฌ์ฑ ์์๊ฐ MFC ๋ผ์ด๋ธ๋ฌ๋ฆฌ ๋ฐ ๊ด๋ จ ๊ฐ๋ฐ ๋๊ตฌ๋ฅผ ํฌํจํฉ๋๋ค. ์ค์น๊ฐ ์๋ฃ๋๋ฉด, ์๋์ฐ ํ๋ก๊ทธ๋๋ฐ์ ์ํ ๊ฐ๋ ฅํ IDE(Integrated Development Environment)๊ฐ ์ค๋น๋ ๊ฒ์ ๋๋ค.
์ MFC ํ๋ก์ ํธ ์์ฑํ๊ธฐ
Visual Studio 2017์ ์คํํ๊ณ 'ํ์ผ' $\rightarrow$ '์๋ก ๋ง๋ค๊ธฐ' $\rightarrow$ 'ํ๋ก์ ํธ'๋ฅผ ์ ํํฉ๋๋ค. 'Visual C++' ํ ํ๋ฆฟ ๋ชฉ๋ก์์ **'MFC ์์ฉ ํ๋ก๊ทธ๋จ'**์ ์ ํํ๊ณ ํ๋ก์ ํธ ์ด๋ฆ์ ์ง์ ํฉ๋๋ค. MFC ์์ฉ ํ๋ก๊ทธ๋จ ๋ง๋ฒ์ฌ(Wizard)๊ฐ ๋ํ๋๋ฉด, ๊ฐ๋ฐํ๊ณ ์ ํ๋ ์ ํ๋ฆฌ์ผ์ด์ ์ ์ข ๋ฅ(์: ๋จ์ผ ๋ฌธ์, ๋ค์ค ๋ฌธ์, ๋ํ ์์ ๊ธฐ๋ฐ ๋ฑ)๋ฅผ ์ ํํฉ๋๋ค. ์ด๋ณด์๊ฐ ๊ฐ์ฅ ์ฝ๊ณ ๋น ๋ฅด๊ฒ ๊ฒฐ๊ณผ๋ฅผ ํ์ธํ ์ ์๋ ๋ฐฉ๋ฒ์ '๋ํ ์์ ๊ธฐ๋ฐ(Dialog Based)' ์ ํ๋ฆฌ์ผ์ด์ ์ ์ ํํ๋ ๊ฒ์ ๋๋ค. ์ด ๋ฐฉ์์ ๋ณ๋์ ๋ฉ๋ด๋ ๋๊ตฌ ๋ชจ์ ์์ด ํ๋์ ๋ฉ์ธ ๋ํ ์์์์ ๋ชจ๋ UI ๊ตฌ์ฑ ์์๋ฅผ ๋ค๋ฃจ์ด ์ง๊ด์ ์ ๋๋ค. ๋ง๋ฒ์ฌ์ ๋๋จธ์ง ์ค์ ์ ๊ธฐ๋ณธ๊ฐ์ผ๋ก ์ ์งํ๊ฑฐ๋ ํ์์ ๋ฐ๋ผ ๋ณ๊ฒฝํ ํ '๋ง์นจ'์ ๋๋ฌ ํ๋ก์ ํธ๋ฅผ ์์ฑํฉ๋๋ค.
3. MFC ๊ธฐ์ด: ์๋์ฐ์ ๋ฉ์์ง ๋ฃจํ ์ดํด
MFC์ ํต์ฌ ๊ตฌ์กฐ: CWinApp, CFrameWnd, CDocument, CView
MFC๋ ์๋์ฐ API์ ๋ณต์ก์ฑ์ ๊ฐ์ฒด ์งํฅ์ ์ผ๋ก ์บก์ํํ ํด๋์ค ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ๋๋ค. ํนํ ๋ฌธ์/๋ทฐ ์ํคํ ์ฒ(Document/View Architecture)๋ MFC์ ํต์ฌ ์ค๊ณ ์์น ์ค ํ๋์ ๋๋ค.
CWinApp: ์ ํ๋ฆฌ์ผ์ด์ ์์ฒด๋ฅผ ๋ํ๋ด๋ ํด๋์ค๋ก, ํ๋ก๊ทธ๋จ ์ด๊ธฐํ ๋ฐ ์ข ๋ฃ๋ฅผ ๋ด๋นํฉ๋๋ค. ๋ชจ๋ MFC ์ ํ๋ฆฌ์ผ์ด์ ์ ์ด ํด๋์ค๋ฅผ ์์๋ฐ์ ํ๋์ ๊ฐ์ฒด๋ฅผ ๊ฐ์ง๋๋ค.CFrameWnd: ์๋์ฐ์ 'ํ'์ ๋ํ๋ด๋ ํด๋์ค๋ก, ์ ๋ชฉ ํ์์ค, ๋ฉ๋ด, ๊ฒฝ๊ณ ๋ฑ์ ๊ด๋ฆฌํฉ๋๋ค.CDocument: ์ ํ๋ฆฌ์ผ์ด์ ์์ ์ฒ๋ฆฌํ๋ ๋ฐ์ดํฐ๋ฅผ ๊ด๋ฆฌํฉ๋๋ค. ํ์ผ ์ ์ถ๋ ฅ, ๋ฐ์ดํฐ ์ ์ฅ ๋ฐ ๋ถ๋ฌ์ค๊ธฐ ๊ธฐ๋ฅ์ ๋ด๋นํฉ๋๋ค.CView: ๋ฐ์ดํฐ๋ฅผ ์ฌ์ฉ์์๊ฒ ํ์ํ๊ณ ์ฌ์ฉ์ ์ ๋ ฅ์ ๋ฐ๋ ์ญํ ์ ํฉ๋๋ค.CDocument์ ์ฐ๊ฒฐ๋์ด ๋ฐ์ดํฐ๋ฅผ ์๊ฐ์ ์ผ๋ก ํํํฉ๋๋ค.
๋ํ ์์ ๊ธฐ๋ฐ ์ ํ๋ฆฌ์ผ์ด์
์ ๊ฒฝ์ฐ, ์ฃผ๋ก CDialogEx ํด๋์ค๋ฅผ ์์๋ฐ์ ํด๋์ค๊ฐ ๋ฉ์ธ ์๋์ฐ ์ญํ ์ ํ๋ฉฐ, ์๋์ ์ผ๋ก ๊ฐ๋จํ ๊ตฌ์กฐ๋ฅผ ๊ฐ์ง๋๋ค.
๋ฉ์์ง ๋งต(Message Map)๊ณผ ๋ฉ์์ง ์ฒ๋ฆฌ ์๋ฆฌ
์๋์ฐ ํ๋ก๊ทธ๋๋ฐ์ ๊ธฐ๋ณธ์ ์ผ๋ก ์ด๋ฒคํธ ๊ตฌ๋(Event-Driven) ๋ฐฉ์์
๋๋ค. ์ฌ์ฉ์ ์
๋ ฅ(ํด๋ฆญ, ํค ์
๋ ฅ), ์๋์ฐ ์์คํ
์ด๋ฒคํธ(ํฌ๊ธฐ ๋ณ๊ฒฝ, ์ฐฝ ๋ซ๊ธฐ) ๋ฑ์ ๋ชจ๋ '๋ฉ์์ง(Message)' ํํ๋ก ๋ฐ์ํฉ๋๋ค. MFC์์๋ ์ด ๋ฉ์์ง๋ฅผ ์ฒ๋ฆฌํ๊ธฐ ์ํด **๋ฉ์์ง ๋งต(Message Map)**์ด๋ผ๋ ๋ฉ์ปค๋์ฆ์ ์ฌ์ฉํฉ๋๋ค. ๊ฐ๋ฐ์๋ ํน์ ๋ฉ์์ง(์: ๋ฒํผ ํด๋ฆญ)๊ฐ ๋ฐ์ํ์ ๋ ํธ์ถ๋ ํจ์(๋ฉ์์ง ํธ๋ค๋ฌ)๋ฅผ ๋ฉ์์ง ๋งต์ ๋ฑ๋กํฉ๋๋ค. ON_BN_CLICKED(ID, HandlerFunc)์ ๊ฐ์ ๋งคํฌ๋ก๋ฅผ ์ฌ์ฉํ์ฌ ํน์ ์ปจํธ๋กค์ ์ด๋ฒคํธ๋ฅผ ํด๋น ํด๋์ค ๋ฉค๋ฒ ํจ์์ ์ฐ๊ฒฐํฉ๋๋ค. Visual Studio๋ ํด๋์ค ๋ง๋ฒ์ฌ(Class Wizard)๋ฅผ ํตํด ์ด ๊ณผ์ ์ ์๋ํํด ์ฃผ๋ฏ๋ก, ๊ฐ๋ฐ์๋ ์์ฝ๊ฒ ์ด๋ฒคํธ ํธ๋ค๋ฌ๋ฅผ ์ถ๊ฐํ๊ณ ๋น์ฆ๋์ค ๋ก์ง์ ๊ตฌํํ ์ ์์ต๋๋ค.
4. ๋ฆฌ์์ค ํธ์ง๊ธฐ๋ฅผ ํ์ฉํ UI ๋์์ธ ๊ฐ์ํ
๋ํ ์์(Dialog Box) ๊ธฐ๋ฐ ํ๋ก์ ํธ ํ์ฉ
์์ ์ธ๊ธํ๋ฏ์ด, ๋ํ ์์ ๊ธฐ๋ฐ ํ๋ก์ ํธ๋ UI ๋์์ธ์ ๋น ๋ฅด๊ฒ ์์ํ ์ ์๋ ๊ฐ์ฅ ์ข์ ๋ฐฉ๋ฒ์ ๋๋ค. ๋ฉ์ธ ๋ํ ์์์ ๋ ์ด์์์ **๋ฆฌ์์ค ๋ทฐ(Resource View)**์ Dialog ํญ๋ชฉ์์ ํ์ธํ ์ ์์ผ๋ฉฐ, **๋ฆฌ์์ค ํธ์ง๊ธฐ(Resource Editor)**๋ฅผ ํตํด ์๊ฐ์ ์ผ๋ก ๋์์ธํ ์ ์์ต๋๋ค. ๋ฆฌ์์ค ํธ์ง๊ธฐ๋ WYSIWYG(What You See Is What You Get) ๋ฐฉ์์ ์ ๊ณตํ์ฌ, ๋ง์น ๊ทธ๋ฆผ์ ๊ทธ๋ฆฌ๋ฏ์ด ์๋์ฐ ํ๋ฉด์ ๊ตฌ์ฑํ ์ ์์ต๋๋ค.
์ปจํธ๋กค(Control) ๋ฐฐ์น ๋ฐ ์์ฑ ์ค์
๋ฆฌ์์ค ํธ์ง๊ธฐ๋ฅผ ์ด๋ฉด ๋๊ตฌ ์์(Toolbox) ์ฐฝ์์ ๋ฒํผ, ์๋ํธ ๋ฐ์ค, ์ฒดํฌ ๋ฐ์ค ๋ฑ ๋ค์ํ ํ์ค ์๋์ฐ ์ปจํธ๋กค๋ค์ ๋๋๊ทธ ์ค ๋๋กญ์ผ๋ก ๋ํ ์์์ ๋ฐฐ์นํ ์ ์์ต๋๋ค. ๊ฐ ์ปจํธ๋กค์ ์ ํํ๊ณ **์์ฑ ์ฐฝ(Properties Window)**์ ํตํด ์ปจํธ๋กค์ ID(์: IDC_BUTTON_CALC), ์บก์
(Caption), ํฌ๊ธฐ, ์คํ์ผ ๋ฑ์ ์์ฑ์ ์ค์ ํ ์ ์์ต๋๋ค. ์ฌ๊ธฐ์ ์ค์ ๋ ์ปจํธ๋กค ID๋ ์ฝ๋์์ ํด๋น ์ปจํธ๋กค์ ์๋ณํ๊ณ ์ ๊ทผํ๋ ๋ฐ ์ฌ์ฉ๋๋ ํต์ฌ ์์์
๋๋ค. UI ๋์์ธ์ ์ฝ๋ ์์ฑ ์ด์ ์ ์๊ฐ์ ์ผ๋ก ์์ฑํ ์ ์์ด ๊ฐ๋ฐ ์๋๊ฐ ํ์ ํ ๋นจ๋ผ์ง๋๋ค.
5. ์์ฃผ ์ฌ์ฉ๋๋ ์ปจํธ๋กค ๋ค๋ฃจ๊ธฐ
๋ฒํผ(Button) ์ด๋ฒคํธ ์ฒ๋ฆฌ: BN_CLICKED
๋ฒํผ์ ์ฌ์ฉ์ ์ํธ ์์ฉ์ ๊ฐ์ฅ ๊ธฐ๋ณธ์ ์ธ ์์์
๋๋ค. ๋ฒํผ์ ํด๋ฆญํ์ ๋ ํน์ ์์
์ ์ํํ๋๋ก ํ๋ ค๋ฉด, ํด๋น ๋ฒํผ์ BN_CLICKED ๋ฉ์์ง์ ๋ํ ์ด๋ฒคํธ ํธ๋ค๋ฌ ํจ์๋ฅผ ์ถ๊ฐํด์ผ ํฉ๋๋ค. ๊ฐ์ฅ ์ฌ์ด ๋ฐฉ๋ฒ์ ๋ฆฌ์์ค ํธ์ง๊ธฐ์์ ๋ฒํผ์ ๋๋ธ ํด๋ฆญํ๋ ๊ฒ์
๋๋ค. Visual Studio๊ฐ ์๋์ผ๋ก ํค๋ ํ์ผ(.h)๊ณผ ์์ค ํ์ผ(.cpp)์ ์ด๋ฒคํธ ํธ๋ค๋ฌ์ ์ ์์ ๊ตฌํ์ ์์ฑํด ์ค๋๋ค. ์์ฑ๋ ํจ์ ๋ด๋ถ์ ๋ฒํผ ํด๋ฆญ ์ ์คํํ ์ฝ๋๋ฅผ ์์ฑํ๋ฉด ๋ฉ๋๋ค. ์๋ฅผ ๋ค์ด, void CMyDialog::OnBnClickedButtonCalc() ํจ์ ๋ด๋ถ์ ๊ณ์ฐ ๋ก์ง์ ๊ตฌํํ ์ ์์ต๋๋ค.
์๋ํธ ์ปจํธ๋กค(Edit Control)๋ก ๋ฐ์ดํฐ ์ ์ถ๋ ฅ
์๋ํธ ์ปจํธ๋กค์ ์ฌ์ฉ์๋ก๋ถํฐ ํ
์คํธ๋ฅผ ์
๋ ฅ๋ฐ๊ฑฐ๋ ๊ฒฐ๊ณผ๋ฅผ ์ถ๋ ฅํ๋ ๋ฐ ์ฌ์ฉ๋ฉ๋๋ค. ์ปจํธ๋กค์ ์์ฑ์์ '์ฝ๊ธฐ ์ ์ฉ(Read-only)' ์ค์ ์ ํตํด ์ถ๋ ฅ ์ ์ฉ์ผ๋ก ์ฌ์ฉํ ์๋ ์์ต๋๋ค. ์๋ํธ ์ปจํธ๋กค์ ์ ๊ทผํ์ฌ ๋ฐ์ดํฐ๋ฅผ ์ฝ๊ฑฐ๋ ์ฐ๊ธฐ ์ํด์๋ ๋ค์ ์ ์์ ์ค๋ช
ํ DDX ๊ธฐ๋ฅ์ ํ์ฉํ๊ฑฐ๋, CEdit ํด๋์ค์ ๊ฐ์ฒด๋ฅผ ํตํด GetWindowText()๋ SetWindowText()์ ๊ฐ์ ๋ฉค๋ฒ ํจ์๋ฅผ ์ง์ ํธ์ถํ์ฌ ๋ฐ์ดํฐ๋ฅผ ์ฒ๋ฆฌํ ์ ์์ต๋๋ค.
๋ฆฌ์คํธ ์ปจํธ๋กค(List Control)๋ก ๋ฐ์ดํฐ ๋ชฉ๋ก ํ์
๋ฆฌ์คํธ ์ปจํธ๋กค(CListCtrl)์ ๋ณต์กํ ๋ฐ์ดํฐ๋ฅผ ์ด(Column)๊ณผ ํ(Row)์ผ๋ก ๊ตฌ์ฑ๋ ๋ชฉ๋ก ํํ๋ก ๋ณด์ฌ์ค ๋ ์ ์ฉํฉ๋๋ค. ํ์๊ธฐ์ ํ์ผ ๋ชฉ๋ก๊ณผ ๊ฐ์ ํํ๋ฅผ ๊ตฌํํ ์ ์์ต๋๋ค. ๋ฆฌ์คํธ ์ปจํธ๋กค์ ์ฌ์ฉํ๋ ค๋ฉด ๋จผ์ ํค๋๋ฅผ ์ค์ ํ๊ณ (InsertColumn), ๊ฐ ํ์ ์์ดํ
์ ์ถ๊ฐ(InsertItem)ํ ํ, ํด๋น ์์ดํ
์ ์๋ธ ์์ดํ
(Sub Item)์ ๋ฐ์ดํฐ๋ฅผ ์ฑ์ ๋ฃ๋(SetItemText) ๊ณผ์ ์ ๊ฑฐ์นฉ๋๋ค. ์ด๋ ๋ฐ์ดํฐ ๋ชฉ๋ก์ ํจ๊ณผ์ ์ผ๋ก ์๊ฐํํ๋ ๋ฐ ํ์์ ์ธ ์ปจํธ๋กค์
๋๋ค.
6. MFC์ ํต์ฌ ๊ธฐ๋ฅ: ๋ฐ์ดํฐ ๊ตํ (DDX/DDV)
DDX(Dialog Data Exchange)๋ฅผ ์ด์ฉํ ์ปจํธ๋กค-๋ณ์ ๊ฐ ๋ฐ์ดํฐ ๋๊ธฐํ
**DDX(Dialog Data Exchange)**๋ MFC ๋ํ ์์ ํ๋ก๊ทธ๋๋ฐ์ ๊ฐ๋ ฅํ ๊ธฐ๋ฅ ์ค ํ๋์
๋๋ค. ์ด๋ ๋ํ ์์์ ์ปจํธ๋กค(์: ์๋ํธ ์ปจํธ๋กค, ์ฒดํฌ ๋ฐ์ค)์ ํ์๋๋ ๋ฐ์ดํฐ์ ํด๋น ๋ํ ์์ ํด๋์ค(์: CMyDialog)์ ๋ฉค๋ฒ ๋ณ์ ์ฌ์ด์ ๋ฐ์ดํฐ๋ฅผ ์๋์ผ๋ก ๋๊ธฐํ(๊ตํ)ํด ์ฃผ๋ ๋ฉ์ปค๋์ฆ์
๋๋ค. ๊ฐ๋ฐ์๋ ์ปจํธ๋กค์ ๋ฐ์ดํฐ๋ฅผ ์ง์ ์ฝ๊ฑฐ๋ ์ธ ํ์ ์์ด, ๋ฉค๋ฒ ๋ณ์์ ๊ฐ์ ๋ณ๊ฒฝํ๊ณ UpdateData(FALSE)๋ฅผ ํธ์ถํ์ฌ ํ๋ฉด์ ๋ฐ์ํ๊ฑฐ๋, UpdateData(TRUE)๋ฅผ ํธ์ถํ์ฌ ํ๋ฉด์ ๋ฐ์ดํฐ๋ฅผ ๋ฉค๋ฒ ๋ณ์์ ๋ก๋ํ ์ ์์ต๋๋ค. ์ด๋ก์จ ๋ฐ์ดํฐ ์ฒ๋ฆฌ ์ฝ๋๊ฐ ํจ์ฌ ๊ฐ๊ฒฐํ๊ณ ๋ช
ํํด์ง๋๋ค. ๋ฉค๋ฒ ๋ณ์์ ์ปจํธ๋กค ID์ ์ฐ๊ฒฐ์ ๋ํ ์์ ํด๋์ค์ DoDataExchange ํจ์ ๋ด๋ถ์์ DDX_Text, DDX_Check ๋ฑ์ ๋งคํฌ๋ก๋ฅผ ํตํด ์ด๋ฃจ์ด์ง๋๋ค.
DDV(Dialog Data Validation)๋ฅผ ์ด์ฉํ ์ฌ์ฉ์ ์ ๋ ฅ ๊ฒ์ฆ
**DDV(Dialog Data Validation)**๋ DDX์ ํจ๊ป ์๋ํ๋ฉฐ, ์ฌ์ฉ์๋ก๋ถํฐ ์
๋ ฅ๋ฐ์ ๋ฐ์ดํฐ์ ์ ํจ์ฑ(์: ์ซ์์ ๋ฒ์, ๋ฌธ์์ด์ ๊ธธ์ด)์ ์๋์ผ๋ก ๊ฒ์ฆํ๋ ๊ธฐ๋ฅ์ ์ ๊ณตํฉ๋๋ค. DDV_MinMaxInt, DDV_MaxChars ๋ฑ์ ๋งคํฌ๋ก๋ฅผ DoDataExchange ํจ์์ ์ถ๊ฐํ์ฌ ์ฌ์ฉํ ์ ์์ต๋๋ค. DDV๋ ์๋ชป๋ ์
๋ ฅ์ด ๊ฐ์ง๋๋ฉด ์ฌ์ฉ์์๊ฒ ์ค๋ฅ ๋ฉ์์ง๋ฅผ ํ์ํ๊ณ ํด๋น ์ปจํธ๋กค๋ก ํฌ์ปค์ค๋ฅผ ์ด๋์์ผ, ๊ฒฌ๊ณ ํ๊ณ ์ฌ์ฉ์ ์นํ์ ์ธ ์ ํ๋ฆฌ์ผ์ด์
์ ๋ง๋๋ ๋ฐ ๊ธฐ์ฌํฉ๋๋ค.
7. ๊ฐ๋จํ ์ ํ๋ฆฌ์ผ์ด์ ์ ์ ์ค์ต ์์ : ๊ณ์ฐ๊ธฐ
UI ๊ตฌ์ฑ ๋ฐ ์ด๋ฒคํธ ํธ๋ค๋ฌ ์ถ๊ฐ
๋น ๋ฅธ ์ค์ต์ ์ํด ๋ํ ์์ ๊ธฐ๋ฐ ํ๋ก์ ํธ๋ฅผ ์ฌ์ฉํ์ฌ ๊ฐ๋จํ ์ฌ์น์ฐ์ฐ ๊ณ์ฐ๊ธฐ๋ฅผ ์ ์ํด ๋ด ์๋ค.
- UI ๊ตฌ์ฑ: ๋ฆฌ์์ค ํธ์ง๊ธฐ์์ ๋ ๊ฐ์ ์ซ์ ์
๋ ฅ์ฉ ์๋ํธ ์ปจํธ๋กค(ID:
IDC_EDIT_NUM1,IDC_EDIT_NUM2), ๊ฒฐ๊ณผ ์ถ๋ ฅ์ฉ ์๋ํธ ์ปจํธ๋กค(ID:IDC_EDIT_RESULT), ๊ทธ๋ฆฌ๊ณ ์ฌ์น์ฐ์ฐ์ ์ํ 4๊ฐ์ ๋ฒํผ(ID:IDC_BUTTON_ADD,IDC_BUTTON_SUB, ...)์ ๋ฐฐ์นํฉ๋๋ค. - DDX ๋ณ์ ์ถ๊ฐ: ํด๋์ค ๋ง๋ฒ์ฌ๋ฅผ ์ด์ฉํ๊ฑฐ๋ ์๋์ผ๋ก, ์ธ ๊ฐ์ ์๋ํธ ์ปจํธ๋กค์ ๋์ํ๋ ๋ฉค๋ฒ ๋ณ์(์:
m_fNum1,m_fNum2,m_fResult- ํ์ ์float๋๋double)๋ฅผ ์ถ๊ฐํ๊ณ DDX๋ฅผ ์ฐ๊ฒฐํฉ๋๋ค.
๊ฐ๋จํ ์ฌ์น์ฐ์ฐ ๋ก์ง ๊ตฌํ
๊ฐ ์ฐ์ฐ ๋ฒํผ(๋ํ๊ธฐ, ๋นผ๊ธฐ ๋ฑ)์ ๋๋ธ ํด๋ฆญํ์ฌ BN_CLICKED ์ด๋ฒคํธ ํธ๋ค๋ฌ๋ฅผ ์ถ๊ฐํฉ๋๋ค. ์๋ฅผ ๋ค์ด, ๋ํ๊ธฐ ๋ฒํผ์ ํธ๋ค๋ฌ๋ ๋ค์๊ณผ ๊ฐ์ด ๊ตฌํ๋ฉ๋๋ค.
void CMyDialog::OnBnClickedButtonAdd()
{
// 1. ํ๋ฉด์ ๋ฐ์ดํฐ๋ฅผ ๋ฉค๋ฒ ๋ณ์๋ก ๊ฐ์ ธ์ต๋๋ค. (DDX ์ฌ์ฉ)
UpdateData(TRUE);
// 2. ์ฌ์น์ฐ์ฐ ๋ก์ง์ ์ํํฉ๋๋ค.
m_fResult = m_fNum1 + m_fNum2;
// 3. ๋ณ๊ฒฝ๋ ๋ฉค๋ฒ ๋ณ์ ๊ฐ์ ํ๋ฉด(๊ฒฐ๊ณผ ์๋ํธ ์ปจํธ๋กค)์ ๋ฐ์ํฉ๋๋ค. (DDX ์ฌ์ฉ)
UpdateData(FALSE);
}
์ด์ ๊ฐ์ด DDX๋ฅผ ํ์ฉํ๋ฉด, ๋ณต์กํ ์๋์ฐ API ํธ์ถ ์์ด ์ธ ์ค์ ๊ฐ๋จํ ์ฝ๋๋ก ์ ์ถ๋ ฅ๊ณผ ๊ณ์ฐ ๋ก์ง์ ๋ถ๋ฆฌํ์ฌ ๊ตฌํํ ์ ์์ต๋๋ค. ๋ค๋ฅธ ์ฐ์ฐ ๋ฒํผ๋ค๋ ์ด์ ๋์ผํ ํจํด์ผ๋ก ๊ตฌํํฉ๋๋ค.
8. ๊ฒฐ๋ก : MFC๋ก ์๋์ฐ ํ๋ก๊ทธ๋๋ฐ์ ๋ฌธ์ ์ด๋ค
Visual C++ 2017๊ณผ MFC๋ฅผ ํ์ฉํ ์๋์ฐ ํ๋ก๊ทธ๋๋ฐ์ C++์ ์ฑ๋ฅ์ ๋ฐํ์ผ๋ก ๋น ๋ฅด๊ณ ์์ ์ ์ธ ๋ฐ์คํฌํฑ ์ ํ๋ฆฌ์ผ์ด์ ์ ๊ฐ๋ฐํ ์ ์๋ ๊ฒ์ฆ๋ ๋ฐฉ๋ฒ์ ๋๋ค. ํนํ ๋ฆฌ์์ค ํธ์ง๊ธฐ๋ฅผ ํตํ ์ง๊ด์ ์ธ UI ๋์์ธ๊ณผ DDX/DDV์ ๊ฐ์ MFC์ ๊ฐ๋ ฅํ ๋ฐ์ดํฐ ๋ฐ์ธ๋ฉ ๋ฉ์ปค๋์ฆ์ ์ด๋ณด์๋ ์๋์ฐ ํ๋ก๊ทธ๋๋ฐ์ ๋ณต์ก์ฑ์ ํฌ๊ฒ ์ค์ด๊ณ ํต์ฌ ๋ก์ง ๊ตฌํ์ ์ง์คํ ์ ์๋๋ก ๋์ต๋๋ค. ๋ณธ ๊ฐ์ด๋์์ ์ ์ํ ๊ฐ๋ฐ ํ๊ฒฝ ์ค์ , MFC์ ๊ธฐ๋ณธ ๊ตฌ์กฐ ์ดํด, ๊ทธ๋ฆฌ๊ณ DDX/DDV ํ์ฉ ๋ฐฉ๋ฒ์ ์์งํ๋ค๋ฉด, ์ฝ๊ณ ๋น ๋ฅด๊ฒ ์ฌ๋ฌ๋ถ๋ง์ ์๋์ฐ ์ ํ๋ฆฌ์ผ์ด์ ์ ์ ์ํ ์ ์์ ๊ฒ์ ๋๋ค. ์ง๊ธ ๋ฐ๋ก Visual Studio 2017์ ์ด๊ณ MFC์ ์ธ๊ณ์ ๋์ ํด ๋ณด์ธ์!
๋ ์์ธํ ์ฐธ๊ณ ์๋ฃ๋ ์๋๋ฅผ ์ฐธ๊ณ ํ์ธ์.
๋ ์์ธํ ์ฐธ๊ณ ์๋ฃ ๋ณด๊ธฐ