제4장 대화상자 4.1 CDialogEx 클래스 4.2 대화상자 기반의 프로그램 실습 4-1 MFC 기본 컨트롤 사용법 익히기 4.3 모달 대화상자와 모덜리스 대화상자 4.4 공용 대화상자 실습 4-2 단위 변환프로그램 만들기 대화상자(dialog) CDialogEx 클래스 • 대화상자는 CDialogEx 클래스로 정의 • 모든 윈도우 메시지 처리 가능 • 배경색과 배경그림 바꾸는 기능 추가 • SetBackgroundColor() • SetBackgroundImage() 대화상자(dialog) 대화상자의 계층도 대화상자(dialog) 다이얼로그 기반의 프로그램 • 애플리케이션 클래스와 다이얼로그 클래스 로 구성 클래스 기저 클래스 설명 애플리케이션 클래스 CWinApp 프로젝트 전체를 관리하는 클래스 다이얼로그 클래스 CDialogEx 대화상자의 기능을 구현하는 실제적인 클 래스 도움말 대화상자 클래 스 CDialogEx 도움말 정보 클래스 대화상자(dialog) 대화상자 프로그램의 동작 MFC 기본 컨트롤 Static Text • 화면에 문자열을 배치할 때 사용하는 컨트롤 Edit Control • 문자열을 입력하고 편집할 수 있는 컨트롤 Group Box • 서로 연관된 컨트롤을 시각적으로 그룹 지어 다 른 컨트롤과 구분하는 용도로 사용 • 그룹 박스로 묶는다고 기능은 변경되지 않음 MFC 기본 컨트롤 Button Control • 마우스로 클릭하여 어떤 동작을 수행하는 용도 로 사용하는 컨트롤 Check Box • 버튼 컨트롤의 일종으로 독립적인 옵션을 선택 할 때 사용하는 컨트롤 • 마우스로 클릭하면 체크표시가 on/off 됨 • 여러 옵션 중 임의의 개수를 선택할 때 사용 MFC 기본 컨트롤 Radio Button • 버튼 컨트롤의 일종으로 상호 배타적인 옵션을 선택할 때 사용하는 컨트롤 • 마우스로 클릭하면 라디오 표시가 on/off 됨 • 여러 옵션 중 하나 만 선택할 때 사용 List Box • 여러 개의 선택 항목을 나열하고 선택할 수 있 도록 해주는 컨트롤 • 하나 도는 여러 개를 선택할 수 있음 MFC 기본 컨트롤 Combo Box • 리스트 박스의 단점을 해결한 것으로 에디트 컨 트롤과 리스트 박스를 합쳐 놓은 모양 • 기존의 항목을 선택할 때는 아래의 리스트 박스 에서 선택 • 직접 입력할 경우는 에디트 컨트롤에서 입력할 수 있음 • 리스트 박스를 평소에 닫아두기 때문에 화면면 적을 넓게 차지하지 않음. 실습 4-1MFC 기본 컨트롤 사용법 MFC 에서 가장 많이 사용되는 기본 컨트 롤들을 이용하여 메인 대화상자를 만들고 사용자들의 컨트롤 사용에 따라 컨트롤의 동작을 List Box에 출력하고 Combo Box 에 저장하고 삭제할 수 있는 프로그램을 작성 실습 4-1 • 실행 결과 실습 4-1프로그램 작성 순서 ① ② • ① ② 다이얼로그 기반의 프로젝트 생성한다. 메인 대화상자의 폼을 구성한다. 컨트롤들을 배치하고 속성을 설정한다. 컨트롤들을 멤버 변수와 연결한다. 각 컨트롤에 대한 메시지 핸들러 함수를 생 성 ③ 프로그램을 실행한다 실습 4-1대화상자의 폼 구성 • 왼쪽의 컨트롤 도구상자에서 컨트롤들을 선택 하여 오른쪽 대화상자와 같이 배치한다. 실습 4-1컨트롤을 멤버변수와 연결하는 방법 1) DDX를 이용하는 방법 • Value : • 컨트롤에 설정되어 있는 값만 연결 • DDX_Text 계열 함수를 이용하여 자원에 연결 • Control : • 해당 컨트롤을 제어할 수 있는 컨트롤 클래스 와 연결 • DDX_Control 계열 함수를 이용하여 자원에 연결 실습 4-1컨트롤을 멤버변수와 연결하는 방법 2)컨트롤의 핸들로 클래스와 연결하는 방법 • 컨트롤의 핸들을 얻기 위해 컨트롤의 포인터를 • • • 받을 포인터 변수를 선언 GetDlgItem() 함수를 이용하여 컨트롤의 포인 터를 선언된 포인터 변수에 치환한다. 클래스의 멤버를 이용하여 컨트롤을 다룬다. 예) CListBox *pList; pList = (CListBox *)GeDlgItem(IDC_LIST1); pList->AddString(“데이터”); 실습 4-1Visual C++에서 DDX로 연결하는 방 법 ① 클래스 마법사에서 [멤버 변수]탭에서 컨트 롤 ID를 선택하고 [변수추가]버튼을 누른다 ② Ctrl키를 누른 상태에서 해당 컨트롤을 더블 클릭한다. • [멤버 변수 이름] 항목에 멤버 변수 이름을 • • 입력 [범주]항목에서 value로 연결할 것이지 control를 연결할 것인지 선택 Value로 연결할 경우 변수형식을 선택 DoDataExchange() 함수 • 대화상자의 여러 자원을 연결하는 기능을 하 는 함수 • 이 함수 안에는 DDX_Text 함수나 DDX_Control 함수를 이용하여 자원과 연결 • DDX_Control 형태로 연결되었을 경우는 변 수가 클래스로부터 상속 받았으므로 클래스의 멤버 함수를 마음대로 사용할 수 있다. UpdateData() 함수 • DDX_Value 형태로 연결되었을 경우는 UpdateData() 함수를 사용하여 자원을 update 하여야 한다. • 컨트롤에 있는 데이터를 변수에 가져오고자 한 다면 UpdateData(TRUE)를 사용한다. • 변수에 특정 값을 주고 그 값을 컨트롤에 보내고 싶다면 UpdateData(FALSE)를 사용한다. CListBox 클래스의 주요 멤버 함수 • GetCount( )함수 • ListBox의 아이템 수를 알기 위해 사용하는 함 수 • AddString( ) 함수 • ListBox의 맨 뒤에 문자열을 추가할 때 사용하 는 함수 • GetText( )함수 • ListBox로부터 문자열을 얻어올 때 사용되는 함수 • DeleteString( ) 함수 • ListBox의 아이템을 삭제할 때 사용하는 함수 CComboBox 클래스의 주요 멤버 함수 • ResetContent( )함수 • ComboBox의 모든 아이템을 제거할 때 사용 하는 함수 • AddString( ) 함수 • ComboBox의 맨 뒤에 문자열을 추가할 때 사 용하는 함수 • GetCurSel( )함수 • ComboBox에서 선택된 항목의 색인을 반환하 는 함수 대화상자 (dialog) 모달(Modal) 대화상자 모덜리스(Modeless) 대화상자 모달(Modal) 대화상자 • 모달 대화상자가 출력되면 부모 윈도우에서 작업을 할 수 없다. • 모달 대화상자를 닫아야 부모 윈도우에 포커 스를 둘 수 있다. • DoModal()함수를 이용하여 출력한다. 모덜리스(Modeless) 대화상자 • 모달 대화상자와는 달리 모덜리스 대화상자 는 닫지 않고도 애플리케이션 내의 다른 윈도 우에서 작업할 수 있고 다시 대화상자로 돌아 와 작업할 수 있는 대화상자 • 모덜리스 대화상자의 생성 방법 ① 대화상자에 대한 변수 선언 ② Create()함수를 이용하여 대화상자 생성 ③ 생성한 대화상자를 화면에 표시 모덜리스 대화상자의 생성의 예 CExDialogDlg m_Dlg; ① m_Dlg.Create(IDD_EXDIALOG, this); ….. ③ m_Dlg.ShowWindow(SW_SHOW) • Create()의 첫 번째 인수는 대화상자의 ID • Create()의 두 번째 인수는 부모 윈도우의 포 인터 공용 대화상자 • File 대화상자 • CFileDialog 클래스로 정의 • 생성자 함수에서 다음과 같이 호출 CFileDialog pDlg(TRUE); pDlg.DoModal(); • TRUE : Open 대화상자, FALSE : SaveAS 대화상자. 공용 대화상자 CFileDialog의 생성자 함수 CFileDialog( BOOL LPCTSTR LPCTSTR DWORD LPCTSTR CWnd* ); bOpenFileDialog, lpszDefExt = NULL, lpszFileName = NULL, dwFlags = OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT, lpszFilter = NULL, pParentWnd = NULL 공용 대화상자 Open 대화상자 출력 예 char Filter[ ] = "Text File(*.txt) | *.txt| 모든 파일(*.*)|*.*|"; CFileDialog pDlg(TRUE, "text file(*.txt)", "*.txt", OFN_HIDEREADONLY | OFN_FILEMUSTEXIST, Filter, NULL); if(pDlg.DoModal() == IDOK) { data = pDlg.GetPathName(); … … … } 공용 대화상자 Save 대화상자 출력 예 char Filter[ ] = "Text File(*.txt) | *.txt| 모든 파일(*.*) |*.*|"; CFileDialog pDlg(FALSE, "text file(*.txt)", "*.txt", OFN_HIDEREADONLY | OFN_FILEMUSTEXIST, Filter, NULL); if(pDlg.DoModal() == IDOK) { data = pDlg.GetPathName(); … … … } 공용 대화상자 • Font 대화상자 • 주로 텍스트 기반 애플리케이션에서 사용 • Font 대화상자는 텍스트의 글꼴, 크기, 문자 속성 등을 지정할 수 있는 대화상자 • 해당 클래스는 CFontDialog 공용 대화상자 Font 대화상자 출력하는 방법 CFontDialog fontDlg; fontDlg.DoModal(); Font를 받는 방법 • 폰트 구조체로 받음 LOGFONT logfont; fontDlg.GetCurrentFont(&logfont); • 실제 글꼴 생성 CFont font; font.CreateFontIndirect(&logfont); • 현재 DC의 글꼴을 선택함으로써 글꼴을 사용할 수 있 다 공용 대화상자 • Color 대화상자 • 사용자에게 색상을 선택하게 하는 대화상자 • 해당 클래스는 CColorDialog 공용 대화상자 Color 대화상자 사용법 CColorDialog colorDlg; If (colorDlg.DoModal() == IDOK) { COLORREF m_color = colorDlg.GetColor(); } 실습 4-2 단위 변환 프로그램 만들기 • 대화상자 기반으로 하여 단위 변환이 가능한 대 화상자를 만들고 변환 단위 표를 열람하는 프로 그램을 작성할 것 • Edit Control를 통해 현재 값을 입력하고, ComboBox에 저장 되어있는 단위들을 선택하 여 현재 단위에서 다른 단위로 변환이 가능하게 할 것이 • 변환하고 싶은 단위 표를 열람하기 위해서 모 덜리스 대화상자를 이용할 것 실습 4-2 • 실행 결과 실습 4-2 프로그램 작성 순서 1) 대화상자 기반의 프로젝트 생성한다. 2) 메인 대화상자의 폼을 구성한다. • 컨트롤들을 배치하고 속성을 설정한다. 3) 각각 컨트롤들을 멤버 변수와 연결한다. 4) Radio Button 컨트롤에 대한 메시지 핸들러 함수를 생성 5) 값을 변환하기 위한 Button 컨트롤에 대한 메 시지 핸들러 함수를 생성 실습 4-2 6) 변환 단위표를 열람할 수 있는 모덜리스 대화 상자를 생성 • 새로운 대화상자를 생성하고, 속성을 설정 • 새로 생성된 대화상자에 컨트롤을 배치 • 새로 만든 대화상자 자원을 다룰 클래스를 생 성 7) 모덜리스 형식으로 [변환 단위표]를 출력 8) 프로그램을 실행한다 CWnd 클래스 멤버 함수 • GetWindowRect( ) 함수 • 윈도우의 크기를 알기 위해 사용하는 함수 • MoveWindow( ) 함수 • 윈도우의 위치와 크기를 변경하는 함수 연습문제 4-1 표준 컨트롤을 이용한 데이터 이동 가능 대화상자 만들기 • 대화상자에 있는 버튼을 이용하여 에디트 박 스에 데이터를 입력하고 배치되어 있는 버튼 을 누르면 데이터가 이동, 복사가 되는 간단 한 데이터 복사 이동 프로그램을 작성하라. 연습문제 4-1 • 실행 결과 데이터 입력 및 복사 데이터 입력 및 이동