대화상자 편집기의 사용법을 익힌다. 모드형 대화상자와 비 모드형 대화상자의 차이점을 이해하고 작성 방법을 익힌다. 대화상자 기반 응용 프로그램의 원리를 이해하고 작성 방법을 익힌다. 공통 대화상자를 다루는 방법을 배운다.
개요 (1/2) 대화상자 다양한 컨트롤을 포함하고 있는 일종의 윈도우 사용자로부터 입력을 받거나 정보를 출력
개요 (2/2) 대화상자 종류 모드형 대화상자 비 모드형 대화상자 대화상자를 닫지 않으면 응용 프로그램이 더 이상 진행할 수 없다. 비 모드형 대화상자 대화상자를 닫지 않더라도 응용 프로그램이 계속 진행할 수 있다.
대화상자 템플릿 (1/3) 대화상자 템플릿 대화상자 템플릿 작성 대화상자 자체와 포함된 컨트롤에 대한 모든 정보를 가지고 있는 이진 데이터 리소스로 실행 파일에 포함 대화상자 템플릿 작성 비주얼 C++ 리소스 편집기나 텍스트 편집기를 이용하여 리소스 스크립트(*.RC) 작성 리소스 컴파일러로 이진 파일(*.RES) 파일 생성 링크 과정에서 실행 파일에 포함
대화상자 템플릿 (2/3) 리소스 스크립트 작성
대화상자 템플릿 (3/3) 리소스 스크립트 작성 (cont'd) IDD_DIALOG1 DIALOG DISCARDABLE 0, 0, 187, 98 STYLE DS_MODALFRAME|WS_POPUP|WS_CAPTION|WS_SYSMENU CAPTION "Dialog" FONT 10, "System" BEGIN DEFPUSHBUTTON "OK",IDOK,130,7,50,14 PUSHBUTTON "Cancel",IDCANCEL,130,24,50,14 EDITTEXT IDC_EDIT1,7,7,117,14,ES_AUTOHSCROLL EDITTEXT IDC_EDIT2,7,24,117,14,ES_AUTOHSCROLL END
대화상자 편집기 (1/4) 컨트롤 추가와 삭제 컨트롤(Controls) 툴바 이용
대화상자 편집기 (2/4) 컨트롤 배치 대화상자(Dialog) 툴바 이용
대화상자 편집기 (3/4) 탭 순서 Tab 키를 눌렀을 때 키보드 포커스가 이동하는 순서 [Layout]->[Tab Order] 메뉴를 이용하여 변경
대화상자 편집기 (4/4) 대화상자 속성 폰트를 바꾸면 대화상자와 대화상자에 포함된 컨트롤의 크기가 폰트의 크기에 비례해서 변경된다.
모드형 대화상자 (1/4) MFC 클래스 계층도 모드형 대화상자 작성 순서 ① 대화상자 리소스 작성 ② CDialog (파생) 클래스 객체 생성 이 때 대화상자 리소스 ID를 생성자의 인자로 넘겨준다. ③ CDialog::DoModal() 함수 호출
모드형 대화상자 (2/4) CDialog 클래스 가상 함수 호출 시점: WM_INITDIALOG 메시지 발생시 용도: 컨트롤을 초기화하거나 키보드 포커스를 변경 호출 시점: IDOK 버튼을 누를 때 용도: 컨트롤의 값을 읽거나 값의 타당성 여부를 검사한 후 대화상자 종료 virtual BOOL CDialog::OnInitDialog ( ); virtual void CDialog::OnOK ( );
모드형 대화상자 (3/4) CDialog 클래스 가상 함수 (cont'd) 호출 시점: IDCANCEL 버튼을 누를 때 용도: 대화상자 종료 virtual void CDialog::OnCancel ( );
모드형 대화상자 (4/4) OnOK(), OnCancel() 함수 내부 구현 void CDialog::OnOK() { UpdateData(TRUE); EndDialog(IDOK); } void CDialog::OnCancel() EndDialog(IDCANCEL);
DDX/DDV (1/8) 모드형 대화상자 구현 class CMyDialog : public CDialog { ... CString m_str; int m_color; }
DDX/DDV (2/8) 모드형 대화상자 구현 (cont'd) BOOL CMyDialog::OnInitDialog() { CDialog::OnInitDialog(); SetDlgItemText(IDC_STR, m_str); SetDlgItemInt(IDC_COLOR, m_color); return TRUE; } void CMyDialog::OnOK() GetDlgItemText(IDC_STR, m_str); m_color = GetDlgItemInt(IDC_COLOR); CDialog::OnOK();
DDX/DDV (3/8) 동작 원리 IDC_STR IDC_COLOR ① ② 대화상자 m_str m_color 대화상자 객체 뷰 객체 ③ ④ 대화상자가 생성될 때 OK 버튼을 누를 때
DDX/DDV (4/8) DDX(Dialog Data eXchange) IDC_STR IDC_COLOR ① ② 대화상자 m_str m_color 대화상자 객체 뷰 객체 ③ ④ 자동화?
DDX/DDV (5/8) OnInitDialog(), OnOK() 함수 내부 구현 BOOL CDialog::OnInitDialog() { ... UpdateData(FALSE); } void CDialog::OnOK() UpdateData(TRUE);
DDX/DDV (6/8) CWnd::UpdateData() 함수 내부 구현 BOOL CWnd::UpdateData(BOOL bSaveAndValidate) { ... CDataExchange dx(this, bSaveAndValidate); DoDataExchange(&dx); }
DDX/DDV (7/8) DDX 구현 컨트롤의 값을 저장할 변수 선언 DoDataExchange() 함수를 자신의 프로그램에 맞게 재정의 DDX_* 매크로 사용 void CMyDialog::DoDataExchange(CDataExchange* pDX) { CDialog::DoDataExchange(pDX); //{{AFX_DATA_MAP(CMyDialog) DDX_Text(pDX, IDC_STR, m_str); DDX_Text(pDX, IDC_COLOR, m_color); //}}AFX_DATA_MAP }
DDX/DDV (8/8) DDV(Dialog Data Validation) 대화상자의 컨트롤에 입력한 데이터의 타당성 여부를 자동으로 검사 DDV_* 매크로 사용 void CMyDialog::DoDataExchange(CDataExchange* pDX) { CDialog::DoDataExchange(pDX); //{{AFX_DATA_MAP(CMyDialog) 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); //}}AFX_DATA_MAP }
비 모드형 대화상자 차이점 CDialog::DoModal() 함수 대신 CDialog::Create() 함수를 이용하여 생성한다. 대화상자를 닫을 때 CDialog::EndDialog() 함수 대신 CWnd::DestroyWindow() 함수를 호출한다. 모드형 대화상자 객체는 대개 스택에 생성하지만 비 모드형 대화상자 객체는 힙에 생성한다.
대화상자 기반 응용 프로그램 (1/2) 대화상자 기반 응용 프로그램 대화상자가 메인 윈도우 역할을 하는 응용 프로그램
대화상자 기반 응용 프로그램 (2/2) InitInstance() 함수 BOOL CSimpleCalcApp::InitInstance() { CSimpleCalcDlg dlg; m_pMainWnd = &dlg; int nResponse = dlg.DoModal(); if (nResponse == IDOK) { } else if (nResponse == IDCANCEL) { return FALSE;
공통 대화상자 (1/10) MFC 클래스 계층도
공통 대화상자 (2/10) MFC 공통 대화상자 클래스 MFC 클래스 용도 API 함수 CColorDialog 색상 선택 ChooseColor CFileDialog 파일 열기 또는 저장 GetOpenFileName, GetSaveFileName CFindReplaceDialog 찾기 또는 바꾸기 FindText, ReplaceText CFontDialog 폰트 선택 ChooseFont CPageSetupDialog 페이지 설정(페이지 크기, 방향, 페이지 여백 등) PageSetupDlg CPrintDialog 인쇄 설정(프린터, 인쇄 범위 등) PrintDlg CPrintDialogEx (>MFC 7.0) PrintDlgEx (>윈도우 2000)
공통 대화상자 (3/10) CColorDialog CColorDialog dlg; dlg.DoModal(); COLORREF color = dlg.GetColor(); CColorDialog dlg(RGB(255, 0, 0), CC_FULLOPEN); dlg.DoModal(); COLORREF color = dlg.GetColor();
공통 대화상자 (4/10) CFileDialog CFileDialog dlg(TRUE); if(dlg.DoModal() == IDOK) MessageBox(dlg.GetPathName()); CFileDialog dlg(FALSE); if(dlg.DoModal() == IDOK) MessageBox(dlg.GetPathName());
공통 대화상자 (5/10) CFindReplaceDialog 사용 방법은 교재 참조
공통 대화상자 (6/10) CFontDialog CFontDialog dlg; if(dlg.DoModal() == IDOK){ CClientDC dc(this); // 화면을 지운다. CRect rect; GetClientRect(&rect); dc.SelectStockObject(WHITE_PEN); dc.SelectStockObject(WHITE_BRUSH); dc.Rectangle(&rect); // 선택된 색상을 알아낸다. COLORREF color = dlg.GetColor(); dc.SetTextColor(color);
공통 대화상자 (7/10) CFontDialog (cont'd) // 선택된 폰트를 알아낸다. LOGFONT lf; dlg.GetCurrentFont(&lf); CFont font; font.CreateFontIndirect(&lf); dc.SelectObject(&font); // 텍스트를 출력한다. dc.TextOut(10, 10, CString("한글 & English")); }
공통 대화상자 (8/10) CPageSetupDialog CPageSetupDialog dlg; dlg.DoModal();
공통 대화상자 (9/10) CPrintDialog CPrintDialog dlg(TRUE); dlg.DoModal(); CPrintDialog dlg(FALSE); dlg.DoModal();
공통 대화상자 (10/10) CPrintDialogEx // stdafx.h 파일에서 WINVER 상수값을 0x0500 이상으로 정의한다. // (예) #define WINVER 0x0500 CPrintDialogEx dlg; dlg.DoModal();