09: 대화상자 학습목표 대화상자편집기의사용법을익힌다. 모드형대화상자와비모드형대화상자의차이점을이해하고작성방법을익힌다. 대화상자기반응용프로그램의원리를이해하고작성방법을익힌다. 공통대화상자를다루는방법을배운다.
개요 (1/2) 대화상자 다양한컨트롤을포함하고있는일종의윈도우 사용자로부터입력을받거나정보를출력 1
개요 (2/2) 대화상자종류 모드형대화상자 대화상자를닫지않으면응용프로그램이더이상진행할수없다. 비모드형대화상자 대화상자를닫지않더라도응용프로그램이계속진행할수있다. 2
대화상자템플릿 (1/3) 대화상자템플릿 대화상자자체와포함된컨트롤에대한모든정보를가지고있는이진데이터 리소스로실행파일에포함 대화상자템플릿작성 비주얼 C++ 리소스편집기나텍스트편집기를이용하여리소스스크립트 (*.RC) 작성 리소스컴파일러로이진파일 (*.RES) 파일생성 링크과정에서실행파일에포함 3
대화상자템플릿 (2/3) 리소스스크립트작성 4
대화상자템플릿 (3/3) 리소스스크립트작성 (cont'd) IDD_DIALOG1 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 14 EDITTEXT IDC_EDIT1,7,7,117,14,ES_AUTOHSCROLL EDITTEXT IDC_EDIT2,7,24,117,14,ES_AUTOHSCROLL END 5
대화상자편집기 (1/4) 컨트롤추가와삭제 컨트롤 (Controls) 툴바이용 6
대화상자편집기 (2/4) 컨트롤배치 대화상자 (Dialog) 툴바이용 7
대화상자편집기 (3/4) 탭순서 Tab 키를눌렀을때키보드포커스가이동하는순서 [Layout]->[Tab Order] 메뉴를이용하여변경 8
대화상자편집기 (4/4) 대화상자속성 폰트를바꾸면대화상자와대화상자에포함된컨트롤의크기가폰트의크기에비례해서변경된다. 9
모드형대화상자 (1/4) MFC 클래스계층도 모드형대화상자작성순서 1 대화상자리소스작성 2 CDialog ( 파생 ) 클래스객체생성 이때대화상자리소스 ID를생성자의인자로넘겨준다. 3 CDialog::DoModal() 함수호출 10
모드형대화상자 (2/4) CDialog 클래스가상함수 virtual BOOL CDialog::OnInitDialog ( ); 호출시점 : WM_INITDIALOG 메시지발생시 용도 : 컨트롤을초기화하거나키보드포커스를변경 virtual void CDialog::OnOK ( ); 호출시점 : IDOK 버튼을누를때 용도 : 컨트롤의값을읽거나값의타당성여부를검사한후대화상자종료 11
모드형대화상자 (3/4) CDialog 클래스가상함수 (cont'd) virtual void CDialog::OnCancel ( ); 호출시점 : IDCANCEL 버튼을누를때 용도 : 대화상자종료 12
모드형대화상자 (4/4) OnOK(), OnCancel() 함수내부구현 void CDialog::OnOK() { UpdateData(TRUE); EndDialog(IDOK); } void CDialog::OnCancel() C l() { EndDialog(IDCANCEL); } 13
DDX/DDV (1/8) 모드형대화상자구현 class CMyDialog : public CDialog {... CString m_str; int m_color;... } 14
DDX/DDV (2/8) 모드형대화상자구현 (cont'd) BOOL CMyDialog::OnInitDialog() { CDialog::OnInitDialog(); SetDlgItemText(IDC_STR, 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(); } 15
DDX/DDV (3/8) 동작원리 대화상자대화상자객체뷰객체 IDC_STR m_str m_str 대화상자가 2 1 IDC_COLORCOLOR m_color m_color 생성될때 대화상자 대화상자객체 뷰객체 IDC_ STR IDC_COLOR 3 m_ str m_color 4 m_ str m_color OK 버튼을누를때 16
DDX/DDV (4/8) DDX(Dialog Data exchange) 자동화? 대화상자대화상자객체뷰객체 IDC_STR IDC_COLORCOLOR 2 m_str m_color 1 m_str m_color 대화상자대화상자객체뷰객체 IDC_STR IDC_COLOR 3 m_str m_color 4 m_str m_color 17
DDX/DDV (5/8) OnInitDialog(), OnOK() 함수내부구현 BOOL CDialog::OnInitDialog() {... UpdateData(FALSE);... } void CDialog::OnOK() {... UpdateData(TRUE);... } 18
DDX/DDV (6/8) CWnd::UpdateData() 함수내부구현 BOOL CWnd::UpdateData(BOOL bsaveandvalidate) {... CDataExchange dx(this, bsaveandvalidate); DoDataExchange(&dx);... } 19
DDX/DDV (7/8) DDX 구현 컨트롤의값을저장할변수선언 DoDataExchange() 함수를자신의프로그램에맞게재정의 DDX_* 매크로사용 void CMyDialog::DoDataExchange(CDataExchange* pdx) { CDialog::DoDataExchange(pDX); //{{AFX_DATA_MAP(CMyDialog) DDX_Text(pDX, DX IDC_STR, m_str); DDX_Text(pDX, IDC_COLOR, m_color); //}}AFX_DATA_MAP } 20
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 } 21
비모드형대화상자 차이점 CDialog::DoModal() 함수대신 CDialog::Create() 함수를이용하여생성한다. 대화상자를닫을때 CDialog::EndDialog() 함수대신 CWnd::DestroyWindow() 함수를호출한다. 모드형대화상자객체는대개스택에생성하지만비모드형대화상자객체는힙에생성한다. 22
대화상자기반응용프로그램 (1/2) 대화상자기반응용프로그램 대화상자가메인윈도우역할을하는응용프로그램 23
대화상자기반응용프로그램 (2/2) InitInstance() 함수 BOOL CSimpleCalcApp::InitInstance() { CSimpleCalcDlg dlg; m_pmainwnd = &dlg; int nresponse = dlg.domodal(); if (nresponse == IDOK) { } else if (nresponse == IDCANCEL) { } } return FALSE; 24
공통대화상자 (1/10) MFC 클래스계층도 25
공통대화상자 (2/10) MFC 공통대화상자클래스 MFC 클래스용도 API 함수 CColorDialog 색상선택 ChooseColor CFileDialog 파일열기또는저장 GetOpenFileName, GetSaveFileName CFindReplaceDialog 찾기또는바꾸기 FindText, ReplaceText CFontDialog 폰트선택 ChooseFont CPageSetupDialog g 페이지설정 ( 페이지크기, PageSetupDlg g 방향, 페이지여백등 ) CPrintDialog 인쇄설정 ( 프린터, 인쇄범위등 ) PrintDlg CPrintDialogEx 인쇄설정 ( 프린터, 인쇄 PrintDlgEx (> 윈도우 (>MFC 7.0) 범위등 ) 2000) 26
공통대화상자 (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(); l 27
공통대화상자 (4/10) CFileDialog CFileDialog dlg(true); if(dlg.domodal() == IDOK) MessageBox(dlg.GetPathName()); CFileDialog dlg(false); if(dlg.domodal() == IDOK) MessageBox(dlg.GetPathName()); thn ()) 28
공통대화상자 (5/10) CFindReplaceDialog 사용방법은교재참조 29
공통대화상자 (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); 30
공통대화상자 (7/10) CFontDialog (cont'd) } // 선택된폰트를알아낸다. LOGFONT lf; dlg.getcurrentfont(&lf); CFont font; font.createfontindirect(&lf); dc.selectobject(&font); // 텍스트를출력한다. dc.textout(10, 10, CString(" 한글 & English")); 31
공통대화상자 (8/10) CPageSetupDialog CPageSetupDialog dlg; dlg.domodal(); 32
공통대화상자 (9/10) CPrintDialog CPrintDialog dlg(true); dlg.domodal(); CPrintDialog dlg(false); dlg.domodal(); 33
공통대화상자 (10/10) CPrintDialogEx // stdafx.h 파일에서 WINVER 상수값을 0x0500 이상으로정의한다. // ( 예 ) #define WINVER 0x0500 CPrintDialogEx dlg; dlg.domodal(); 34