객체지향프로그래밍응용 Chap 4. 대화상자와컨트롤 (#1) 2013.09.27. 오병우 컴퓨터공학과금오공과대학교
Control 들을가진윈도우 Dialog 개요 사용자의입력을받기위한 Object 의집합 종류 프로그램수행도중사용자의입력이필요할때다이얼로그박스출력 다이얼로그박스는사용자로부터입력받은데이터를메인루틴에넘기고소멸 Modal Dialog Parent window 비활성화 ( 열기 ) Modeless Dialog Parent windows 활성화유지 ( 찾기 ) Common Dialog 운영체제에내장 ( 글꼴 ) Department of Computer Engineering 2
작성 Dialog 작성및사용방법 VC++ 의리소스편집기를사용하여 layout 구성 사용 *.rc 파일에저장 Control Notification ON_CONTROL, ON_BN_CLICKED, ON_EN_UPDATE() 등의 Message Map Entry Macro 사용 컨트롤에해당하는멤버변수 (Value Type or Control Type) 를만들고 DDX(DoDataExchange) 를통해동기화 m_name m_age Programming ( 사용 ) Layout ( 작성 ) Department of Computer Engineering 3
목표 MFC-SDI(Single Document Interface) 사용 Dialog 를통해이름과 Font 를입력받아서화면에출력 윈도우가가렸다가나타나도내용이지워지지않도록 Document 클래스사용과정 Dialog 생성 이름을입력받기위해 Control 들을화면에배치하여 Layout 구성 작성한 Dialog 를 Control 하기위한 CDialog 의파생 Class 생성및연결 Edit Control 의 Value Type Variable 생성 CDialog 의파생 Class 의 Member Variable 과연결 메뉴에서작성한 Dialog 를호출할수있도록메시지핸들러작성 Document Class 에입력받은이름을저장할수있는 Member Variable 생성및초기화 작성한 Dialog 의 header file 을 include 메뉴처리메시지핸들러에서 Dialog 변수생성 DoModal() 함수호출 Font 를위한 Common Dialog 를호출할수있도록메시지핸들러작성 Document Class 에입력받은 Font 와 Color 를저장할수있는 Member Variable 생성및초기화 Department of Computer Engineering 4
리소스추가 클릭 선택 선택 Department of Computer Engineering 5
Dialog 박스 Layout 구성 서식 탭순서 (ctrl + D) 변경 변경 Resource.h 변경 테스트 변경 Department of Computer Engineering 6
Dialog 클래스생성 다이얼로그를선택한후에프로젝트 클래스추가 바로나타나지않는다면왼쪽에있는범주를 MFC 로선택하고오른쪽템플릿에서 MFC 클래스선택후에추가버튼클릭 기본클래스를 CDialog 로선택하고대화상자 ID 선택 Dialog 의이름입력 여러개일경우선택가능 File 이새로생성되므로 Dialog 를사용하려면 Header File 을 Include 해야함 Department of Computer Engineering 7
Value Type 변수연결 2. Double Click 3. 오른쪽 Click 또는 ctrl+ Double Click 1. Resource Tab 4. 변수이름입력 (m_editname) 변경 Department of Computer Engineering 8
생성결과 Source File (NameDlg.cpp) Header File (NameDlg.h) Department of Computer Engineering 9
메뉴에추가 2. Insert 키 3. 입력 1. Double Click 5. 메뉴는 IDM_ 으로시작하는아이디부여 4. 뒤의 은 Dialog 가뜬다의미 Department of Computer Engineering 10
메뉴처리메시지핸들러생성 마우스오른쪽클릭 1. 오른쪽 Click 2. Document Class 선택 3. OK Department of Computer Engineering 11
메뉴처리메시지핸들러구현 Dialog 의 Header File 을 Include 해야함 Header File 을 Include 처리코드입력 에러발생!!! Department of Computer Engineering 12
Dialog 사용하기 이름저장을위한변수 이름반환함수 Dialog Box 표시 Document 에서데이터가변경되었으니 View 를다시그리시오. 초기화 1 주석으로되어있으면풀것 초기화 2 F5 눌러서실행 Department of Computer Engineering 13
Dialog 의 Value Type 멤버변수세팅 초기화부분변경, OnNewDocument() 도같이변경 현재의이름으로초기화 Department of Computer Engineering 14
폰트를위한메뉴추가 ( 속성편집창이용 ) 속성편집기 입력 Click View Class 입력 Department of Computer Engineering 15
View 클래스에서 Font 처리 안나타남 Department of Computer Engineering 16
Font 초기화처리 나타남 이전에선택했던것이보존되지않음 Department of Computer Engineering 17
Font Dialog 에서이전글꼴및색초기화 Department of Computer Engineering 18
Control 도 Window 기존버튼과다른동작을원한다면 CButton 의파생 Class 만들고 Function Overriding Message Map Handler 예제 : http://www.codeguru.com/cpp/controls/buttonctrl/ 발췌 : http://www.codeguru.com/cpp/controls/buttonctrl/advancedbuttons/article.php/c8395/ class CColorButton : public CButton { < 중략 > private: // Overrides // ClassWizard generated virtual function overrides public: virtual void DrawItem(LPDRAWITEMSTRUCT lpdrawitemstruct); // Generated message map functions protected: //{{AFX_MSG(CColorButton) afx_msg int OnCreate(LPCREATESTRUCT lpcreatestruct); //}}AFX_MSG DECLARE_MESSAGE_MAP() }; Department of Computer Engineering 19
Control 도 Window DC 가지고있음 Control 도 Window F5 눌러서실행 Department of Computer Engineering 20
다이얼로그의투명도지정 OnInitDialog() 오버라이딩 Alpha 값지정 투명다이얼로그 Win98 이하동작하지않음 // CRadiusDlg 메시지처리기입니다. BOOL CRadiusDlg::OnInitDialog() { CDialog::OnInitDialog(); // 0 <= alpha <= 1 double alpha = 0.4; ModifyStyleEx(0, WS_EX_LAYERED); SetLayeredWindowAttributes(0, (int)(255. * alpha), LWA_ALPHA); } return TRUE; // return TRUE unless you set the focus to a control // 예외 : OCX 속성페이지는 FALSE 를반환해야합니다. Department of Computer Engineering 21
Dialog 에메뉴추가 다이얼로그메뉴 리소스뷰에서다이얼로그선택 속성에서 Menu 선택 Combo Box 눌러서메뉴선택 Department of Computer Engineering 22
다이얼로그리소스재사용 실행프로그램의 Resource 파일재사용 Drag & Drop 으로 Resource 에추가가능 Department of Computer Engineering 23
Modeless Dialog 사용하려는 Window에 Dialog의 Pointer를 Member Variable로선언 Class CMainFrame : public CFrameWnd { COpinionDlg *m_pdlg; } 동적으로할당하여사용 m_pdlg = new COpinionDlg; m_pdlg.create(idd_opinion); c.f.) Modal Dialog 는 local variable 생성 : Create() 화면출력 : ShowWindow() cf.) Modal Dialog 는 DoModal() 종료 : DestroyWindow() Department of Computer Engineering 24