Visual C++ Programming Controls and CList

Slides:



Advertisements
Similar presentations
01_ 가상 함수를 사용한 다형성의 구현 02_ 오버라이딩
Advertisements

DB 프로그래밍 학기.
DB 프로그래밍 학기.
쉽게 풀어쓴 C언어 Express 제11장 포인터 C Express Slide 1 (of 27)
컴퓨터프로그래밍 1주차실습자료 Visual Studio 2005 사용법 익히기.
컨트롤의 동작 원리를 이해한다. 표준 컨트롤의 다양한 속성과 통지 메시지를 이해한다.
제4장 대화상자.
New MapTool manual Kim Dong-Sung.
윤 홍 란 다이알로그(대화상자) 윤 홍 란
제 9 장 구조체와 공용체.
컴퓨터 프로그래밍 기초 [Final] 기말고사
공통 컨트롤의 종류와 특징을 개관한다. 각종 공통 컨트롤의 사용 방법을 익힌다..
Outlook Express 메일 백업 및 복원가이드
자료 구조: Chapter 3 (2)구조체, 포인터
나민영 서경대학교 컴퓨터공학과 CGVR Lab 같이만들어보자 5주차 OpenCV 설정 및 기초.
C++ 프로그래밍 년 2학기 전자정보공학대학 컴퓨터공학부.
제 6장. 생성자와 소멸자 학기 프로그래밍언어및실습 (C++).
Visual C++ Programming Controls - Buttons
forms 객체 입력상자 체크상자, 라디오 버튼 목록상자
쉽게 풀어쓴 C언어 Express 제17장 동적메모리와 연결리스트 C Express Slide 1 (of 13)
C++ 프로그래밍 년 2학기 전자정보공학대학 컴퓨터공학부.
마우스(Mouse) 다루기 컴퓨터응용 및 실습 I.
Visual C++ Programming Common Controls
3.2 SQL Server 설치 및 수행(계속) 시스템 데이터베이스 master
1. C++ 시작하기.
11장. 포인터 01_ 포인터의 기본 02_ 포인터와 Const.
SqlParameter 클래스 선문 비트 18기 발표자 : 박성한.
컴퓨터 프로그래밍 기초 #02 : printf(), scanf()
정적 멤버 변수/정적 멤버 함수 - friend 함수/클래스 template
C++ Espresso 제12장 템플릿.
학습목표 학습목차 다른 홈페이지의 HTML 파일 코드를 보는 방법에 대해 알아봅니다.
프로그래밍 랩 – 7주 리스트.
14장. 포인터와 함수에 대한 이해.
C++ 프로그래밍 년 2학기 전자정보공학대학 컴퓨터공학부.
분할 윈도, 다중 뷰… 영상 통신 연구실 권 동 진 발표 일 : 04월 27일.
11장. 1차원 배열.
C#.
13. 연산자 오버로딩.
사용자 함수 사용하기 함수 함수 정의 프로그램에서 특정한 기능을 수행하도록 만든 하나의 단위 작업
인터넷응용프로그래밍 JavaScript(Intro).
비주얼 프로그래밍 1분반 화/목.
13. 포인터와 배열! 함께 이해하기 IT응용시스템공학과 김 형 진 교수.
GUI 소켓 애플리케이션 Chapter 08. * 학습목표 윈도우 GUI 애플리케이션의 구조와 동작 원리를 이해
24장. 파일 입출력.
Lesson 2. 기본 데이터형.
Lab 1 Guide: 교재 2장 DrawX ( 쪽)
Chapter6 : JVM과 메모리 6.1 JVM의 구조와 메모리 모델 6.2 프로그램 실행과 메모리 6.3 객체생성과 메모리
컴퓨터 프로그래밍 기초 - 10th : 포인터 및 구조체 -
Lab 8 Guide: 멀티스레딩 예제 2 * Critical Section을 이용한 멀티스레딩 동기화 (교재 15장, 쪽)
8주차: Strings, Arrays and Pointers
컴퓨터 프로그래밍 기초 [01] Visual Studio 설치 및 사용방법
CHAP 21. 전화, SMS, 주소록.
객체기반 SW설계 팀활동지 4.
11. 어댑터뷰 제목. 11. 어댑터뷰 제목 리스트뷰와 그리드뷰 활용법을 배운다. 갤러리와 스피너의 사용법을 익힌다.
학습목표 처음 만드는 비주얼 베이직 프로그램 프로그램 실행과 실행 파일 생성. 학습목표 처음 만드는 비주얼 베이직 프로그램 프로그램 실행과 실행 파일 생성.
데이터 동적 할당 Collection class.
Chapter 03 윈도 폼 컨트롤 1.
Chapter 13. 템플릿(Template) 1
4장. 데이터 표현 방식의 이해. 4장. 데이터 표현 방식의 이해 4-1 컴퓨터의 데이터 표현 진법에 대한 이해 n 진수 표현 방식 : n개의 문자를 이용해서 데이터를 표현 그림 4-1.
영상처리 실습 (OpenCV + MFC) Chonbuk National University A.I. Lab.
.Net Web Application 2007 컴퓨터공학실험(Ⅰ)
제 8장. 클래스의 활용 학기 프로그래밍언어및실습 (C++).
컴퓨터 프로그래밍 기초 - 9th : 배열 / 포인터 -
구조체(struct)와 공용체(union)
동적메모리와 연결 리스트 컴퓨터시뮬레이션학과 2016년 봄학기 담당교수 : 이형원 E304호,
29장. 템플릿과 STL 01_ 템플릿 02_ STL.
13. 포인터와 배열! 함께 이해하기.
C++ Espresso 제15장 STL 알고리즘.
6 객체.
BoardGame 보드게임 따라가기.
Presentation transcript:

