[MFC] Tab Control์ ์ฌ์ฉํ์ง ์๊ณ ์ฌ๋ฌ Form ์ค์์นญํ๊ธฐ(์์ ํฌํจ)
์ง๋ ํฌ์คํ
์์ ๋ฉ์ธ ๋ค์ด์ผ๋ก๊ทธ์ ์๋ก์ด ๋ค์ด์ผ๋ก๊ทธ๋ฅผ ๋ถ์ด๋ ์์ ๋ฅผ ๋ณด์ฌ๋๋ ธ์์ต๋๋ค.
[MFC] Dialog์ Form(Dialog) ๋ถ์ด๊ธฐ(์์ ํฌํจ)
Form ์ค์์นญ? Tab Control๊ณผ ๋ค๋ฅธ ์ ์?
์ด๋ฒ์๋ ์ด ๋ฐฉ๋ฒ์ ์์ฉํ์ฌ ์ฌ๋ฌ Form์ ์ค์์นญํ๋ ๋ฐฉ๋ฒ์ ์๊ฐํ๋ ค๊ณ ํฉ๋๋ค. ์ฌ์ค ์ด ๊ธฐ๋ฅ์ MFC์ Tab Control๊ณผ ๋์ผํ ๊ธฐ๋ฅ์ธ๋ฐ์. ์์๋ค์ํผ MFC UI ์ปจํธ๋กค์ ์ปค์คํฐ๋ง์ด์ง์๋ ํ๊ณ๊ฐ ์์ต๋๋ค. ํ์ง๋ง ์ด๋ฒ์ ์๊ฐํ๋ ๋ฐฉ๋ฒ์ ์ด๋ ต์ง๋ ์๊ณ ์ฌ์ฉ์๊ฐ ์ํ๋๋๋ก ๊พธ๋ฐ ์ ์๋ค๋ ๊ฒ์ด ์ฅ์ ์ ๋๋ค.
๋จผ์ ๋์์ ๋ณด์ฌ๋๋ฆฌ๊ฒ ์ต๋๋ค.
์ด ์์ ๋ ๋ผ๋์ค ๋ฒํผ์ด ํ์ํฉ๋๋ค. ๋ฌผ๋ก ๊ผญ ๋ผ๋์ค ๋ฒํผ์ผ ํ์๋ ์์ง๋ง, ์ง๊ด์ ์ธ ์๊ฐ ํจ๊ณผ๋ฅผ ์ํด ๋ผ๋์ค ๋ฒํผ์ ์ฌ์ฉํ์ต๋๋ค.
์์ ์ฝ๋ Concept
์ด์ ์์ ์ ๋ง์ฐฌ๊ฐ์ง๋ก Main Dialog์ ์ค์์นญ ๋๋ Form์ด ๋ณด์ฌ์ง Picture Control์ ๋ฐฐ์นํฉ๋๋ค. ๊ทธ๋ฆฌ๊ณ Form ๊ฐ์์ ๋์ผํ ๊ฐ์์ Radio Button์ ์ถ๊ฐํฉ๋๋ค. Radio ๋ฒํผ์ด ํด๋ฆญ๋๋ฉด ํด๋น Form์ด ๋ณด์ฌ์ง๋ ๊ฒ์ ๋๋ค.
์ค์์นญ ๋๋ Form์ ํฌ๊ธฐ๊ฐ ์ ๊ฐ๊ฐ์ธ๋ฐ์. Form์ด Picture control๋ณด๋ค ํฌ๋ฉด ์คํฌ๋กค๋ฐ๊ฐ ์์ฑ๋๊ณ , ์์ผ๋ฉด ์์ฑ๋์ง ์์ต๋๋ค.
๋ฐ๋ผ ํ๊ธฐ
์์ ์ฝ๋๋ ๋ณธ๋ฌธ ํ๋จ์ ์ฒจ๋ถ๋์ด ์์ต๋๋ค. ์ค์ํ ๋ถ๋ถ๋ง ์ค๋ช ํ๊ณ , ์์ธํ ๋ด์ฉ์ ์ฒจ๋ถ๋ ์ฝ๋๋ฅผ ์ฐธ๊ณ ํด์ฃผ์ธ์!
๋ฆฌ์์ค ํธ์ง๊ธฐ์์ ์ฌ๋ฌ Dialog๋ฅผ ์ถ๊ฐํฉ๋๋ค. ๋๋ถ์ด, Dialog์ ํด๋์ค๋ฅผ ์ถ๊ฐํ ๋ ๋ฐ๋์ CFormView๋ฅผ ๊ธฐ๋ณธ ํด๋์ค๋ก ์์ฑํฉ๋๋ค. ์๋ ๊ทธ๋ฆผ์ Main Dialog์ UI ๋ฐฐ์น ๋ชจ์ต์ ๋๋ค.
์ค์์นญ ๋ Form์ ์๋ ๊ทธ๋ฆผ๊ณผ ๊ฐ์ด ์์ฑํฉ๋๋ค.
๊ฐ Form ํด๋์ค์ ํค๋ ํ์ผ์๋ ๋ค์๊ณผ ๊ฐ์ด ์ ์ํฉ๋๋ค. ์์ ์์๋ ๊ฐ Form์ ํด๋์ค ๋ช ์ CMyForm1~3์ผ๋ก ์ ์ํ์ต๋๋ค. ๋ํ, ๊ฐ์ ํจ์๋ก Create์ OnInitialUpdate๋ฅผ ์ ์ํฉ๋๋ค.
#pragma once
// CMyForm1 ๋ํ ์์
class CMyForm1 : public CFormView
{
DECLARE_DYNAMIC(CMyForm1)
public:
CMyForm1();
CMyForm1(UINT nIDTemplate);
virtual ~CMyForm1();
// ๋ํ ์์ ๋ฐ์ดํฐ์
๋๋ค.
#ifdef AFX_DESIGN_TIME
enum { IDD = IDD_FORM_FORM1 };
#endif
protected:
virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV ์ง์์
๋๋ค.
DECLARE_MESSAGE_MAP()
public:
virtual BOOL Create(LPCTSTR lpszClassName, LPCTSTR lpszWindowName, DWORD dwStyle, const RECT& rect, CWnd* pParentWnd, UINT nID, CCreateContext* pContext = NULL);
virtual void OnInitialUpdate();
};
Main Dialog์ ํค๋ ํ์ผ์๋ ๋ค์๊ณผ ๊ฐ์ด ์ ์ํฉ๋๋ค. Main Dialog์ Form์ ๋์ ์์ฑํ๋ AllocForms()์ Radio Button์ด ์ ํ๋ ๋, ์ ํ๋ Form์ ๋ณด์ฌ์ฃผ๊ธฐ ์ํ ShowForm(int idx)ํจ์๋ฅผ ์ ์ํฉ๋๋ค.
// ExamFormSwitchingDlg.h: ํค๋ ํ์ผ
//
#pragma once
#include "CMyForm1.h"
#include "CMyForm2.h"
#include "CMyForm3.h"
// CExamFormSwitchingDlg ๋ํ ์์
class CExamFormSwitchingDlg : public CDialogEx
{
// ์์ฑ์
๋๋ค.
public:
CExamFormSwitchingDlg(CWnd* pParent = nullptr); // ํ์ค ์์ฑ์์
๋๋ค.
// ๋ํ ์์ ๋ฐ์ดํฐ์
๋๋ค.
#ifdef AFX_DESIGN_TIME
enum { IDD = IDD_ExamFormSwitching_DIALOG };
#endif
protected:
virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV ์ง์์
๋๋ค.
CMyForm1 *m_pForm1;
CMyForm2 *m_pForm2;
CMyForm3 *m_pForm3;
void AllocForms();
void ShowForm(int idx);
// ๊ตฌํ์
๋๋ค.
protected:
HICON m_hIcon;
// ์์ฑ๋ ๋ฉ์์ง ๋งต ํจ์
virtual BOOL OnInitDialog();
afx_msg void OnSysCommand(UINT nID, LPARAM lParam);
afx_msg void OnPaint();
afx_msg HCURSOR OnQueryDragIcon();
DECLARE_MESSAGE_MAP()
public:
afx_msg void OnDestroy();
afx_msg void OnBnClickedRadioForm1();
afx_msg void OnBnClickedRadioForm2();
afx_msg void OnBnClickedRadioForm3();
};
Form์ด ์์ฑ๋๋ AllocForms()ํจ์๋ ๋ค์๊ณผ ๊ฐ์ด ๊ตฌํํฉ๋๋ค. ๋ฐ๋ณต๋๋ ์ฝ๋๊ฐ ๋ง์ฃ ? ์ด๋ ๊ฒ ๋ฐ๋ณต๋๋ ์ฝ๋๋ ํจ์ํํ๊ฑฐ๋ ์์ ๊ด๊ณ์ ๋ถ๋ชจ ํด๋์ค๋ฅผ ์์ฑํ์ฌ ๊ฐ์ํํ๋ฉด ๊น๋ํ๊ฒ ์ ๋ฆฌํ ์ ์์ต๋๋ค.
void CExamFormSwitchingDlg::AllocForms()
{
CCreateContext context;
ZeroMemory(&context, sizeof(context));
CRect rectOfPanelArea;
GetDlgItem(IDC_STATIC_RECT)->GetWindowRect(&rectOfPanelArea);
ScreenToClient(&rectOfPanelArea);
m_pForm1 = new CMyForm1();
m_pForm1->Create(NULL, NULL, WS_CHILD | WS_VSCROLL | WS_HSCROLL, rectOfPanelArea, this, IDD_FORM_FORM1, &context);
m_pForm1->OnInitialUpdate();
m_pForm1->ShowWindow(SW_SHOW);
m_pForm2 = new CMyForm2();
m_pForm2->Create(NULL, NULL, WS_CHILD | WS_VSCROLL | WS_HSCROLL, rectOfPanelArea, this, IDD_FORM_FORM2, &context);
m_pForm2->OnInitialUpdate();
m_pForm2->ShowWindow(SW_HIDE);
m_pForm3 = new CMyForm3();
m_pForm3->Create(NULL, NULL, WS_CHILD | WS_VSCROLL | WS_HSCROLL, rectOfPanelArea, this, IDD_FORM_FORM3, &context);
m_pForm3->OnInitialUpdate();
m_pForm3->ShowWindow(SW_HIDE);
GetDlgItem(IDC_STATIC_RECT)->DestroyWindow();
}
๋ง์ง๋ง์ผ๋ก ShowForm(int idx)๋ ๋ค์๊ณผ ๊ฐ์ด ๊ตฌํํฉ๋๋ค. ํน์ ์ธ๋ฑ์ค๋ฅผ ์ธ์๋ก ๋๊ธฐ๋ฉด, ํด๋น๋๋ Form์ ๋ณด์ฌ์ฃผ๊ณ ๋๋จธ์ง๋ ์จ๊ธฐ๋ ๊ฒ์ ๋๋ค.
void CExamFormSwitchingDlg::ShowForm(int idx)
{
switch (idx)
{
case 0:
m_pForm1->ShowWindow(SW_SHOW);
m_pForm2->ShowWindow(SW_HIDE);
m_pForm3->ShowWindow(SW_HIDE);
break;
case 1:
m_pForm1->ShowWindow(SW_HIDE);
m_pForm2->ShowWindow(SW_SHOW);
m_pForm3->ShowWindow(SW_HIDE);
break;
case 2:
m_pForm1->ShowWindow(SW_HIDE);
m_pForm2->ShowWindow(SW_HIDE);
m_pForm3->ShowWindow(SW_SHOW);
break;
}
}
์ ๋ง ๊ฐ๋จํ์ฃ ? ์ฌ๊ธฐ์ Radio Button์ ์ปค์คํฐ๋ง์ด์งํ์ฌ ์์๊ฒ ๊พธ๋ฉฐ์ฃผ๋ฉด ๋์ฑ ๋ฉ์ง UI๋ฅผ ๋ง๋ค ์ ์์ต๋๋ค. MFC์์ UI๋ ์ฝ๋ฉํ๊ธฐ ๋๋ฆ์ธ ์ ์ ๊ผญ ๊ธฐ์ตํ์ธ์!
'Programming > MFC' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
๋๊ธ
์ด ๊ธ ๊ณต์ ํ๊ธฐ
-
๊ตฌ๋
ํ๊ธฐ
๊ตฌ๋ ํ๊ธฐ
-
์นด์นด์คํก
์นด์นด์คํก
-
๋ผ์ธ
๋ผ์ธ
-
ํธ์ํฐ
ํธ์ํฐ
-
Facebook
Facebook
-
์นด์นด์ค์คํ ๋ฆฌ
์นด์นด์ค์คํ ๋ฆฌ
-
๋ฐด๋
๋ฐด๋
-
๋ค์ด๋ฒ ๋ธ๋ก๊ทธ
๋ค์ด๋ฒ ๋ธ๋ก๊ทธ
-
Pocket
Pocket
-
Evernote
Evernote
๋ค๋ฅธ ๊ธ
-
[MFC] CFormView ๊ธฐ๋ฐ Dynamic Layout ์ ์ฉํ์ฌ ์ปจํธ๋กค Resizingํ๊ธฐ(์์ ํฌํจ)
[MFC] CFormView ๊ธฐ๋ฐ Dynamic Layout ์ ์ฉํ์ฌ ์ปจํธ๋กค Resizingํ๊ธฐ(์์ ํฌํจ)
2020.05.19 -
[MFC] Dynamic Layout ์ ์ฉํ์ฌ ์ปจํธ๋กค Resizingํ๊ธฐ(์์ ํฌํจ)
[MFC] Dynamic Layout ์ ์ฉํ์ฌ ์ปจํธ๋กค Resizingํ๊ธฐ(์์ ํฌํจ)
2020.05.16 -
[MFC] Dialog์ Form(Dialog) ๋ถ์ด๊ธฐ(์์ ํฌํจ)
[MFC] Dialog์ Form(Dialog) ๋ถ์ด๊ธฐ(์์ ํฌํจ)
2019.09.06 -
[MFC] ์์ ์ ์ค๋ ๋ ์์ฑ๊ณผ ํด์ ์ฌ์ฉ ๋ฐฉ๋ฒ (์์ ์ฒจ๋ถ)
[MFC] ์์ ์ ์ค๋ ๋ ์์ฑ๊ณผ ํด์ ์ฌ์ฉ ๋ฐฉ๋ฒ (์์ ์ฒจ๋ถ)
2019.09.03