๋ฐ˜์‘ํ˜•

Dialog์— Dialog๋ฅผ ๋ถ™์ธ๋‹ค?

์ด๋ฒˆ ํฌ์ŠคํŒ…์—์„œ๋Š” ๋‹ค์ด์–ผ๋กœ๊ทธ์— ์ƒˆ๋กœ์šด ๋‹ค์ด์–ผ๋กœ๊ทธ(CFormView ๊ธฐ๋ฐ˜)๋ฅผ ๋ถ™์ด๋Š” ์˜ˆ์ œ๋ฅผ ๋ณด์—ฌ๋“œ๋ฆฌ๊ณ ์ž ํ•ฉ๋‹ˆ๋‹ค. ์ด๊ฒŒ ๋ฌด์Šจ ์˜๋ฏธ์ธ์ง€ ๊ฐ์ด ์•ˆ ์˜ค์‹œ์ฃ ? ์‰ฝ๊ฒŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๊ฒŒ ์•„๋ž˜ ์ด๋ฏธ์ง€๋ฅผ ์ค€๋น„ํ–ˆ์Šต๋‹ˆ๋‹ค.

Dialog์— Dialog ๋ถ™์ธ ์˜ˆ์‹œ

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

UI๋„ ๋งˆ์ฐฌ๊ฐ€์ง€์ž…๋‹ˆ๋‹ค. ํ•˜๋‚˜์˜ ๋‹ค์ด์–ผ๋กœ๊ทธ์— ๋ณด์ธ๋‹ค๊ณ  ํ•ด์„œ ์˜จ๊ฐ– ์ปจํŠธ๋กค๋“ค์„ ๋ฐฐ์น˜ํ•ด๋ฒ„๋ฆฌ๋ฉด ๋‚˜๋ฆ„๋Œ€๋กœ ๊ณจ์น˜ ์•„ํŒŒ์ง‘๋‹ˆ๋‹ค. ๋ฌผ๋ก  ๊ฒฝ์šฐ์— ๋”ฐ๋ผ ๋‹ค๋ฅด๊ฒ ์ง€๋งŒ, ๋˜๋„๋ก์ด๋ฉด ๊ณตํ†ต์ ์ธ ์š”์†Œ ๊ทธ๋ฆฌ๊ณ  ๋ชจ๋“ˆํ™”๊ฐ€ ๊ฐ€๋Šฅํ•œ์ง€๋ฅผ ๋”ฐ์ ธ๋ณธ ํ›„ ์ด๊ฒƒ ๋˜ํ•œ ๋‹ค๋ฅธ Form์œผ๋กœ ๋ถ„๋ฆฌํ•˜๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค.

์˜ˆ์ œ ์ฝ”๋“œ Concept

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

์˜ˆ์ œ ํ”„๋กœ๊ทธ๋žจ ์ปจ์…‰

์‹คํ–‰ ๊ฒฐ๊ณผ๋Š” ์•„๋ž˜์™€ ๊ฐ™์Šต๋‹ˆ๋‹ค. ์ƒˆ๋กœ์šด ๋‹ค์ด์–ผ๋กœ๊ทธ์˜ ํฌ๊ธฐ๊ฐ€ Picture Control๋ณด๋‹ค ํฌ๋ฉด ์Šคํฌ๋กค๋ฐ”๊ฐ€ ์ƒ์„ฑ๋˜๊ณ , ์ž‘์œผ๋ฉด ์Šคํฌ๋กค๋ฐ”๋Š” ์ƒ์„ฑ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

์‹คํ–‰ ๊ฒฐ๊ณผ

๋”ฐ๋ผ ํ•˜๊ธฐ

์˜ˆ์ œ ์ฝ”๋“œ๋Š” ๋ณธ๋ฌธ ํ•˜๋‹จ์— ์ฒจ๋ถ€๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค. ์ค‘์š”ํ•œ ๋ถ€๋ถ„๋งŒ ์„ค๋ช…ํ•˜๊ณ , ์ž์„ธํ•œ ๋‚ด์šฉ์€ ์ฒจ๋ถ€๋œ ์ฝ”๋“œ๋ฅผ ์ฐธ๊ณ ํ•ด์ฃผ์„ธ์š”!
Main Dialog์— Picture Control์„ ๋ฐฐ์น˜ํ•ฉ๋‹ˆ๋‹ค.

Main Dialog UI ๋ฐฐ์น˜

๋ฆฌ์†Œ์Šค ํŽธ์ง‘๊ธฐ์—์„œ Dialog๋ฅผ ํ•˜๋‚˜ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค. Dialog์˜ ๋‘ ๊ฐ€์ง€ ์„ค์ •์„ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.

  • Border: NONE
  • Style: Child

๊ทธ๋ฆฌ๊ณ  ์ถ”๊ฐ€ํ•  UI ์ปจํŠธ๋กค๋“ค์„ ๋ฐฐ์น˜ํ•ฉ๋‹ˆ๋‹ค. ์•„๋ž˜๋Š” ์ž„์˜๋กœ ์ถ”๊ฐ€ํ•œ ๋ชจ์Šต์ž…๋‹ˆ๋‹ค.

์ƒˆ๋กœ ์ถ”๊ฐ€ํ•œ Dialog

