Microsoft PowerPoint - hci2-lecture8.ppt

Similar documents
<4D F736F F F696E74202D203038C0E520C7A5C1D820C4C1C6AEB7D1205BC8A3C8AF20B8F0B5E55D>

Microsoft PowerPoint - hci2-lecture8.ppt

윈도우즈 프로그래밍

Microsoft PowerPoint - 09-CE-14-리스트콤보박스

윈도우시스템프로그래밍

윈도우 프로그래밍의 개념

윈도우시스템프로그래밍

Microsoft Word - hci08-final-answer.doc

04장 메시지 처리 유형

PowerPoint Template

Programming hwp

<4D F736F F F696E74202D203039C0E520B4EBC8ADBBF3C0DA205BC8A3C8AF20B8F0B5E55D>

Microsoft PowerPoint - hci2-lecture9.ppt

<4D F736F F F696E74202D20C1A C0E520B5B5C5A5B8D5C6AE20C6C4C0CF20C0D4C3E2B7C220B9D720B4D9BEE7C7D120BAE420C5ACB7A1BDBA2E BC8A3C8AF20B8F0B5E55D>

[제1강] 텍스트를 입력하세요

윈도우 프로그래밍의 개념

5장 MFC기반 다지기

PowerPoint 프레젠테이션

var answer = confirm(" 확인이나취소를누르세요."); // 확인창은사용자의의사를묻는데사용합니다. if(answer == true){ document.write(" 확인을눌렀습니다."); else { document.write(" 취소를눌렀습니다.");

Microsoft PowerPoint - hci2-lecture11.ppt

Microsoft Word - hci07-final-answer.doc

윈도우 프로그래밍의 개념

Microsoft PowerPoint - hci2-lecture11.ppt

<B9CCB5F0BEEE20C1A4BAB8C3B3B8AE2E687770>

Microsoft PowerPoint - CPP_chap7_dialogbox(2)

Visual Basic 반복문

윈도우 프로그래밍의 개념

Visual Basic 기본컨트롤

Microsoft PowerPoint - 09-CE-5-윈도우 핸들

안드로이드기본 11 차시어댑터뷰 1 학습목표 어댑터뷰가무엇인지알수있다. 리스트뷰와스피너를사용하여데이터를출력할수있다. 2 확인해볼까? 3 어댑터뷰 1) 학습하기 어댑터뷰 - 1 -

PowerPoint Presentation

12 강. 문자출력 Direct3D 에서는문자를출력하기위해서 LPD3DXFONT 객체를사용한다 LPD3DXFONT 객체생성과초기화 LPD3DXFONT 객체를생성하고초기화하는함수로 D3DXCreateFont() 가있다. HRESULT D3DXCreateFont

JAVA 프로그래밍실습 실습 1) 실습목표 - 메소드개념이해하기 - 매개변수이해하기 - 새메소드만들기 - Math 클래스의기존메소드이용하기 ( ) 문제 - 직사각형모양의땅이있다. 이땅의둘레, 면적과대각

歯Lecture2.PDF

<4D F736F F F696E74202D203031C0E520C0A9B5B5BFEC20C7C1B7CEB1D7B7A1B9D620B1E2C3CA5FBFB5B3B2C0CCB0F8B4EB205BC8A3C8AF20B8F0B5E55D>

C++ Programming

윈도우시스템프로그래밍

Visual C++의 개요

슬라이드 1

Microsoft PowerPoint _대화상자.ppt

API - Notification 메크로를통하여어느특정상황이되었을때 SolidWorks 및보낸경로를통하여알림메시지를보낼수있습니다. 이번기술자료에서는메크로에서이벤트처리기를통하여진행할예정이며, 메크로에서작업을수행하는데유용할것입니다. 알림이벤트핸들러는응용프로그램구현하는데있어

8 장데이터베이스 8.1 기본개념 - 데이터베이스 : 데이터를조직적으로구조화한집합 (cf. 엑셀파일 ) - 테이블 : 데이터의기록형식 (cf. 엑셀시트의첫줄 ) - 필드 : 같은종류의데이터 (cf. 엑셀시트의각칸 ) - 레코드 : 데이터내용 (cf. 엑셀시트의한줄 )

untitled

[ 그림 8-1] XML 을이용한옵션메뉴설정방법 <menu> <item 항목ID" android:title=" 항목제목 "/> </menu> public boolean oncreateoptionsmenu(menu menu) { getme

UI TASK & KEY EVENT

윈도우시스템프로그래밍

쉽게 풀어쓴 C 프로그래밍

<4D F736F F F696E74202D20C1A63034B0AD202D20C7C1B7B9C0D3B8AEBDBAB3CABFCD20B9ABB9F6C6DBC0D4B7C2>

Microsoft PowerPoint - hci2-lecture5-messagemap.ppt

4S 1차년도 평가 발표자료

PowerPoint Presentation

chap 5: Trees

Programming hwp

Microsoft PowerPoint - chap02-C프로그램시작하기.pptx

PowerPoint 프레젠테이션

1. 객체의생성과대입 int 형변수 : 선언과동시에초기화하는방법 (C++) int a = 3; int a(3); // 기본타입역시클래스와같이처리가능 객체의생성 ( 복습 ) class CPoint private : int x, y; public : CPoint(int a

Microsoft PowerPoint UI-Event.Notification(1.5h).pptx

<4D F736F F F696E74202D203036C0E520BBE7BFEBC0DA20C0CEC5CDC6E4C0CCBDBA205BC8A3C8AF20B8F0B5E55D>

4장기본프로그래밍2

Microsoft PowerPoint - java1-lab5-ImageProcessorTestOOP.pptx

PowerPoint Presentation

(Microsoft PowerPoint - 07\300\345.ppt [\310\243\310\257 \270\360\265\345])

UI TASK & KEY EVENT

쉽게 풀어쓴 C 프로그래밍

Programming hwp

Microsoft PowerPoint - CPP_chap3

그래픽 프로그래밍

학습목표 함수프로시저, 서브프로시저의의미를안다. 매개변수전달방식을학습한다. 함수를이용한프로그래밍한다. 2

제이쿼리 (JQuery) 정의 자바스크립트함수를쉽게사용하기위해만든자바스크립트라이브러리. 웹페이지를즉석에서변경하는기능에특화된자바스크립트라이브러리. 사용법 $( 제이쿼리객체 ) 혹은 $( 엘리먼트 ) 참고 ) $() 이기호를제이쿼리래퍼라고한다. 즉, 제이쿼리를호출하는기호

K&R2 Reference Manual 번역본

Dialog Box 실행파일을 Web에 포함시키는 방법

<443A5C4C C4B48555C B3E25C32C7D0B1E25CBCB3B0E8C7C1B7CEC1A7C6AE425CC0E7B0EDB0FCB8AE5C53746F636B5F4D616E D656E74732E637070>

