객체지향프로그래밍응용 Chap 4. 대화상자와컨트롤 (#2) 2012.10.08. 오병우 컴퓨터공학과금오공과대학교
Control 들을가진윈도우 Dialog 개요 사용자의입력을받기위한 Object 의집합 종류 프로그램수행도중사용자의입력이필요할때다이얼로그박스출력 다이얼로그박스는사용자로부터입력받은데이터를메인루틴에넘기고소멸 Modal Dialog Parent window 비활성화 ( 열기 ) Modeless Dialog Parent windows 활성화유지 ( 찾기 ) Common Dialog 운영체제에내장 ( 글꼴 ) Department of Computer Engineering 2
Control Button, Check Box Edit, Spin Picture, Static Text Group Box, Radio Button List Box, Combo Box Slider, Scroll Bar Hot key, Tree, List Rich Edit, Date Time Picker, Month Calendar, IP Address, Progress, Tab, Animation Control 의종류 Class 없네? CButton 같은 CWnd 의파생클래스이므로 WM_PAINT 등처리가능 Control 도 Window 다!!! Department of Computer Engineering 3
MFC Class 및 MFC 파생 Class Dialog 위의 Control MFC Class 그대로사용가능 사용자정의 Dialog CDialog 의파생 Class 만들고사용 Function overriding Message Map Control Dialog Department of Computer Engineering 4
CDialog 파생 Class 에추가해야하는기능 사용자가컨트롤에입력한내용관리 Value Type Member Variable e.g., Edit Control 의입력내용 DDX_Text( -, ID, 변수 ) 컨트롤제어 IDC_ 로시작 Control Type Member Variable e.g., Edit Control 의 Disabled ( 비활성화 ) m_ctrlbeauty.enablewindow(false); DDX_Control( -, ID, 변수 ) DoDataExchange() 함수내에서처리 IDC_ 로시작 Department of Computer Engineering 5
멤버변수생성 Value Type Member Variable Ctrl 을누른상태에서 Control 더블클릭 DDV(Dialog Data Validation) 도지정가능 멤버변수추가마법사에서지정 int: Min & Max Value CString: Max Characters Value Type 으로변경 Dept. of Computer Engineering 6
Control 별 Value Type Member Variable CheckBox BOOL Radio Button int Group 별로 Tab order 에따라서몇번째가선택되었는지정수 Combo Box & ListBox CString 선택된문자열 Edit CString, int, UINT, long, DWORD, float, double, BYTE, short, BOOL, COleDateTime, COleCurrency Spin 직접연결못함 Edit Control 과 indirect 연결 Auto Buddy, Set Buddy Integer, Alignment-Right 로설정 Department of Computer Engineering 7
UpdateData() Control 과의 Data Sync. TRUE: 화면에서가져옴 다이얼로그박스컨트롤이름 : 일지매 UpdateData(FALSE) Value 형멤버변수 CString m_strname; 나이 : 20 int m_nage; OK Cancel UpdateData(TRUE) Department of Computer Engineering 8
Dialog 의처리과정 Constructor Dialog 시작 DoModal() Window 에서는 WM_CREATE Dialog 종료 OK 버튼 컨트롤초기화는여기에 ~ WM_INITDIALOG OnInitDialog() VS2003 부터는 Overriding 으로변경됨 IDOK OnOK() 사용자 UpdateData(FALSE) 입력 UpdateData(TRUE) DoDataExchange() Dialog Data exchange DoDataExchange() DDX_...() DDX_...() Dialog Data Validation DDV_...() 멤버변수에서 Control 로 데이터전달 Control 에서멤버변수로 데이터전달 Destructor Department of Computer Engineering 9
Control Type Member Variable Dialog 위에놓여진 Control들을직접제어컨트롤과 Control형멤버변수연결 Ctrl을누른상태에서 Control 더블클릭 Category( 범주 ) 에서 Control 선택 Control Class Control Type 선택 Department of Computer Engineering 10
Control Member Functions 주요함수 (MSDN 참조 ) CWnd Create, ShowWindow, EnableWindow, SetWindowPos, SetWindowText CEditClass GetSel, SetSel, ReplaceSel, GetLineCount, GetLine CButton (Check Box 및 Radio Button 포함 ) GetCheck, SetCheck CSpinButtonCtrl GetRange, SetRange, GetPos, SetPos, GetBuddy, SetBuddy CScrollBar GetScrollRange, SetScrollRange, GetScrollPos, SetScrollPos CListBox, CComboBox GetCount, GetCurSel, SetCurSel, AddString, InsertString, DeleteString, ResetContent, Dir Department of Computer Engineering 11
Control 초기화 Dialog 의 OnInitDialog() 를재정의하고여기서초기화 DoModal() 을해야지비로소윈도우생성 WM_INITDIALOG c.f.) 일반윈도우는 WM_CREATE 초기상태를비활성화로만들기 m_[control 변수명 ].EnableWindow(FALSE); Event Control 로부터 Dialog 로전달되는 Message VS2003 부터는 Overriding 으로변경됨 Control 자체에서처리하는것이아니고 Dialog 를거쳐서처리 자체에서처리하면다른 Control 처리가힘들기때문 Control 의파생 Class 를만들지않아도됨 Dialog 에서 Message Handler 만들어야함 Dialog Control 1 Control 2 Control n 포함 Department of Computer Engineering 12
주요 Message Notification Messages Button (Check Box 및 Radio Button 포함 ) Edit BN_CLICKED, BN_DOUBLECLICKED EN_CHANGE, EN_SETFOCUS, EN_KILLFOCUS List Box LBN_DBLCLK, LBN_SELCHANGE, LBN_SETFOCUS,LBN_KILLFOCUS Combo Box CBN_DBLCLK, CBN_SELCHANGE, CBN_SETFOCUS, CBN_KILLFOCUS, CBN_EDITCHANGE Department of Computer Engineering 13
실습 Project 및 Dialog 생성 다이얼로그선택후에속성에서 Caption 변경 선택 선택 해제 클릭 Department of Computer Engineering 14
실습 CDialog 의파생 Class 생성 또는다이얼로그선택후마우스오른쪽버튼눌러서 클래스추가 입력 Department of Computer Engineering 15
실습 메뉴연결 1 3 2 4 5 F5 눌러서실행 Department of Computer Engineering 16
실습 Edit Control 을위한 Control Type Member Variable 생성 Edit Control 선택후에 Ctrl+DoubleClick Header File Source File Department of Computer Engineering 17
실습 OnInitDialog() Function Override Edit Control 을비활성화 클릭 F5 눌러서실행 Department of Computer Engineering 18
실습 CheckBox 를위한 Value Type Member Variable 생성 CheckBox 선택후에 ctrl+doubleclick 입력 m_check 체크변경하지말것 선택 Department of Computer Engineering 19
실습 Control Notification Message Handler BN_CLICKED 이벤트를처리할함수추가 클릭 생성된코드확인 COpinionDlg.cpp 화면 (Layout) 으로부터 Control 의정보를소스코드로가져옴 화면으로부터가져온 m_check 값이 TRUE 이면 Edit 활성화, FALSE 이면비활성화 F5 눌러서실행 Department of Computer Engineering 20
Summary Relationship Diagram MFC Class Layout IDD_DIALOG1 IDC_CHECK1 UpdateData(TRUE) DDX Inherit Inherited Class COpinionDlg enum { IDD = IDD_DIALOG1 } DoDataExchange() BOOL m_check Value Type IDC_EDIT1 Event BN_CLICKED Control Functions 재정의함 CEdit m_ctrledit DoModal() OnInitDialog() UpdateData() Call OnBnClickedCheck1() Control Type Call 재정의하지않음 재정의하지않음 Department of Computer Engineering 21