Visual C++ Programming Controls and CList Department of Digital Contents Sang Il Park

Review: Control 표준화된 형태와 특성을 가진 윈도우 사용자에게 입력을 받거나 정보를 보여줌

Review: Message-based system 컨트롤과 부모 윈도우 통지 메시지 (Notification Message) 컨트롤의 상태가 변화되었음을 알림 메모리 부족 등으로 인한 오류를 알림 컨트롤 메시지 (Control Message) 컨트롤의 상태를 알아내거나 변경 컨트롤 (자식 윈도우) 부모 윈도우 ① 통지 메시지 ② 컨트롤 메시지

Review: Various controls MFC 컨트롤 클래스 컨트롤 MFC 클래스 컨트롤 버튼 버튼 컨트롤 CButton 정적 컨트롤 CStatic 편집 컨트롤 CEdit 리스트 박스 컨트롤 CListBox 콤보 박스 컨트롤 CComboBox 스크롤 바 컨트롤 CScrollBar

Review: Button Control Radio Button 그룹

Review: 버튼 컨트롤 컨트롤 생성 방법 ① 일반 윈도우에서 직접 만들기 ② 대화상자를 통해 만들기

Review: 버튼 붙이기 1. 버튼 객체를 맴버 변수로 추가 Ex) CChildView의 header file에 CButton 객체 추가 2. CButton의 Create(..) 맴버 함수를 호출하여 생성 Ex) CChildView::OnCreate() 내부에 추가 ChildView.h의 CChildView의 내부에… CButton m_button; // C++ 객체 추가 m_button.Create( "누르세요", WS_CHILD|WS_VISIBLE|BS_PUSHBUTTON, CRect(100, 100, 200, 130), this, 101); // 푸시 버튼 생성

Review: 버튼 컨트롤 생성 방법 CButton::Create() 함수 Caption - 캡션 문자열 Style - 일반 윈도우 스타일 + 버튼 컨트롤 스타일 rect - 컨트롤 크기와 위치 pParentWnd - 부모 윈도우 UINT nID - 컨트롤 ID (ex, 101, 102…) BOOL CButton::Create (Caption, Style, rect, pParentWindow, ID) ;

Review: 버튼 컨트롤의 Style 버튼 컨트롤 스타일 의미 BS_PUSHBUTTON 푸시 버튼 BS_CHECKBOX 체크 박스 BS_AUTOCHECKBOX 자동 체크 박스:클릭하면 자동으로 체크 표시가 On/Off BS_3STATE 3상태 체크 박스 BS_AUTO3STATE 자동 3상태 체크 박스: 클릭하면 자동으로 체크 표시가 On/Grayed/Of BS_RADIOBUTTON 라디오 버튼 BS_AUTORADIOBUTTON 자동 라디오 버튼: 클릭하면 자동으로 선택과 선택 해제가 이뤄짐과 선택 해제가 이루어짐 BS_GROUPBOX 그룹 박스

Review: 버튼 컨트롤의 동작 버튼이 눌렸다면?  버튼이 눌렸다는 메시지 발생 통지 메시지 처리하기  메시지 핸들러 작성 메시지 맵에 메시지 추가 메시지 핸들러 함수구현 컨트롤 (자식 윈도우) 부모 윈도우 통지 메시지

