티스토리 뷰
MFC 비 모드형 대화상자
1. CDialog::DoModal() 대신 CDialog::Create() 로 대화상자 생성
2. CDialog::EndDialog() 대신 CDialog::DestroyWindow() 로 대화상자 닫기
3. 모드형 대화상자 객체는 대게 스택에 저장되지만 비 모드형 대화상자는 힙에 생성된다.
(스택에 저장되면 범위를 벗어나면 소멸되므로 대화상자를 계속 유지할 수 없기 때문에 힙에 생성)
비 모드형 대화상자를 작성하는 표준 방법은 없기때문에 위 규칙을 참조하여 구현한다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112 |
class CMFCApplication7View;
class CMyDialog : public CDialog
{
...
public:
CMFCApplication7View* m_pView;
CString m_str;
int m_color;
afx_msg void OnBnClickedApply();
afx_msg void OnBnClickedCancel();
virtual void PostNcDestroy();
afx_msg void OnBnClickedClrscr();
};
#include "MFCApplication7View.h"
#include "MFCApplication7Doc.h"
void CMyDialog::DoDataExchange(CDataExchange* pDX)
{
CDialog::DoDataExchange(pDX);
DDX_Text(pDX, IDC_STR, m_str);
DDX_Text(pDX, IDC_COLOR, m_color);
DDV_MinMaxInt(pDX, m_color, 0, 255);
}
BEGIN_MESSAGE_MAP(CMyDialog, CDialog)
ON_BN_CLICKED(IDC_APPLY, &CMyDialog::OnBnClickedApply)
ON_BN_CLICKED(IDCANCEL, &CMyDialog::OnBnClickedCancel)
ON_BN_CLICKED(IDC_CLRSCR, &CMyDialog::OnBnClickedClrscr)
END_MESSAGE_MAP()
void CMyDialog::OnBnClickedApply()
{
// TODO: 여기에 컨트롤 알림 처리기 코드를 추가합니다.
UpdateData(TRUE);
m_pView->m_str = m_str;
m_pView->m_color = m_color;
m_pView->Invalidate();
}
void CMyDialog::OnBnClickedCancel()
{
DestroyWindow(); // 대화상자 파괴
}
void CMyDialog::PostNcDestroy()
{
// 윈도우가 파괴될때 마지막으로 호출되는 가상함수로
// 동적 생성된 대화상자 객체를 파괴하기 적당한 위치다. m_pView->m_pDlg = NULL;
delete this; // View에서 생성된 객체를 자기 스스로 파괴
CDialog::PostNcDestroy();
}
void CMyDialog::OnBnClickedClrscr()
{
m_pView->m_str = m_str = L"";
m_pView->m_color = m_color = 0;
UpdateData(FALSE);
m_pView->Invalidate();
}
class CMyDialog;
class CMFCApplication7Doc;
class CMFCApplication7View : public CView
{
...
public:
CMyDialog* m_pDlg;
CString m_str;
int m_color;
public:
afx_msg void OnLButtonDblClk(UINT nFlags, CPoint point);
};
#include "MyDialog.h"
BEGIN_MESSAGE_MAP(CMFCApplication7View, CView)
...
ON_WM_LBUTTONDBLCLK()
END_MESSAGE_MAP()
CMFCApplication7View::CMFCApplication7View()
{
m_pDlg = NULL;
m_str = L"";
m_color = 0;
}
void CMFCApplication7View::OnDraw(CDC* pDC)
{
...
CFont font;
font.CreatePointFont(300, L"나눔고딕");
pDC->SelectObject(&font);
pDC->SetTextColor(RGB(m_color, 0, 0));
pDC->TextOutW(10, 10, m_str);
}
void CMFCApplication7View::OnLButtonDblClk(UINT nFlags, CPoint point)
{
if (m_pDlg != NULL)
m_pDlg->SetFocus();
else
{ // 취소 버튼을 눌러 대화상자가 파괴된 경우 다시 생성
m_pDlg = new CMyDialog; // 동적 대화상자 생성하고 대화상자 스스로 파괴 (51행)
m_pDlg->m_pView = this;
m_pDlg->m_str = m_str;
m_pDlg->m_color = m_color;
m_pDlg->Create(IDD_DIALOG1);
m_pDlg->ShowWindow(SW_SHOW);
}
CView::OnLButtonDblClk(nFlags, point);
} |
cs |
비모드형 대화상자는 힙에 객체를 만들고 취소버튼을 누르거나 프로그램을 종료할때까지 대화상자 객체가 유지된다.