Kim Yeon Hee yhkim95@gmail.com 제4_1장 대화상자 Kim Yeon Hee yhkim95@gmail.com
목차 CDialog 클래스 대화상자 기반의 프로그램 실습 4-1 MFC 기본 컨트롤 사용법 익히기 모달 대화상자와 모덜리스 대화상자 공용 대화상자
CDialog클래스 대화상자 CDialog 클래스 사용자와 윈도우간의 인터페이스 대화상자는 CDialog 클래스로 정의 모든 윈도우 메시지 처리 가능
대화상자 기반의 프로그램 대화상자 기반의 프로그램 애플리케이션 클래스와 다이얼로그 클래스로 구성 클래스 기저 클래스 설 명 CWinApp 프로젝트 전체를 관리하는 클래스 다이얼로그 클래스 CDialog 대화상자의 기능을 구현하는 실제적인 클래스 도움말 대화상자 클래스 도움말 정보 클래스
대화상자 기반의 프로그램 대화상자 프로그램의 동작 프로그램 실행 생성자 함수 호출 OnCreate()호출 OnInitDialog()호출(대화상자가 화면에 보이기 바로 전에 실행-초기값부여) OnPaint() DoDataExchange()함수는 컨트롤을 어떤 방식으로 이용할지 결정한다.
대화상자 기반의 프로그램 컨트롤의 핸들로 클래스와 연결하는 방법 컨트롤의 핸들을 얻기 위해 컨트롤의 포인터를 받을 포인터 변수를 선언 GetDlgItem() 함수를 이용하여 컨트롤의 포인터를 선언된 포인터 변수에 치환한다. 클래스의 멤버를 이용하여 컨트롤을 다룬다. 예) CListBox *pList; pList = (CListBox *)GetDlgItem(IDC_LIST1); pList->AddString(“데이터”); 컨트롤의 핸들로 클래스와 연결 Ctrl + 컨트롤 더블클릭 설정확인 – 클래스 위저드, 혹은 ~Dlg클래스의 DoDataExChange()함수 확인 Ex) CEdit *pEdit; pEdit = (CEdit *)GetDlgItem(IDC_EDIT_TEXT); //인수는 컨트롤의 ID pEdit -> SetFocus(); //포커스를 줌
대화상자 기반의 프로그램 Visual C++에서 DDX로 연결하는 방법 DoDataExchaneg() Visual C++에서 DDX로 연결하는 방법 Class Wizard에서 Member Variables탭에서 컨트롤 ID를 선택하고 Add Variable 버튼을 누른다 Ctrl키를 누른 상태에서 해당 컨트롤을 더블클릭한다. Category항목에서 value로 연결할 것이지 control를 연결할 것인지 선택 Value로 연결할 경우 variable type을 선택 Member variable name 항목에 멤버 변수 이름을 입력
대화상자 기반의 프로그램 DoDataExchange() 함수 대화상자의 여러 자원을 연결하는 기능을 하는 함수 이 함수 안에는 DDX_Text 함수나 DDX_Control 함수를 이용하여 자원과 연결 DDX_Control 형태로 연결되었을 경우는 변수가 클래스로부터 상속 받았으므로 클래스의 멤버 함수를 마음대로 사용할 수 있다.
대화상자 기반의 프로그램 UpdateData() 함수 DDX_Value 형태로 연결되었을 경우는 UpdateData() 함수를 사용하여 자원을 update하여야 한다. 컨트롤에 있는 데이터를 변수에 가져오고자 한다면 UpdateData(TRUE)를 사용한다. 변수에 특정 값을 주고 그 값을 컨트롤에 보내고 싶다면 UpdateData(FALSE)를 사용한다. 자원 = 컨트롤
대화상자 종료 : PostQuitMessage( 0 );
대화상자 기반의 프로그램 CListBox 클래스의 주요 멤버 함수 GetCount( )함수 AddString( ) 함수 GetText( )함수 ListBox로부터 문자열을 얻어올 때 사용되는 함수 DeleteString( ) 함수 ListBox의 아이템을 삭제할 때 사용하는 함수 Return : 정수 인자 : AddString( 문자열 ) Return : 문자열 // 인자 GetText( 인덱스, CString 객체 ) 인자 : DeleteString( 인덱스 ) 1 . UpdateComboBox()함수 추가 List Box의 아이템 수를 세어서 그 개수만큼 Combo Box에 리스트항목 : n이라는 데이터 추가
대화상자 기반의 프로그램 CComboBox 클래스의 주요 멤버 함수 ResetContent( )함수 AddString( ) 함수 ComboBox의 맨 뒤에 문자열을 추가할 때 사용하는 함수 GetCurSel( )함수 ComboBox에서 선택된 항목의 색인을 반환하는 함수 Return : 정수
실습 4-1 MFC 기본 컨트롤 사용법 익히기 이번 실습에는 MFC 에서 가장 많이 사용되는 기본 컨트롤들을 이용하여 메인 대화상자를 만들고 사용자들의 컨트롤 사용에 따라 컨트롤의 동작을 List Box에 출력하고 Combo Box에 저장하고 삭제할 수 있는 프로그램을 작성하는 것이다.
실습 4-1 실행 결과
실습 4-1 프로그램 작성 순서 다이얼로그 기반의 프로젝트 생성한다. 메인 대화상자의 폼을 구성한다. 컨트롤들을 배치하고 속성을 설정한다. 컨트롤들을 멤버 변수와 연결한다. 각 컨트롤에 대한 메시지 핸들러 함수를 생성 프로그램을 실행한다
실습 4-1 대화상자의 폼 구성 IDC_EDIT_NAME 8 IDC_LIST_RESULT 1 2 3 4 IDC_EDIT_PHONE IDC_BUTTON_DELETE 5 6 7 IDC_BUTTON_INPUT IDC_BUTTON_CLEAR IDC_BUTTON_END
실습 4-1 ① ID : IDC_RMAN, Caption :남, Group :V ② ID : IDC_RWOMAN, Caption :여 ③ ID : IDC_RMIPIL, Caption :미필, Group :V ④ ID : IDC_RPIL, Caption :필 ⑤ ID : IDC_COMBO_VOLUMN,Vertical Scroll : v ⑥ ID : IDC_CHKA , Caption :A형 ⑦ ID : IDC_CHKB , Caption :B형 ⑧ ID : IDC_LIST_RESULT
실습 4-1 멤버변수 선언
실습 4-1 다이얼로그 박스 초기화 버튼 기능 코딩 콤보박스 리스트 추가 (1~9) 입력완료 버튼 자료 입력란에 적어도 이름은 입력되어야 함 빈칸 체크 자료입력란의 내용을 입력하고 입력완료 버튼을 누르면 출력자료 리스트 박스에 내용 추가 이름, 성별, 군필여부, 전화, 규격, 수량, 금액 순 A형 : 수량 * 1000/ B형 : 수량 * 2000 리스트 박스에 추가후 후 자료 입력란 Clear 클리어 이후 이름 입력 창에 커서 위치
실습 4-1 선택삭제 버튼 초기화 종료 리스트 박스에서 선택 후 선택삭제 버튼 누르면 삭제 선택하지 않은 경우 에러메시지 출력 자료 입력란 클리어 종료
모달 대화상자와 모덜리스 대화상자 모달(Modal) 대화상자 모달 대화상자가 출력되면 부모 윈도우에서 작업을 할 수 없다. 모달 대화상자를 닫아야 부모 윈도우에 포커스를 둘 수 있다. DoModal()함수를 이용하여 출력한다. CAllData *pDlg = new CAllData; pDlg->DoModal(); Delete pDlg; Modal 대화상자가 실행되면 부모 윈도우에 포커스를 줄 수 없다. Modal 대화상자를 종료 시켜야 부모 윈도우에 포커스를 줄 수 있다. 생성 Resource view 편집 ( ID를 준다 ex.. IDD_Dialog_Test ) class 추가 마법사 CDialog CDialogTest; //CDialog 형으로 객체 생성
모달 대화상자와 모덜리스 대화상자 모덜리스(Modeless) 대화상자 모달 대화상자와는 달리 모덜리스 대화상자는 닫지 않고도 애플리케이션 내의 다른 윈도우에서 작업할 수 있고 다시 대화상자로 돌아와 작업할 수 있는 대화상자 모덜리스 대화상자의 생성 방법 대화상자에 대한 변수 선언 Create()함수를 이용하여 대화상자 생성 생성한 대화상자를 화면에 표시 CDialog pDlg; ShowWindow();
모달 대화상자와 모덜리스 대화상자 모덜리스 대화상자의 생성의 예 CExDialog m_Dlg; m_Dlg.Create(IDD_EXDIALOG, this); ….. m_Dlg.ShowWindow(SW_SHOW) Create()의 첫 번째 인수는 대화상자의 ID Create()의 두 번째 인수는 부모 윈도우의 포인터 대화 상자 ID 부모 대화상자의 포인터 화면에 보여줌. // 감추기 : SW_HIDE 대화상자 클래스에 대한 변수 선언 Create()함수를 사용하여 대화상자 만든다(첫번째인자는 대화상자의 ID, 두번째 인자는 부모 윈도우의 포인터) ShowWindow()함수를 이용하여 화면에 보여짐(인자는 화면에 보여지는 스타일에 대한 플래그 변수)
공용 대화상자 File 대화상자 CFileDialog 클래스로 정의 생성자 함수에서 다음과 같이 호출 CFileDialog pDlg(TRUE); pDlg.DoModal(); TRUE : Open 대화상자, FALSE : SaveAS 대화상자. 첫 번째 인수 : TRUE -> open / FALSE -> save
공용 대화상자 CFileDialog의 생성자 함수 CFileDialog( BOOL bOpenFileDialog, LPCTSTR lpszDefExt = NULL, LPCTSTR lpszFileName = NULL, DWORD dwFlags = OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT, OFN_FILEMUSTEXIST, LPCTSTR lpszFilter = NULL, CWnd* pParentWnd = NULL ); 첫 번째 인수 : TRUE -> open / FALSE -> save 두 번째 인수 : 기본 확장자를 써줌 세 번째 인수 : 기본 파일명 네 번째 인수 : 읽기 전용은 숨겨서 출력 네 번째 인수 : 덮어 쓸 때 물어 볼 것인지 네 번째 인수 : 현재 보여지는 윈도우에 있는 내용만 불러옴 다섯 번째 인수 : 지원 가능한 확장자를 써줌
공용 대화상자 Open 대화상자 출력 예 CFileDialog pDlg( TRUE, //열기 Modal 상자 _T(“Text 파일(*.txt)|*.txt|", NULL, //기본 확장자 설정,기본 파일명 설정은 기본값인(NULL) OFN_HIDEREADONLY| //읽기 전용파일은 숨겨서 보여짐 OFN_FILEMUSTEXIST, //현재 보여지는 파일만 불러 오는 게 가능함 _T(“Text 파일(*.txt)|*.txt|모든 파일(*.*)|*.*|, //지원 가능한 확장자 설정 NULL); if(pDlg.DoModal() == IDOK) { data = pDlg.GetPathName(); //코딩 }
공용 대화상자 Save 대화상자 출력 예 CFileDialog pDlg( FALSE, //열기 Modal 상자 _T("Text 파일(*.txt)|*.txt|"), NULL, //기본 확장자 설정,기본 파일명 설정은 기본값인(NULL) OFN_HIDEREADONLY | //읽기 전용파일은 숨겨서 보여짐 OFN_OVERWRITEPROMPT, //덮어 쓸 것 인지 물어봄 _T("Text 파일(*.txt)|*.txt|모든파일(*.*)|*.*|"), //지원 가능한 확장자 설정 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 대화상자 주로 텍스트 기반 애플리케이션에서 사용 해당 클래스는 CFontDialog
공용 대화상자 Font 대화상자 출력하는 방법 CFontDialog fontDlg; fontDlg.DoModal(); 폰트 구조체로 받음 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(); }