Review: 버튼 컨트롤의 동작 1. Message Map에 추가 2. 핸들러 함수 추가 ON_BN_CLICKED( ID, 함수 이름) Ex) ON_BN_CLICKED( 101, OnButtonClicked) // 메시지맵 void CChildView::OnButtonClicked( ) // 메시지 핸들러 { MessageBox("버튼을 눌렀습니다."); }

Review: 버튼 컨트롤의 정보 변경 버튼의 상태를 변경하고 (알고) 싶다면?  컨트롤 메시지활용 버튼의 상태를 변경하고 (알고) 싶다면?  컨트롤 메시지활용 컨트롤(버튼)의 현재 상태를 변화 시킴 컨트롤(버튼)에게 현재의 상태를 물어봄 컨트롤 (자식 윈도우) 부모 윈도우 컨트롤 메시지

Review: 버튼 컨트롤의 정보 변경 컨트롤 메시지 보내기  멤버 함수 호출 버튼의 체크상태 변환 버튼의 체크상태 확인 m_button.SetCheck(BST_CHECKED); m_button.SetCheck(BST_UNCHECKED); if ( m_button.GetCheck() == BST_CHECKED ) AfxMessageBox(“버튼이 체크되었습니다”);

코딩연습 다음과 같은 다양한 버튼을 만들어 본다.

버튼 컨트롤 생성 방법 컨트롤 생성 - 두 번째 방법 대화상자 템플릿에 컨트롤 추가 컨트롤 변수 생성 대화상자가 생성될 때 컨트롤도 자동으로 생성 컨트롤 변수 생성 컨트롤 자체를 나타내는 변수(=컨트롤 변수)를 생성하고 이를 이용하여 컨트롤을 조작

코딩 연습 대화상자기반을 선택하여 프로젝트 생성 (또는 FormView) 대화상자편집기를 사용하여 창을 디자인

버튼 컨트롤 메시지 핸들러 추가 방법1 대화창의 속성창을 통해 이벤트 핸들러 추가

버튼 컨트롤 메시지 핸들러 추가 방법2 해당 콘트롤에 마우스 오른 버튼 이벤트핸들러추가선택

버튼 컨트롤 변수 추가 해당 콘트롤에 마우스 오른 버튼 변수추가선택