Comtrol ID 레이블 Hotkey Callback 함수 ⑴ Button, IDC_BTN_DEPT, &Department, OnBtnDepartment ⑵ Button, IDC_BTN_EMP, &Employee, OnBtnEmployee ⑶ Button, IDC_B

Javascript

Microsoft PowerPoint - CSharp-10-예외처리

10 장세균전프로그래밍 10.1 게임룰 (1) 사람과컴퓨터가싸우는 2인용보드게임이다. (2) 사람이먼저움직이고, 컴퓨터가움직인다. (3) 세균을가로및세로방향으로 2칸까지빈칸으로이동시킬수있다. (4) 1칸을이동할경우에는복제가된다. (5) 이동한후주변세균은내편으로바뀐다.

슬라이드 1

Microsoft PowerPoint - Java7.pptx

[ 마이크로프로세서 1] 2 주차 3 차시. 포인터와구조체 2 주차 3 차시포인터와구조체 학습목표 1. C 언어에서가장어려운포인터와구조체를설명할수있다. 2. Call By Value 와 Call By Reference 를구분할수있다. 학습내용 1 : 함수 (Functi

1장 윈도우 프로그래밍 들어가기

어댑터뷰

Microsoft PowerPoint - chap06-2pointer.ppt

윈도우시스템프로그래밍

슬라이드 1

윈도우즈프로그래밍(1)

Convenience Timetable Design

Programming hwp

C++ Programming

쉽게 풀어쓴 C 프로그래밍

Microsoft PowerPoint - C++ 5 .pptx

[제1강] 텍스트를 입력하세요

<4D F736F F F696E74202D B3E22032C7D0B1E220C0A9B5B5BFECB0D4C0D3C7C1B7CEB1D7B7A1B9D620C1A638B0AD202D20C7C1B7B9C0D320BCD3B5B5C0C720C1B6C0FD>

iii. Design Tab 을 Click 하여 WindowBuilder 가자동으로생성한 GUI 프로그래밍환경을확인한다.

<443A5C4C C4B48555C B3E25C32C7D0B1E25CBCB3B0E8C7C1B7CEC1A7C6AE425CBED0C3E0C7C1B7CEB1D7B7A55C D616E2E637070>

1. auto_ptr 다음프로그램의문제점은무엇인가? void func(void) int *p = new int; cout << " 양수입력 : "; cin >> *p; if (*p <= 0) cout << " 양수를입력해야합니다 " << endl; return; 동적할

DLL(Dynamic Linked Library)

[ 그림 7-1] 프로젝트 res 폴더 이미지뷰 [ 예제 7-1] 이미지뷰 1 <LinearLayout 2 ~~~~ 중간생략 ~~~~ 3 android:orientation="vertical" > 4 <ImageView

Chapter 4. LISTS

Microsoft PowerPoint - hci2-lecture7.ppt

목차 1. 시스템요구사항 암호및힌트설정 ( 윈도우 ) JetFlash Vault 시작하기 ( 윈도우 ) JetFlash Vault 옵션 ( 윈도우 )... 9 JetFlash Vault 설정... 9 JetFlash Vault

Transcription:

표준컨트롤 HCI Programming 2 (321190) 2008 년가을학기 11/11/2008 박경신 Overview FormView 컨트롤 (Control) 의동작원리 표준컨트롤의다양한속성과통지메시지 버튼, 에디트, 체크박스, 라디오버튼, 리스트박스등 MFC 컨트롤클래스를이용하여표준컨트롤을다루는방법 서브클래싱과메시지반사기법 2 Form View FormView Project 생성 CView 를상속받은 SDI 형태의프로그램구조를갖고있으면서도, 컨트롤을사용할수있는형태 CMainFrame 의자식윈도우 CFormView 클래스를상속받아사용자정의폼뷰프로그램을작성 3 // 뷰가화면에보여지기전에호출되는함수, FormView로생성시자동추가 // 컨트롤초기화를위한함수 void CExButtonView::OnInitialUpdate(){ CFormView::OnInitialUpdate(); GetParentFrame()->RecalcLayout(); ResizeParentToFit(); /// 컨트롤초기화코드추가부분 4

FormView 의리소스 컨트롤 컨트롤 표준화된형태와특성을가진윈도우 사용자에게입력을받거나정보를보여줌 5 6 컨트롤과부모윈도우 컨트롤과부모윈도우 1통지메시지컨트롤 ( 자식윈도우 ) 2 컨트롤메시지 통지메시지 (Notification Message) 대개 WM_COMMAND 메시지를보냄 컨트롤의상태가변화되었음을알림 메모리부족등으로인한오류를알림 컨트롤메시지 (Control Message) 부모윈도우 부모윈도우는컨트롤의상태를알아내거나변경시키기위해사용 ShowWindow() 함수를이용하여컨트롤을보이게하거나숨길수있으며, EnableWindow() 함수를이용하여컨트롤을사용하거나사용하지못하게할수있음 7 MFC 컨트롤클래스 MFC 컨트롤클래스 컨트롤 MFC 클래스 컨트롤버튼 버튼컨트롤 CButton 정적컨트롤 CStatic 편집컨트롤 CEdit 리스트박스컨트롤 CListBox 콤보박스컨트롤 CComboBox 스크롤바컨트롤 CScrollBar 8

MFC 클래스계층도 MFC 클래스계층도 버튼컨트롤 버튼컨트롤종류 Push Button, Check Box, Radio Button, Group Box 컨트롤도윈도우다! 라디오버튼그룹 그룹으로묶어야할라디오버튼중첫번째항목에그룹속성부여 9 10 버튼컨트롤 버튼컨트롤 컨트롤생성방법 1. 일반윈도우에서동적버튼컨트롤만들기 2. 대화상자에만들기일반윈도우에서동적버튼컨트롤생성 - 첫번째방법 버튼생성함수 CButton::Create() BOOL CButton::Create (LPCTSTR lpszcaption, DWORD dwstyle, const RECT& rect, CWnd* pparentwnd, UINT nid) ; CButton m_button; // C++ 객체생성 m_button.create(" 누르세요 ", WS_CHILD WS_VISIBLE BS_PUSHBUTTON, CRect(100, 100, 200, 130), this, 101); // 푸시버튼생성 lpszcaption - 캡션문자열 dwstyle - 일반윈도우스타일 + 버튼컨트롤스타일 BS_PUSHBUTTON/BS_CHECKBOX/BS_RADIOBUTTON/BS_GR OUPBOX rect - 컨트롤크기와위치 pparentwnd - 부모윈도우 UINT nid - 컨트롤 ID 11 12

버튼컨트롤 버튼컨트롤스타일 버튼컨트롤 버튼컨트롤통지메시지 버튼컨트롤스타일 BS_PUSHBUTTON BS_DEFPUSHBUTTON BS_CHECKBOX BS_AUTOCHECKBOX BS_3STATE BS_AUTO3STATE BS_RADIOBUTTON BS_AUTORADIOBUTT ON 의미 푸시버튼 기본푸시버튼 : 대화상자에서사용할때는 Enter 키를누르면이버튼이눌려짐 ( 일반윈도우에서는차이없음 ) 체크박스자동체크박스 : 클릭하면자동으로체크표시가 On/Off 3상태체크박스자동 3상태체크박스 : 클릭하면자동으로체크표시가 On/Grayed/Off 라디오버튼자동라디오버튼 : 클릭하면자동으로선택과선택해제가이뤄짐과선택해제가이루어짐 통지메시지 BN_CLICKED BN_DBLCLK BN_DISABLE BS_DOUBLECLICKED BN_HILITE BN_UNHILITE BN_SETFOCUS BN_KILLFOCUS BN_PAINT 내용버튼을좌측마우스버튼으로클릭했음버튼을좌측마우스버튼으로더블클릭했음버튼이비활성화되었음라디오버튼이나 BS_OWNERDRAW 스타일버튼에서좌측마우스버튼을더블클릭했음사용자가버튼을선택하였을때발생하는메시지사용자가버튼에서다른윈도우로전환되었을때메시지버튼에포커스가주어졌을때메시지버튼에서포커스가사라졌을때메시지버튼이다시그려질때발생하는메시지 BS_GROUPBOX 그룹박스 13 14 버튼컨트롤 통지메시지처리하기 (Control->Parent) 메시지핸들러작성 버튼컨트롤예제작성 프로젝트생성 ON_BN_CLICKED(101, OnButtonClicked) // 메시지맵... void CExButtonView::OnButtonClicked() // 메시지핸들러 { MessageBox(" 버튼을눌렀습니다."); 컨트롤메시지보내기 (Parent->Control) 멤버함수호출 m_button.setcheck(bst_checked); 15 16

버튼컨트롤예제작성 1~6 단계옵션설정 버튼컨트롤예제작성 코드추가 단계변경사항 1 'Single document' 를선택한다. 2 Compound Document Support 변경사항없음 3 DB 변경사항없음 4 UI 변경사항없음 5 Advanced Features 'ActiveX Controls' 선택을해제한다. 6 Generated Classes 변경사항없음 17 class CExButtonView: public CView { DECLARE_DYNCREATE(CExButtonView) protected: CExButtonView(); public: CExButtonDoc* GetDocument(); CButton m_pushbutton; CButton m_checkbox; CButton m_radio1, m_radio2; CButton m_groupbox; 18 버튼컨트롤예제작성 버튼컨트롤예제작성 코드추가 int CExButtonView::OnCreate(LPCREATESTRUCT lpcreatestruct) { if (CView::OnCreate(lpCreateStruct) == -1) return -1; m_pushbutton.create( Push Button, WS_CHILD WS_VISIBLE BS_PUSHBUTTON, CRect(20, 20, 150, 50), this, 101); m_checkbox.create( Check Box, WS_CHILD WS_VISIBLE BS_AUTOCHECKBOX, CRect(20, 70, 150, 100), this, 102); m_radio1.create( Radio Button 1, WS_CHILD WS_GROUP BS_AUTORADIOBUTTON, CRect(20, 140, 150, 170), this, 103); m_radio2.create( Radio Button 2, WS_CHILD WS_GROUP BS_AUTORADIOBUTTON, CRect(20, 180, 150, 210), this, 104); 19 코드추가 m_groupbox.create( Group Box, WS_CHILD WS_VISIBLE BS_GROUPBOX, CRect(10, 110, 160, 220), this, 105); m_checkbox.setcheck(bst_checked); m_radio1.setcheck(bst_checked); return 0; BEGIN_MESSAGE_MAP(CExButtonView, CView) ON_COMMAND(ID_FILE_PRINT, &CView::OnFilePrint) ON_COMMAND(ID_FILE_PRINT_DIRECT, &CView::OnFilePrint) ON_COMMAND(ID_FILE_PREVIEW, &CView::OnFilePrintPreview) ON_WM_CREATE() ON_BN_CLICKED(101, OnButtonClicked) END_MESSAGE_MAP() 20

버튼컨트롤예제작성 버튼컨트롤예제작성 void CExButtonView::OnButtonClicked() { BOOL bcheckbox, bradio1, bradio2; bcheckbox = bradio1 = bradio2 = FALSE; if (m_checkbox.getcheck() == BST_CHECKED) bcheckbox = TRUE; if (m_radio1.getcheck() == BST_CHECKED) bradio1 = TRUE; if (m_radio2.getcheck() == BST_CHECKED) bradio2 = TRUE; CString str1, str2, str3; if (bcheckbox) str1 = 체크박스 on ; else str1 = 체크박스 off ; if (bradio1) str2 = 라디오버튼 1 on ; else str2 = 라디오버튼 1 off ; if (bradio2) str3 = 라디오버튼 2 on ; else str3 = 라디오버튼 2 off ; AfxMessageBox(str1 + \n + str2 + \n + str3); 21 실행결과 22 버튼컨트롤 대화상자에컨트롤생성 - 두번째방법 리소스의대화상자템플릿에컨트롤배치 대화상자가생성될때컨트롤도자동으로생성 컨트롤변수생성 컨트롤자체를나타내는변수 (= 컨트롤변수 ) 를생성하고이를이용하여컨트롤을조작 버튼컨트롤예제작성 대화상자에만들기 프로젝트생성 1~6단계옵션설정단계변경사항 1 'Single document' 를선택한다. 2 Compound Document Support 변경사항없음 3 DB 변경사항없음 4 UI 변경사항없음 5 Advanced Features 'ActiveX Controls' 선택을해제함 6 Generated Classes 에서뷰클래스의베이스클래스로 CFormView 를선택함 23 24

버튼컨트롤예제작성 대화상자에만들기 Generated Classes 에서뷰클래스의베이스클래스로 CFormView 를선택함 버튼컨트롤예제작성 대화상자에만들기 ExButton2.rc 에서 Dialog 의 IDD_EXBUTTON2_FORM 을 Toolbox 를이용하여컨트롤을추가 25 26 버튼컨트롤예제작성 대화상자에만들기 각컨트롤의속성 버튼컨트롤예제작성 대화상자에만들기 Button1 과 Button2 에 Add Event Handler 추가 Caption ID 기타변경사항 Button 1 IDC_BUTTON1 Button 2 IDC_BUTTON1 Check 1 IDC_CHECK1 Check 2 IDC_CHECK2 Radio 1 Radio 2 Group Box IDC_RADIO1 IDC_RADIO2 IDC_STATIC IDC_DATETIMEPICKER1 IDC_MONTHCALENDAR1 General 탭에서 Group 속성을체크 27 28

버튼컨트롤예제작성 대화상자에만들기 Radio1, Radio2, Check1, Check2 컨트롤변수생성 (Add Variable) 버튼컨트롤예제작성 대화상자에만들기 코드추가 // 헤더파일 class CExButton2View: public CFormView { DECLARE_DYNCREATE(CExButton2View) protected: CExButton2View(); 29 public: enum { IDD = IDD_EXBUTTON2_FORM ; CExButton2Doc* GetDocument() const; CButton m_checkbox1, m_checkbox2; CButton m_radio1, m_radio2; // 대화상자에있는컨트롤을 // 직접다룰수있는변수생성 30 버튼컨트롤예제작성 대화상자에만들기 void CExButton2View::DoDataExchange(CDataExchange* pdx) { CFormView::DoDataExchange(pDX); DDX_Control(pDX, IDC_RADIO1, m_radio1); DDX_Control(pDX, IDC_RADIO2, m_radio2); DDX_Control(pDX, IDC_CHECK1, m_checkbox1); DDX_Control(pDX, IDC_CHECK2, m_checkbox2); void CExButton2View::OnInitialUpdate() { CFormView::OnInitialUpdate(); GetParentFrame()->RecalcLayout(); ResizeParentToFit(); m_checkbox1.setcheck(bst_checked); m_radio1.setcheck(bst_checked); // 체크박스 1 을체크 // 라디오버튼 1 을체크 31 void CExButton2View::OnBnClickedButton1() { BOOL bcheckbox1, bcheckbox2, bradio1, bradio2; bcheckbox1 = bcheckbox2 = bradio1 = bradio2 = FALSE; if(m_checkbox1.getcheck() == BST_CHECKED) bcheckbox1 = TRUE; if(m_checkbox2.getcheck() == BST_CHECKED) bcheckbox2 = TRUE; if(m_radio1.getcheck() == BST_CHECKED) bradio1 = TRUE; if(m_radio2.getcheck() == BST_CHECKED) bradio2 = TRUE; CString str1, str2, str3, str4; if(bcheckbox1) str1 = " 체크박스이체크on"; else str1 = " 체크박스이체크off"; if(bcheckbox2) str2 = " 체크박스가체크on"; else str2 = " 체크박스가체크off"; if(bradio1) str3 = " 라디오버튼이선택on"; else str3 = " 라디오버튼이선택off"; if(bradio2) str4 = " 라디오버튼가선택on"; else str4 = " 라디오버튼가선택off"; MessageBox(str1 + '\n' + str2 + '\n' + str3 + '\n' + str4); 32

버튼컨트롤예제작성 대화상자에만들기 실행결과 정적컨트롤 정적컨트롤종류 텍스트 프레임 ( 색으로채워지지않은사각형 ), 사각형 ( 색으로채워진사각형 ), 아이콘, 비트맵, 향상된메타파일 (Enhanced Metafile) 33 34 정적컨트롤 통지메시지 SS_NOTIFY 스타일을설정하면통지메시지발생 STN_CLICKED( 클릭 ) STN_DBLCLK( 더블클릭 ) STN_DISABLE( 비활성화 ) STN_ENABLE( 활성화 ) 정적컨트롤예제작성 프로젝트생성 1~6단계옵션설정단계변경사항 1 'Single document' 를선택한다. 2 Compound Document Support 변경사항없음 3 DB 변경사항없음 4 UI 변경사항없음 5 Advanced Features 'ActiveX Controls' 선택을해제함 6 Generated Classes 에서뷰클래스의베이스클래스로 CFormView 를선택함 35 36

정적컨트롤예제작성 Resource View 에서 IDD_EXSTATIC_FORM 대화상자를디자인한다 Bitmap File Bitmap from Resource Metafile Icon 37 정적컨트롤예제작성 각컨트롤의속성 ID Control 변경사항 IDC_STATIC_TEXT Text Control Caption을정적컨트롤입니다 IDC_STATIC_FILE IDC_STATIC_RC IDC_ENHMETA Picture Control Picture Control Picture Control Type 을 Bitmap 로바꾼후 Center Image 를 True 로설정 Type 을 Bitmap 로바꾼후 Image 를 IDB_BITMAP1 로설정 Type 을 Enhanced Metafile 로바꾼후 Styles 에서 Notify 스타일을 True 로설정 IDC_STATIC_ICON Picture Control Type을 Icon로바꾼후Image에서 IDR_EXSTATYPE 선택 IDC_STATIC_PIC Picture Control 변경사항없음 IDC_STATIC_RECT Picture Control Type을 Rectangle로 Color를 38 Gray로변경 정적컨트롤예제작성 정적컨트롤예제작성 void CExStaticView::OnInitialUpdate() { CFormView::OnInitialUpdate(); GetParentFrame()->RecalcLayout(); ResizeParentToFit(); HANDLE h = ::LoadImage(AfxGetInstanceHandle(), "coffee.bmp", IMAGE_BITMAP, 0, 0, LR_LOADFROMFILE); CStatic* pstatic = (CStatic*)GetDlgItem(IDC_STATIC_FILE); if(h && pstatic) // 로딩한이미지를정적컨트롤에연결 pstatic->setbitmap((hbitmap)h); m_enhmeta.setenhmetafile(::getenhmetafile( Example.emf )); // 메타파일과정적컨트롤을연결 void CExStaticView::OnEnhmeta() { MessageBox( 메타파일로그린그림을클릭했습니다 ); 39 실행결과 40

편집컨트롤 텍스트를입력받고편집하는기능 편집컨트롤종류 속성대화상자를이용하여다양한스타일설정 편집컨트롤 편집컨트롤스타일 편집컨트롤스타일 의미 속성대화상자의항목 ES_AUTOHSCROLL 줄끝에도달하면자동으로수평스크롤 Auto HScroll ES_AUTOVSCROLL 줄끝에도달하면자동으로수직스크롤 Auto VScroll ES_CENTER 텍스트를가운데정렬 Align text: Centered ES_LEFT 텍스트를왼쪽정렬 Align text: Left ES_LOWERCASE 입력된모든문자를소문자로변환 Lowercase ES_MULTILINE 다중라인편집컨트롤임을나타냄 Multiline ES_NOHIDESEL 컨트롤이키보드포커스를잃더라도선 No hide selection 택된텍스트가계속반전된상태로남아있도록함 ES_NUMBER 숫자만입력할수있다. Number 41 42 편집컨트롤 편집컨트롤스타일 편집컨트롤스타일 ES_OEMCONVERT ES_PASSWORD ES_READONLY ES_RIGHT ES_UPPERCASE ES_WANTRETURN 의미속성대화상자의항목입력된텍스트가 OEM 문자셋으로변환 OEM convert 되어편집컨트롤내부에저장단일라인편집컨트롤에만사용할수있 Password 으며입력된문자를 * 로표시텍스트를읽기만가능하다. 텍스트를오른쪽정렬한다. 입력된모든문자를대문자로변환한다. 다중라인편집컨트롤에만사용할수있으며이스타일을지정하지않으면대화상자에서 Enter 키를이용한줄바꿈이되지않는다. Ctrl+Enter 키를이용하면이스타일과무관하게줄바꿈을할수있다. Read-only Align text: Right Uppercase Want return 43 편집컨트롤 편집컨트롤통지메시지 통지메시지 EN_CHANGE 의미사용자가컨트롤의내용을변경하면화면에컨트롤을다시그리는데그후에이메시지가발생한다. EN_ERRSPACE 메모리가부족하다. EN_HSCROLL 사용자가편집컨트롤의수평스크롤바를클릭하였다. EN_KILLFOCUS 키보드포커스를잃었다. EN_MAXTEXT 더이상문자를입력할수없다. CEdit::SetLimitText 함수로문자개수를제한한경우나 ES_AUTOHSCROLL, ES_AUTOVSCROLL 등의스타일을지정하지않은상태에서줄끝까지입력한경우에발생한다. EN_SETFOCUS 키보드포커스를얻었다. EN_UPDATE 사용자가컨트롤의내용을변경하면화면에컨트롤을다시그리는데그직전에이메시지가발생한다. EN_VSCROLL 사용자가편집컨트롤의수직스크롤바를클릭하였다. 44

편집컨트롤 텍스트를변경하거나입력된텍스트를얻기 m_edit.setwindowtext(" 초기값입니다."); // 편집컨트롤의텍스트변경 CString str; m_edit.getwindowtext(str); // 편집컨트롤에저장된텍스트를얻음 입력가능한문자열의길이를제한하기 편집컨트롤 텍스트선택과치환하기 // 여섯번째문자부터시작해서두개의문자가선택 1 m_edit.setsel(5, 7); // 현재선택된부분을새로운문자열로치환 2 m_edit.replacesel("abc"); 1 을실행하기전 m_edit.setlimittext(10); // 한글을최대다섯글자까지입력가능 각종편집작업 클립보드를이용한편집 m_edit.clear(); // 현재선택된문자열을삭제 m_edit.cut(); // 클립보드에저장 m_edit.copy(); // 클립보드에저장 m_edit.paste(); // 클립보드에저장된내용을붙여넣음 m_edit.undo(); // 이전에실행한것을취소 45 1 을실행한후 2 를실행한후 46 편집컨트롤 편집컨트롤예제작성 편집컨트롤끝부분에새로운문자열을삽입 Int len = m_edit.getwindowtextlength(); m_edit.setsel(len, len); m_edit.replacesel(strnewtext); // 끝부분에새문자열을넣음 편집컨트롤에멀티라인으로문자넣기 strtext.format( 문자열 1 \r \n 문자열 2 ); // \r\n 를함께기입할것 m_edit.setwindowtext(strtext); 편집컨트롤을사용한양력에서음력으로변환하는예제 1~6 단계옵션설정 단계 변경사항 1 'Single document' 를선택한다. 2 Compound Document Support 변경사항없음 3 DB 변경사항없음 4 UI 변경사항없음 5 Advanced Features 'ActiveX Controls' 선택을해제함 6 Generated Classes 에서뷰클래스의베이스클래스로 CFormView 를선택함 47 48

편집컨트롤예제작성 Resource View 에서 IDD_EXEDIT_FORM 대화상자를디자인한다 편집컨트롤예제작성 각컨트롤의속성 ID Control 변경사항 IDC_S_YEAR Edit Control IDC_S_MONTH Edit Control IDC_S_DAY Edit Control IDC_L_YEAR Edit Control IDC_L_MONTH Edit Control IDC_L_DAY Edit Control IDC_BUTTON_CONVERT Button Control Icon을 True로변경 49 50 편집컨트롤예제작성 편집컨트롤예제작성 void CExEditView::OnInitialUpdate() { CFormView::OnInitialUpdate(); GetParentFrame()->RecalcLayout(); ResizeParentToFit(); HANDLE h = ::LoadIcon(AfxGetInstanceHandle(), MAKEINTRESOURCE(IDI_ICON_DOWNARROW)); CButton* piconbutton = (CButton*)GetDlgItem(IDC_BUTTON_CONVERT); if(h && piconbutton) // 로딩한아이콘을버튼아이콘에연결 piconbutton->seticon((hicon)h); 51 void CExEditView::DoDataExchange(CDataExchange* pdx) { CFormView::DoDataExchange(pDX); DDX_Text(pDX, IDC_S_DAY, m_nsday); DDX_Text(pDX, IDC_S_MONTH, m_nsmonth); DDX_Text(pDX, IDC_S_YEAR, m_nsyear); DDX_Text(pDX, IDC_L_DAY, m_nlday); DDX_Text(pDX, IDC_L_MONTH, m_nlmonth); DDX_Text(pDX, IDC_L_YEAR, m_nlyear); 52

편집컨트롤예제작성 편집컨트롤예제작성 CExEditView::CExEditView() : CFormView(CExEditView::IDD) { // TODO: add construction code here m_nsday = 1; m_nsmonth = 11; m_nsyear = 2007; m_nlday = 0; m_nlmonth = 0; m_nlyear = 0; void CExEditView::OnBnClickedButtonConvert() { // TODO: Add your control notification handler code here UpdateData(TRUE); int nyoun; get_negative(m_nsyear, m_nsmonth, m_nsday, &m_nlyear, &m_nlmonth, &m_nlday, &nyoun); // 음력계산루틴 UpdateData(FALSE); 53 54 편집컨트롤예제작성 실행결과 리스트박스컨트롤 여러개의문자열을관리 ( 추가, 선택, 삭제등 ) 하는구조 리스트박스컨트롤종류 단일선택리스트박스 다중선택리스트박스 속성대화상자를이용하여다양한스타일설정 55 56

리스트박스컨트롤 리스트박스컨트롤스타일 리스트박스컨트롤 리스트박스컨트롤스타일 리스트박스컨트롤스타일 LBS_DISABLENOSCR OLL LBS_EXTENDEDSEL LBS_HASSTRINGS 의미속성대화상자항목표시할항목의개수가적은경우에 Disable no scroll 도수직스크롤바가사라지지않는다. SHIFT, CTRL 키와마우스클릭을이용한다중선택이가능하다. LBS_OWNERDRAW* 스타일을지정하지않을경우의디폴트스타일이며컨트롤이문자열을저장및관리한다. Selection: Extended Has strings 리스트박스컨트롤스타일 LBS_MULTIPLESEL LBS_NODATA LBS_NOINTEGRAL HEIGHT 의미 마우스클릭을이용한다중선택이가능하다. 항목데이터를컨트롤이아닌부모윈도우가유지하며필요할때마다부모윈도우가직접그린다. 항목의개수가 1000 개이상일경우에사용한다. 이스타일을지정하지않으면항목의일부가잘려서보이지않는경우가발생할수있다. 속성대화상자항목 Selection: Multiple 없음 No integral height LBS_MULTICOLUMN 여러줄 (Column) 로구성된리스트박스를생성하며항목이많을경우수평스크롤이가능하다. Multi-column LBS_NOREDRAW 항목에변화가생기더라도리스트박스컨트롤을다시그리지않는다. No redraw 57 58 리스트박스컨트롤 리스트박스컨트롤스타일 리스트박스컨트롤 리스트박스컨트롤스타일 리스트박스컨트롤스타일 LBS_NOSEL LBS_NOTIFY LBS_OWNERDRA WFIXED LBS_OWNERDRA WVARIABLE 의미 항목을선택할수없다. 사용자가항목을클릭하거나더블클릭하면부모윈도우에게통지메시지를보낸다. 부모윈도우가리스트박스항목을직접그리되항목의높이가일정한경우이다. 부모윈도우가리스트박스항목을직접그리되항목의높이가일정하지않은경우이다. 속성대화상자의항목 Selection: None Notify Owner draw: Fixed Owner draw: Variable 리스트박스컨트롤스타일 LBS_SORT LBS_STANDARD LBS_USETABSTOPS LBS_WANTKEYBO ARDINPUT 의미 항목이문자열인경우정렬하여표시한다. LBS_NOTIFY, LBS_SORT, WS_VSCROLL, WS_BORDER 네가지스타일의조합이다. 이스타일을지정하면항목문자열에포함된탭문자 ('\t') 를제대로처리할수있다. 리스트박스컨트롤이키보드포커스를가진상태에서사용자가키를누르면부모윈도우가이를감지하여특별한처리를할수있다. 속성대화상자의항목 Sort Notify, Sort, Border, Vertical scroll Use tabstops Want key input 59 60

리스트박스컨트롤 리스트박스상태에변화가생기면발생하는컨트롤통지메시지 통지메시지 의미 LBN_DBLCLK 사용자가항목을더블클릭하였다. LBN_SELCHANGE 사용자가선택을변경하였다. LBN_SELCANCEL 사용자가선택을취소하였다. LBN_SETFOCUS 키보드포커스를얻었다. LBN_KILLFOCUS 키보드포커스를잃었다. LBN_ERRSPACE 메모리가부족하다. LBN_DBLCLK, LBN_SELCHANGE, LBN_SELCANCEL 통지메시지는 LBS_NOTIFY 스타일을설정해야발생 61 리스트박스컨트롤 리스트박스초기화 m_list.resetcontent(); 리스트박스항목추가와삭제 m_list.addstring(" 사과 "); // 문자열항목을끝부분에 사과 추가 m_list.deletestring(3); // 4 번째항목을삭제 리스트박스항목선택 // 단일선택리스트박스컨트롤인경우 m_list.setcursel(2); // 3번째항목을선택 // 다중선택리스트박스컨트롤인경우 m_list.setsel(2); // 3번째항목을선택 m_list.setsel(3, FALSE); // 4번째항목을선택해제 62 리스트박스컨트롤 리스트박스선택된항목확인 // 단일선택리스트박스컨트롤인경우 int nindex = m_list.getcursel(); if(nindex!= LB_ERR){ CString str; m_list.gettext(nindex, str); // 다중선택리스트박스컨트롤인경우 int nindex = m_list.getcaretindex(); if(nindex!= LB_ERR){ CString str; m_list.gettext(nindex, str); 63 리스트박스컨트롤예제작성 버튼, 편집, 리스트박스컨트롤을사용한항목추가, 삭제, 변경하는예제 1~6 단계옵션설정 단계 변경사항 1 'Single document' 를선택한다. 2 Compound Document Support 변경사항없음 3 DB 변경사항없음 4 UI 변경사항없음 5 Advanced Features 'ActiveX Controls' 선택을해제함 6 Generated Classes 에서뷰클래스의베이스클래스로 CFormView 를선택함 64

리스트박스컨트롤예제작성 Resource View 에서 IDD_EXLIST_FORM 대화상자를디자인한다 리스트박스컨트롤예제작성 각컨트롤의속성 ID Control 변경사항 IDC_ELEMENT Edit Control IDC_LIST ListBox Control IDC_BUTTON_ADD Button Control Default Button을 TRUE IDC_BUTTON_MODIFY Button Control IDC_BUTTON_DEL Button Control IDC_BUTTON_DELALL Button Control 65 66 리스트박스컨트롤예제작성 Add Variable Wizard 를이용해서리스트박스컨트롤에대한컨트롤변수 m_ctrllist 를생성 리스트박스컨트롤예제작성 Event Handler Wizard 를이용해서버튼컨트롤핸들러를생성 OnBnClickedButtonAdd, OnBnClickedButtonModify, OnBnClickedButtonDel, OnBnClickedButtonDelall 리스트박스컨트롤에대한 OnLbnSelchangeList 67 68

리스트박스컨트롤예제작성 리스트박스컨트롤예제작성 class CExListBoxDoc : public CDocument { public: CString m_str; CStringList m_stringlist; CExListBoxDoc(); virtual ~CExListBoxDoc(); virtual BOOL OnNewDocument(); virtual void Serialize(CArchive& ar); virtual void DeleteContents(); #ifdef _DEBUG virtual void AssertValid() const; virtual void Dump(CDumpContext& dc) const; #endif class CExListBoxView : public CFormView { protected: CExListBoxView(); public: CListBox m_ctrllist; CString m_strelement; // 중간생략 virtual void DoDataExchange(CDataExchange* pdx); virtual void OnInitialUpdate(); // 중간생략 afx_msg void OnBnClickedButtonAdd(); afx_msg void OnBnClickedButtonModify(); afx_msg void OnBnClickedButtonDel(); afx_msg void OnBnClickedButtonDelall(); afx_msg void OnLbnSelchangeList(); ; 69 70 ; 리스트박스컨트롤예제작성 void CExListBoxDoc::DeleteContents() { m_stringlist.removeall(); 리스트박스컨트롤예제작성 void CExListBoxView::OnInitialUpdate() { CFormView::OnInitialUpdate(); GetParentFrame()->RecalcLayout(); ResizeParentToFit(); void CExListBoxDoc::Serialize(CArchive& ar) { m_stringlist.serialize(ar); ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// void CExListBoxView::DoDataExchange(CDataExchange* pdx) { CFormView::DoDataExchange(pDX); DDX_Control(pDX, IDC_LIST, m_ctrllist); DDX_Text(pDX, IDC_ELEMENT, m_strelement); m_ctrllist.resetcontent(); // 모든 CStringList 의값을리스트박스에추가 CStringList& stringlist = GetDocument()->m_stringList; POSITION pos = stringlist.getheadposition(); while (pos!= NULL) { CString str = stringlist.getnext(pos); m_ctrllist.addstring(str); 71 72

리스트박스컨트롤예제작성 리스트박스컨트롤예제작성 void CExListBoxView::OnBnClickedButtonAdd() { // TODO: Add your control notification handler code here if (UpdateData()!= TRUE) return; void CExListBoxView::OnLbnSelchangeList() { // TODO: Add your control notification handler code here // CStringList 에새로운 string 추가 GetDocument()->m_stringList.AddTail(m_strElement); // 리스트박스에새로운 string 추가 m_ctrllist.addstring(m_strelement); // 편집컨트롤을 Update 해서 // 리스트박스에새로운 selection 이추가된것을변경 m_ctrllist.gettext(m_ctrllist.getcursel(), m_strelement); UpdateData(FALSE); 73 74 리스트박스컨트롤예제작성 실행결과 콤보박스컨트롤 여러개의문자열을관리하는구조로화살표버튼을누르면리스트를보여선택가능한구조 콤보박스컨트롤종류편집컨트롤정적컨트롤 리스트박스컨트롤 단순스타일 드랍다운스타일 드랍다운리스트스타일 75 76

콤보박스컨트롤 속성대화상자 콤보박스컨트롤 콤보박스컨트롤스타일 콤보박스컨트롤스타일 CBS_AUTOHSCROLL CBS_DISABLENOSCROLL CBS_DROPDOWN CBS_DROPDOWNLIST CBS_HASSTRINGS CBS_LOWERCASE CBS_NOINTEGRALHEIGHT CBS_OEMCONVERT CBS_OWNERDRAWFIXED CBS_OWNERDRAWVARIABLE CBS_SIMPLE CBS_SORT CBS_UPPERCASE 의미 = ES_AUTOHSCROLL = LBS_DISABLENOSCROLL 드랍다운스타일드랍다운리스트스타일 = LBS_HASSTRINGS = ES_LOWERCASE = LBS_NOINTEGRALHEIGH = ES_OEMCONVERT T = LBS_OWNERDRAWFIXED = LBS_OWNERDRAWVARIA 단순스타일 BLE = LBS_SORT = ES_UPPERCASE 속성대화상자의항목 Auto HScroll Disable no scroll Type: Dropdown Type: Drop List Has strings Lowercase No integral height OEM convert Owner draw: Fixed Owner draw: Variable Type: Simple Sort Uppercase 77 78 콤보박스컨트롤 콤보박스컨트롤통지메시지 통지메시지 CBN_CLOSEUP CBN_DBLCLK CBN_DROPDOWN CBN_EDITCHANGE CBN_EDITUPDATE CBN_ERRSPACE CBN_KILLFOCUS CBN_SELCHANGE CBN_SELENDCANCEL CBN_SELENDOK CBN_SETFOCUS 의미 리스트박스가닫혔다. 사용자가항목을더블클릭하였다. 리스트박스가열리기직전이다. = EN_EDITCHANGE = EN_EDITUPDATE 메모리가부족하다. 키보드포커스를잃었다. = LBN_SELCHANGE = LBN_SELENDCANCEL 사용자가항목을선택하였다. 키보드포커스를얻었다. 스타일단순드랍드랍다운다운리스트 콤보박스컨트롤 콤보박스항목추가와삭제 m_combo.addstring(" 사과 "); m_combo.deletestring(3); 선택된항목얻기 int nindex = m_combo.getcursel(); if(nindex!= CB_ERR){ CString str; m_combo.getlbtext(nindex, str); 79 80

콤보박스컨트롤 입력가능한문자열의길이제한하기 m_combo.limittext(10); 스크롤바컨트롤 화면의일정영역을스크롤하거나정해진범위의값을변경시키는용도로사용 스크롤바코드 각종편집작업 m_combo.clear(); m_combo.cut(); m_combo.copy(); m_combo.paste(); 81 82 스크롤바컨트롤 WM_HSCROLL/WM_VSCROLL 메시지핸들러 스크롤바컨트롤 주요함수 void OnHScroll (UINT nsbcode, UINT npos, CScrollBar* pscrollbar); void OnVScroll (UINT nsbcode, UINT npos, CScrollBar* pscrollbar); 멤버함수 역할 nsbcode npos 스크롤바코드 스크롤박스의위치 스크롤바코드가 SB_THUMBPOSITION 또는 SB_THUMBTRACK인경우에만사용 pscrollbar 스크롤바컨트롤을가리키는포인터 SetScrollRange() 스크롤박스위치값의최소값과최대값을설정한다. SetScrollPos() 스크롤박스의현재위치를설정한다. GetScrollPos() 스크롤박스의현재위치를얻는다. 83 84

스크롤바컨트롤예제작성 스크롤바컨트롤을사용하여 OnDraw 의 MFC 글씨의회전각도와색을변경하는예제 1~6 단계옵션설정 단계 변경사항 1 'Single document' 를선택한다. 2 Compound Document Support 변경사항없음 3 DB 변경사항없음 4 UI 변경사항없음 5 Advanced Features 'ActiveX Controls' 선택을해제함 6 Generated Classes 에서뷰클래스의베이스클래스로 CFormView 를선택함 스크롤바컨트롤예제작성 Resource View 에서 IDD_EXSCROLLBAR_FORM 대화상자를디자인한다 m_scrollbar1 m_scrollbar2 m_scrollbar3 m_scrollbar4 85 86 스크롤바컨트롤예제작성 void CExScrollBarView::OnInitialUpdate() { CFormView::OnInitialUpdate(); GetParentFrame()->RecalcLayout(); ResizeParentToFit(); // 스크롤바의범위와박스위치설정 m_scrollbar1.setscrollrange(0, 360, FALSE); m_scrollbar1.setscrollpos(0); m_scrollbar2.setscrollrange(0, 255, FALSE); m_scrollbar2.setscrollpos(0); m_scrollbar3.setscrollrange(0, 255, FALSE); m_scrollbar3.setscrollpos(0); m_scrollbar4.setscrollrange(0, 255, FALSE); m_scrollbar4.setscrollpos(0); // CFormView 클래스는대화상자를기반으로하므로 OnDraw가기본적으로없어서추가해야함 void CExScrollBarView::OnDraw(CDC* pdc) { LOGFONT lf; ::ZeroMemory(&lf, sizeof(lf)); // 폰트구조체초기화 lf.lfheight = 300; lf.lfescapement = 10 * m_scrollbar1.getscrollpos(); // 회전각설정 lf.lforientation = 10 * m_scrollbar1.getscrollpos(); // 회전각설정 ::lstrcpy(lf.lffacename, "Arial"); CFont font; font.createpointfontindirect(&lf); // 지정된폰트생성 pdc->selectobject(&font); // 스크롤바로선택된값으로텍스트색상설정 pdc->settextcolor(rgb(m_scrollbar2.getscrollpos(), m_scrollbar3.getscrollpos(), m_scrollbar4.getscrollpos())); pdc->textout(200, 220, "MFC"); 87 88

void CExScrollBarView::OnHScroll(UINT nsbcode, UINT npos, CScrollBar* pscrollbar) { 윈도우핸들을얻기 int nscrollpos=0; if(pscrollbar->getsafehwnd() == m_scrollbar1.getsafehwnd()) { switch(nsbcode) { case SB_LINELEFT: // 스크롤바코드가왼쪽화살표 nscrollpos = pscrollbar->getscrollpos(); if(nscrollpos > 0) { pscrollbar->setscrollpos(--nscrollpos); SetDlgItemInt(IDC_EDIT1, nscrollpos); Invalidate(); break; case SB_LINERIGHT: // 스크롤바코드가오른쪽화살표 nscrollpos = pscrollbar->getscrollpos(); if(nscrollpos < pscrollbar->getscrolllimit()) { pscrollbar->setscrollpos(++nscrollpos); SetDlgItemInt(IDC_EDIT1, nscrollpos); Invalidate(); break; case SB_THUMBTRACK: // 스크롤바코드가스크롤박스 pscrollbar->setscrollpos(npos); SetDlgItemInt(IDC_EDIT1, npos); Invalidate(); break; 지정한컨트롤에 89 nvalue 값을대입 else if(pscrollbar->getsafehwnd() == m_scrollbar2.getsafehwnd()) { switch(nsbcode) { case SB_THUMBTRACK: pscrollbar->setscrollpos(npos); SetDlgItemInt(IDC_EDIT2, npos); Invalidate(); break; else if(pscrollbar->getsafehwnd() == m_scrollbar3.getsafehwnd()) { switch(nsbcode){ case SB_THUMBTRACK: pscrollbar->setscrollpos(npos); SetDlgItemInt(IDC_EDIT3, npos); Invalidate(); break; else if(pscrollbar->getsafehwnd() == m_scrollbar4.getsafehwnd()) { switch(nsbcode){ case SB_THUMBTRACK: pscrollbar->setscrollpos(npos); SetDlgItemInt(IDC_EDIT4, npos); Invalidate(); break; CFormView::OnHScroll(nSBCode, npos, pscrollbar); 90 스크롤바컨트롤예제작성 고급컨트롤기법 실행결과 서브클래싱 기존의윈도우나컨트롤의형태또는동작변경 비표준적인동작을하는컨트롤을쉽게만들수있음 메시지반사 스스로통지메시지를처리하는독립적인컨트롤클래스제작가능 91 92

서브클래싱 서브클래싱 서브클래싱 윈도우 ( 정확하게는윈도우프로시저 ) 로가는메시지를중간에서붙잡아처리하는기법 메시지종류에따라, 처리한후원래의윈도우프로시저에게전달해주거나전달하지않을수있음 서브클래싱구현순서 1. 기존의클래스를기반으로새로운윈도우나컨트롤클래스를생성 2. 메시지핸들러를재정의하거나새로운메시지핸들러를추가하여정의 3. CWnd::SubclassWindow() 또는 CWnd::SubclassDlgItem() 함수를호출 메시지 중간에서처리 윈도우프로시저 93 94 서브클래싱예제작성 Letter 와 Number 만을입력받는편집컨트롤을작성하는예제 1~6 단계옵션설정 서브클래싱예제작성 CEdit 를상속받은새로운클래스 CLetterEdit 를생성한다 단계 변경사항 1 'Single document' 를선택한다. 2 Compound Document Support 변경사항없음 3 DB 변경사항없음 4 UI 변경사항없음 5 Advanced Features 'ActiveX Controls' 선택을해제함 6 Generated Classes 에서뷰클래스의베이스클래스로 CFormView 를선택함 95 96

서브클래싱예제작성 CLetterEdit 에 WM_CHAR 메시지핸들러를추가한다 서브클래싱예제작성 같은방법으로새로운클래스 CNumberEdit 를생성한다 CNumberEdit 에 WM_CHAR 메시지핸들러를추가한다 97 98 서브클래싱예제작성 Resource View 에서 IDD_SUBCLASSING_FORM 대화상자를디자인한다 서브클래싱예제작성 Add Member Variable Wizard 를이용하여 IDC_EDIT1 에 m_edit1 이란변수를생성한다 99 100

서브클래싱예제작성 IDC_EDIT2 는 SubClassDlgItem() 을직접호출하는방법을사용해본다 #include LetterEdit.h #include NumberEdit.h 서브클래싱예제작성 실행결과 class CSubclassingView : public CFormView { // 중간생략 CLetterEdit m_edit1; CNumberEdit m_edit2; ; void CSubclassingView::OnInitialUpdate() { CFormView::OnInitialUpdate(); GetParentFrame()->RecalcLayout(); ResizeParentToFit(); m_edit2.subclassdlgitem(idc_edit2, this); 101 102 메시지반사 메시지반사 부모윈도우가처리하지않는통지메시지를컨트롤자신이처리통지메시지 컨트롤 ( 자식윈도우 ) 부모윈도우 메시지반사 메시지반사구현 기존의컨트롤클래스로부터새로운클래스를만들고자신의통지메시지를처리하도록함수를추가 새로만든클래스를이용하여컨트롤생성 부모윈도우가통지메시지를처리하지않을경우에만컨트롤이자신의통지메시지를처리가능 클래스속성창의메시지부분에 = 로시작하는것들 ( 예 : =LBN_DBLCLK) 이 Reflected Message 를의미하며, 이부분을추가하면, ON_CONTROL_REFLECT 란메시지맵이추가됨 103 104

메시지반사예제작성 리스트박스항목에더블클릭하면항목을메시지박스에출력해주는나만의리스트박스컨트롤을작성하는예제 1~6 단계옵션설정 단계 변경사항 1 'Single document' 를선택한다. 2 Compound Document Support 변경사항없음 3 DB 변경사항없음 4 UI 변경사항없음 5 Advanced Features 'ActiveX Controls' 선택을해제함 6 Generated Classes 에서뷰클래스의베이스클래스로 CFormView 를선택함 메시지반사예제작성 CMyListBox 를생성하고 CMyListBox 에 =LBN_DBLCLK 메시지핸들러를추가한다 105 106 메시지반사예제작성 Resource View 에서 IDD_MESSAGEREFLECTION_FORM 대화상자를디자인한다 메시지반사예제작성 Add Member Variable Wizard 를이용하여 IDC_LIST1 에 m_list1 이란변수를생성한다 107 108

메시지반사예제작성 메시지반사예제작성 실행결과 void CMessageReflectionView::OnInitialUpdate() { CFormView::OnInitialUpdate(); GetParentFrame()->RecalcLayout(); ResizeParentToFit(); m_list1.addstring( 사과 ); m_list1.addstring( 포도 ); m_list1.addstring( 토마토 ); m_list1.addstring( 바나나 ); 109 110