티스토리 뷰

프로그래밍/MFC

MFC 비 모드형 대화상자

에어버스 2016. 7. 2. 15:30
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, 0255);
}
 
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, 00));
    pDC->TextOutW(1010, 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

비모드형 대화상자는 힙에 객체를 만들고 취소버튼을 누르거나 프로그램을 종료할때까지 대화상자 객체가 유지된다.

 

공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/12   »
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