버튼 컨트롤 (8/8) 컨트롤 변수 생성 (cont'd) // 헤더 파일 // 구현 파일 class CTestDlg::public CDiglog { ... CButton m_button; } // 구현 파일 void CTestDlg::DoDataExchange(CDataExchange* pDX) CFormView::DoDataExchange(pDX); //{{AFX_DATA_MAP(CExButtonView) DDX_Control(pDX, IDC_BUTTON1, m_button); //}}AFX_DATA_MAP

코딩연습 다음과 같이 대화상자에 다양한 버튼을 만들어 본다. Pust Button을 누르면 가 버튼의 선택사항을 보여줌

Control (Button) 편하게 쓰기.. (라디오) 버튼이 많다면? 일일이 핸들러를 추가하기 귀찮다 한꺼번에 핸들러를 추가한다. ON_COMMAND_RANGE 사용 ON_COMMAND_RANGE (IDC_RADIO1, IDC_RADIO6, OnRadioClick) 시작ID 번호 끝ID 번호 호출함수 홈페이지에 있는 예제 프로그램 참고: http://dasan.sejong.ac.kr/~sipark/class2008/vc/RadioButtonTest.zip

잠깐 번외편: Linked List 와 MFC Template Library CList

많은 데이터를 저장하는 방법 1. Array 이용 A[4] 2 Linked List 이용 a NULL 10 20 30 40 value: 10 Node * p value: 20 Node * p value: 30 Node * p value: 40 Node * p a NULL

구조체와 포인터를 이용한 Linked List 구조체 내에 포인터를 맴버로 가질 수 있다 struct IHavePointer { int a; int * p; };

구조체와 포인터를 이용한 Linked List 구조체를 가리키는 포인터를 맴버로 가질 수 있다 struct test { int a; test * p; };

구조체를 가리키는 맴버 포인터 struct test { int a; test * p; }; test ts; ts.a=20; ts.p=&ts; cout<<“ts.a:”<<ts.a<<“\n”; cout<<“ts.p->a:”<<ts.p->a<<“\n”; cout<<“ts.p->p->a:”<<ts.p->p->a<<“\n”;

구조체를 가리키는 맴버 포인터 struct Dizzy { int id; Dizzy * p; }; Dizzy a,b,c; a.id = 1; a.p=&b; b.id = 2; b.p=&c; c.id = 3; c.p=&a; cout<<“a.id:”<<a.id<<“\n”; cout<<“b.id:”<<a.p->id<<“\n”; cout<<“c.id:”<<a.p->p->id<<“\n”;

구조체를 가리키는 맴버 포인터

코딩연습 (linked list) 다음과 같은 구조체를 만들고 Node 변수 a,b,c,d 4개를 만든다. 각 변수를 그림과 같이 연결한다. a부터 시작해 반복문(while) 을 통해 모든 변수의 value값을 출력 해 보자 struct Node { int value; Node * p; }; value: 10 Node * p value: 20 Node * p value: 30 Node * p value: 40 Node * p a b c d NULL

템플릿과 STL

템플릿 (Template) ? tem·plate n. 1 본뜨는 공구(工具), 형판(型板) 2【건축】 보받이, 도리받이 3 조선대(造船臺)의 쐐기;(반)투명의 피복지(彼覆紙) 4【생화학】 (핵산의) 주형(鑄型) 5【컴퓨터】 보기판, 템플릿 《키보드 위에 놓고 각 키에 할당된 명령의 내용을 보이는 시트》

일반성이 필요한 예제: 두 정수 중 큰 수를 알려주는 max 함수 int max(int a, int b) { if(a>b) return a; else return b; } 두 실수 간의 비교가 필요하다면??? 오버로딩! OVERLOADING!

일반성이 필요한 예제: 두 실수 중 큰 수를 알려주는 max 함수 두 double 간의 비교가 필요하다면??? float max(float a, float b) { if(a>b) return a; else return b; } 오버로딩! OVERLOADING! 두 char 간의 비교가 필요하다면??? 오버로딩! OVERLOADING! 두 complex 간의 비교가 필요하다면??? 오버로딩! OVERLOADING!

한 번에 해결할 수 없을까? 템플릿 (Template)!

다시 붕어빵… 템플릿 (Template)!

템플릿의 활용방법 템플릿 클래스 템플릿 함수

일반적인 스마트 포인터 class AutoArray { public: AutoArray(int * ptr) { _ptr = ptr; } ~AutoArray() { delete [] _ptr; } int& operator[] (int index) { return _ptr[index]; } private: int * _ptr; };

스마트 포인터 활용 AutoArray는 정수형에 대해서만 동작! int main() { AutoArray arr( new int[100] ); arr[20] = 30; return 0; } AutoArray는 정수형에 대해서만 동작!

정수형 스마트 포인터 class AutoArray { public: AutoArray(int * ptr) { _ptr = ptr; } ~AutoArray() { delete [] _ptr; } int& operator[] (int index) { return _ptr[index]; } private: int * _ptr; };

템플릿 클래스의 사용(1) 모든 타입의 배열을 위한 스마트 포인터 클래스 template <typename T> class AutoArray { public: AutoArray(T* ptr) { _ptr = ptr; } ~AutoArray() { delete[] _ptr;} T& operator[] (int index) { return _ptr[index]; } private: T* _ptr; };

템플릿 클래스의 사용(2) 모든 타입의 배열을 위한 스마트 포인터 클래스 int main() { AutoArray<float> arr( new float [100] ); arr[0] = 99.99f; return 0; }

템플릿 클래스의 사용(3) 템플릿 매개 변수의 사용 [29-1]

템플릿 클래스의 이해 템플릿 클래스 객체를 생성하는 순간  컴파일러 내부적으로 알맞은 클래스 생성 개발자가 만든 코드 template< typename A, typename B, int MAX > class TwoArray { // 중간 생략 A arr1[ MAX ]; B arr2[ MAX ]; }; TwoArray< char, double, 20 > arr;

템플릿 클래스의 이해 템플릿 클래스 객체를 생성하는 순간  컴파일러 내부적으로 알맞은 클래스 생성 컴파일러가 새로 만든 클래스 class TwoArray_char_double_20 // 이 이름은 임의로 만든 것 { // 중간 생략 char arr1[ 20 ]; 컴파일러에 의해 생성된 클래스 double arr2[ 20 ]; };

Standard Template Library C++ = 언어 클래스, 멤버함수, 상속, 템플릿, 오버로딩 등의 기술 STL = 템플릿 기반의 편한 사용 툴: 클래스, 함수 등의 집합체 array 나 pointer를 대체하는 데이터 관리에 용이

Standard Template Library 구성: Container 같은 타입의 원소를 관리하는 데이터 구조 지원 클레스 list, vector, deque, … Algorithm Container에 대해 복사, 전환, 병합, 정렬 random_shuffle, replace, fill, remove, sort, … Iterator 원소의 관리 방법 ( = 포인터) 함수 개체 함수 연산자 ( ) 를 오버로딩

STL 컨테이너 자주 사용하는 STL의 컨테이너 클래스 [표 29-1]

Linked List 장점: 데이터의 추가 및 삭제가 용의한 데이터 구조 단점: 데이터의 접근이 순차적으로만 가능

CList MFC에서 제공하는 Linked List Template Class 정의 방법: CList < datatype > a; 데이터 추가: CList::AddTail(..) CList::AddHead(..) 데이터 삭제: CList::RemoveTail(); CList::RemoveHeat(); CList::RemoveAt(..) 사용예: CList < int > a; 데이터 추가: CList::AddTail(3) CList::AddHead(4) 데이터 삭제: CList::RemoveTail(); CList::RemoveHeat(); CList::RemoveAt(..) iterator: POSITION

Iterator Container에서 Pointer와 같은 역할을 하는 것 MFC의 iterator 변수형 : POSITION CList <int> a; a.AddTail(10); a.AddTail(20); a.AddTail(30); POSITION pos = a.GetHeadPosition(); // 첫 데이터 위치 반환 while(pos != NULL) { int value = a.GetNext(pos); // pos위치의 데이터반환 // pos는 다음 위치 가르킴 }

Iterator a pos value 10 20 30 NULL CList <int> a; a.AddTail(10); POSITION pos = a.GetHeadPosition(); while(pos != NULL) { int value = a.GetNext(pos); }

Iterator a pos value 10 20 30 NULL CList <int> a; a.AddTail(10); POSITION pos = a.GetHeadPosition(); while(pos != NULL) { int value = a.GetNext(pos); }

Iterator a pos value 10 10 20 30 1회호출 NULL CList <int> a; a.AddTail(10); a.AddTail(20); a.AddTail(30); POSITION pos = a.GetHeadPosition(); while(pos != NULL) { int value = a.GetNext(pos); } 1회호출

Iterator a pos value 10 20 20 30 2회호출 NULL CList <int> a; a.AddTail(10); a.AddTail(20); a.AddTail(30); POSITION pos = a.GetHeadPosition(); while(pos != NULL) { int value = a.GetNext(pos); } 2회호출

Iterator a pos value 10 30 20 30 3회호출 NULL CList <int> a; a.AddTail(10); a.AddTail(20); a.AddTail(30); POSITION pos = a.GetHeadPosition(); while(pos != NULL) { int value = a.GetNext(pos); } 3회호출

Iterator a pos value 10 30 20 30 NULL 종료 CList <int> a; a.AddTail(10); a.AddTail(20); a.AddTail(30); POSITION pos = a.GetHeadPosition(); while(pos != NULL) { int value = a.GetNext(pos); } 종료

Insertion // 맨 앞에 추가 CList::AddHead( value ) // 맨 뒤에 추가 CList::AddTail( value ) // 임의의 위치에 추가 CList::InsertAfter (POSITION, value)

Retrieval/Modification // 값 얻어오기 value = CList::GetAt( POSITION ) // 값의 reference 얻어오기 value & = CList::GetAt( POSITION ) CList <int> a; a.AddHead(10); a.AddHead(20); a.AddHead(30); POSITION pos; pos = a.GetHeadPosition(); int b = a.GetAt(pos); // value int &c = a.GetAt(pos); // reference

Removal // 맨 앞 삭제 CList::RemoveHead( ) // 맨 뒤 삭제 CList::RemoveTail( ) // 임의의 위치 삭제 CList::RemoveAt(POSITION) // 모두 삭제 CList::RemoveAll( )

기타 여러가지 MFC Container Class CList CVector CMap

코딩연습 마우스 왼쪽 버튼 드래깅을 하면 그 위치에 점을 그리되 점들의 위치를 Clist를 이용하여 저장하라. 마우스 오른쪽 버튼 드래깅으로 사각형 안에 든 점들을 삭제 하라. 마우스 왼쪽 드래깅으로 점찍기 마우스 오른쪽 드래깅으로 사각형 지정 포함된 점들 지우기