์ƒˆ๋กœ ์ถ”๊ฐ€ํ•œ Dialog์— ํด๋ž˜์Šค๋ฅผ ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค. ํด๋ž˜์Šค ์ถ”๊ฐ€ ์‹œ CDialogEx๊ฐ€ ์•„๋‹Œ CFormView๋ฅผ ๊ธฐ๋ณธ ํด๋ž˜์Šค๋กœ ์„ ํƒํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. Visual Studio 2017์˜ ๊ฒฝ์šฐ CFormView๊ฐ€ ์‚ฌ๋ผ์กŒ๋”๊ตฐ์š”. ์ง์ ‘ ์ž…๋ ฅ์„ ํ•  ์ˆ˜ ์—†์œผ๋‹ˆ CDialogEx๋กœ ์ƒ์„ฑํ•˜๊ณ , ์ง์ ‘ CDialogEx๋ฅผ CFormView๋กœ ๋ณ€๊ฒฝํ•ฉ๋‹ˆ๋‹ค.

์˜ˆ์ œ์—์„œ๋Š” CFormView๋ฅผ ์ƒ์†๋ฐ›๋Š” CMyForm ํด๋ž˜์Šค๋ฅผ ์ถ”๊ฐ€ํ–ˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ๊ฐ€์ƒ ํ•จ์ˆ˜๋กœ Create์™€ OnInitialUpdate๋ฅผ ์ถ”๊ฐ€ํ–ˆ์Šต๋‹ˆ๋‹ค.

#pragma once


// CMyForm ๋Œ€ํ™” ์ƒ์ž

class CMyForm : public CFormView
{
	DECLARE_DYNAMIC(CMyForm)

public:
	CMyForm();
	CMyForm(UINT nIDTemplate);
	virtual ~CMyForm();

// ๋Œ€ํ™” ์ƒ์ž ๋ฐ์ดํ„ฐ์ž…๋‹ˆ๋‹ค.
#ifdef AFX_DESIGN_TIME
	enum { IDD = IDD_FORM_MYFORM };
#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 ํ—ค๋”์—๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์ •์˜ํ•ฉ๋‹ˆ๋‹ค.

#pragma once
#include "CMyForm.h"

// CExamFormAttachDialogDlg ๋Œ€ํ™” ์ƒ์ž
class CExamFormAttachDialogDlg : public CDialogEx
{
// ์ƒ์„ฑ์ž…๋‹ˆ๋‹ค.
public:
	CExamFormAttachDialogDlg(CWnd* pParent = nullptr);	// ํ‘œ์ค€ ์ƒ์„ฑ์ž์ž…๋‹ˆ๋‹ค.

// ๋Œ€ํ™” ์ƒ์ž ๋ฐ์ดํ„ฐ์ž…๋‹ˆ๋‹ค.
#ifdef AFX_DESIGN_TIME
	enum { IDD = IDD_EXAMFORMATTACHDIALOG_DIALOG };
#endif

	protected:
	virtual void DoDataExchange(CDataExchange* pDX);	// DDX/DDV ์ง€์›์ž…๋‹ˆ๋‹ค.

	CMyForm *m_pForm; // ์ƒˆ๋กœ ์ถ”๊ฐ€ํ•œ Dialog ๊ฐ์ฒด
	void AllocForm(); // Picture Control์— Dialog๋ฅผ ์ถ”๊ฐ€ํ•˜๋Š” ํ•จ์ˆ˜
// ๊ตฌํ˜„์ž…๋‹ˆ๋‹ค.
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()
};

๋งˆ์ง€๋ง‰์œผ๋กœ AllocForm() ํ•จ์ˆ˜์—๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์ด ๊ตฌํ˜„ํ•ฉ๋‹ˆ๋‹ค. Picture Control ์˜์—ญ์— ์ƒˆ๋กœ์šด ๋‹ค์ด์–ผ๋กœ๊ทธ๋ฅผ ์ถ”๊ฐ€ํ•˜๊ณ , Picture Control์„ ์ œ๊ฑฐํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

void CExamFormAttachDialogDlg::AllocForm()
{
	CCreateContext context;
	ZeroMemory(&context, sizeof(context));

	CRect rectOfPanelArea;

	GetDlgItem(IDC_STATIC_RECT)->GetWindowRect(&rectOfPanelArea);
	ScreenToClient(&rectOfPanelArea);
	m_pForm = new CMyForm();
	m_pForm->Create(NULL, NULL, WS_CHILD | WS_VSCROLL | WS_HSCROLL, rectOfPanelArea, this, IDD_FORM_MYFORM, &context);
	m_pForm->OnInitialUpdate();
	m_pForm->ShowWindow(SW_SHOW);
	GetDlgItem(IDC_STATIC_RECT)->DestroyWindow();
}

์ƒ๊ฐ๋ณด๋‹ค ๊ฐ„๋‹จํ•˜์ฃ ? ์ด ์‘์šฉ ๋ฐฉ๋ฒ•์„ ํ™œ์šฉํ•˜๋ฉด MFC์˜ ๊ตฌ๋‹ฅ๋‹ค๋ฆฌ Tab Control์„ ๋Œ€์‹ ํ•˜์—ฌ ์˜ˆ์œ Form Changing์ด ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค. ์ด ๋ฐฉ๋ฒ•๋„ ์ถ”ํ›„์— ์†Œ๊ฐœํ•˜๋„๋ก ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค.

ExamFormAttachDialog.zip
0.13MB

๋ฐ˜์‘ํ˜•