티스토리 뷰
DDX/DDV
DDX : Dialog Data eXchange
멤버변수와 컨트롤의 값을 연결시켜준다.
UpdateData(FALSE) : 멤버변수 값을 컨트롤에 전달
UpdateData(TRUE) : 컨트롤의 값을 멤버변수로 전달 (멤버변수를 기준으로 TRUE면 값을 가져옴)
DDV : Dialog Data Validation
컨트롤에 입력한 값의 타당성을 검사
다이얼로그 추가 (ID = IDD_DIALOG1)
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 |
class CMyDialog : public CDialog
{
...
#ifdef AFX_DESIGN_TIME
enum { IDD = IDD_DIALOG1 };
#endif
public:
afx_msg void OnBnClickedClrscr();
CString m_str;
int m_color;
virtual BOOL OnInitDialog();
afx_msg void OnBnClickedOk();
};
BEGIN_MESSAGE_MAP(CMyDialog, CDialog)
ON_BN_CLICKED(IDC_CLRSCR, &CMyDialog::OnBnClickedClrscr)
ON_BN_CLICKED(IDOK, &CMyDialog::OnBnClickedOk)
END_MESSAGE_MAP()
void CMyDialog::OnBnClickedClrscr()
{
EndDialog(100);
}
BOOL CMyDialog::OnInitDialog()
{
CDialog::OnInitDialog();
SetDlgItemText(IDC_STR, m_str);
SetDlgItemInt(IDC_COLOR, m_color);
return TRUE; // return TRUE unless you set the focus to a control
// 예외: OCX 속성 페이지는 FALSE를 반환해야 합니다.
}
void CMyDialog::OnBnClickedOk()
{
GetDlgItemText(IDC_STR, m_str);
m_color = GetDlgItemInt(IDC_COLOR);
CDialog::OnOK();
}
#include "MyDialog.h"
void CMFCApplication6View::OnLButtonDblClk(UINT nFlags, CPoint point)
{
CMyDialog dlg;
dlg.m_str = m_str;
dlg.m_color = m_color;
int result = dlg.DoModal();
if (result == IDOK)
{
m_str = dlg.m_str;
m_color = dlg.m_color;
Invalidate();
}
else if (result == 100)
{
m_str = L"";
m_color = 0;
Invalidate();
}
CView::OnLButtonDblClk(nFlags, point);
} |
cs |
<문자열은 10문자, 숫자는 0~255 숫자 범위로 제한하는 DDX/DDV 자동 구현> - 수동으로는 안되네?
위 코드에서 m_str과 m_color 변수를 지우고 아래 처럼 클래스 마법사로 추가한다.
1
2
3
4
5
6
7
8 |
void CMyDialog::DoDataExchange(CDataExchange* pDX)
{
...
DDX_Text(pDX, IDC_STR, m_str);
DDV_MaxChars(pDX, m_str, 10);
DDX_Text(pDX, IDC_COLOR, m_color);
DDV_MinMaxInt(pDX, m_color, 0, 255);
} |
cs |
한글은 유니코드는 10자, 멀티바이트는 5자로 제한된다.