Visual C++ Programming Common Controls Department of Digital Contents Sang Il Park
REVIEW: MFC Template Library CList
Review: 템플릿 클래스 모든 타입의 배열을 위한 스마트 포인터 클래스 template <typename T> class AutoArray { public: AutoArray(T* ptr) { _ptr = ptr; } ~AutoArray() { delete[] _ptr;} T& operator[] (int index) { return _ptr[index]; } private: T* _ptr; };
Review: 템플릿 클래스의 사용 모든 타입의 배열을 위한 스마트 포인터 클래스 int main() { AutoArray<float> arr( new float [100] ); arr[0] = 99.99f; return 0; }
Review: 템플릿 클래스의 사용 템플릿 매개 변수의 사용 [29-1]
Standard Template Library C++ = 언어 클래스, 멤버함수, 상속, 템플릿, 오버로딩 등의 기술 STL = 템플릿 기반의 편한 사용 툴: 클래스, 함수 등의 집합체 array 나 pointer를 대체하는 데이터 관리에 용이
Review: Linked List 장점: 데이터의 추가 및 삭제가 용의한 데이터 구조 단점: 데이터의 접근이 순차적으로만 가능
Review: CList MFC에서 제공하는 Linked List Template Class 반드시 사용 전 afxtempl.h 을 include한다. 정의 방법: 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
Review: 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 반드시 사용 전 afxtempl.h 을 include한다.
코딩 연습 마우스의 궤적을 그리는 프로그램: 단 데이터는 CList를 이용하여 저장하라
코딩연습 CList를 이용한 여러가지 도형 저장
CImageList
이미지 리스트 (1/9) 이미지 리스트 사용 예 동일한 크기의 이미지 집합 각각의 이미지를 배열 항목처럼 취급하여 0부터 시작하는 인덱스로 참조 사용 예 트리 컨트롤과 리스트 컨트롤에 사용되는 비트맵
이미지 리스트 (2/9) 이미지 리스트 생성 방법 이미지 리스트 생성 함수 cx, cy: 이미지의 폭과 높이(픽셀 단위) nFlags: 이미지 리스트의 타입 지정 CImageList m_il; m_il.Create(...); BOOL CImageList::Create (int cx, int cy, UINT nFlags, int nInitial, int nGrow); BOOL CImageList::Create (UINT nBitmapID, int cx, int nGrow, COLORREF crMask);
이미지 리스트 (3/9) 이미지 리스트 생성 함수 (cont'd) nInitial: 초기에 포함할 이미지 개수 nGrow: 새로운 이미지를 추가하기 위해 이미지 리스트의 메모리를 재할당할 때 얼마만큼 여분의 메모리를 할당할 것인가를 나타냄 nBitmapID: 비트맵 리소스 ID crMask: 투명색으로 사용할 색상 원본 마스크
이미지 리스트 (4/9) 이미지 리스트 생성 예 IDB_BITMAP1 CImageList m_il1, m_il2; m_il1.Create(32, 32, ILC_COLOR4, 2, 1); m_il2.Create(IDB_BITMAP1, 48, 1, RGB(255, 255, 255));
이미지 리스트 (5/9) 이미지 추가 함수 hIcon: 아이콘 리소스를 가리키는 핸들값 pbmImage: 비트맵 리소스를 담고 있는 CBitmap 객체의 주소 crMask: 투명색으로 사용할 색상 int CImageList::Add (HICON hIcon); int CImageList::Add (CBitmap* pbmImage, COLORREF crMask);
이미지 리스트 (6/9) 이미지 추가 예 // 두 개의 아이콘을 이미지 리스트에 추가한다. m_il1.Add(AfxGetApp()->LoadIcon(IDI_ICON1)); m_il1.Add(AfxGetApp()->LoadIcon(IDI_ICON2)); // 비트맵을 이미지 리스트에 추가한다. CBitmap bitmap; bitmap.LoadBitmap(IDB_BITMAP1); m_il2.Add(&bitmap, RGB(255, 255, 255));
이미지 리스트 (7/9) 화면 출력 함수 pDC: 출력할 대상을 나타내는 디바이스 컨텍스트 nImage: 출력할 이미지의 인덱스 pt: 출력 좌표 nStyle: 그리기 스타일(다음 페이지 표 참조) BOOL CImageList::Draw (CDC* pDC, int nImage, POINT pt, UINT nStyle);
이미지 리스트 (8/9) 그리기 스타일
이미지 리스트 (9/9) 화면 출력 예 void CExImageListView::OnDraw(CDC* pDC) { // 배경색을 CLR_NONE으로 설정한다. m_il.SetBkColor(CLR_NONE); m_il.Draw(pDC, 0, CPoint(100, 200), ILD_NORMAL); m_il.Draw(pDC, 0, CPoint(150, 200), ILD_BLEND25); m_il.Draw(pDC, 0, CPoint(200, 200), ILD_BLEND50); m_il.Draw(pDC, 0, CPoint(250, 200), ILD_MASK); }
이미지 리스트와 리스트 컨트롤 리스트 컨트롤 생성과 초기화 CImageList 객체 선언 후 CImageList::Create(), CImageList::Add() 등을 이용하여 생성과 초기화 CListCtrl::SetImageList()로 리스트 컨트롤에서 사용할 이미지 리스트 설정
이미지 리스트와 리스트 컨트롤 주요 함수 pImageList: 리스트 컨트롤에서 사용할 이미지 리스트 nImageListType: 이미지 리스트에 포함된 이미지의 용도를 나타내는 상수값 CImageList* CListCtrl::SetImageList (CImageList* pImageList, int nImageListType); nImageListType 용도 LVSIL_NORMAL 아이콘 보기 (32X32) LVSIL_SMALL 작은 아이콘 보기, 목록 보기, 보고서 보기 (16X16)
이미지 리스트와 리스트 컨트롤 주요 함수 nItem: 항목 인덱스이며 0부터 시작 lpszItem: 항목에 표시할 텍스트 nImage: 항목에 표시할 이미지로서 이미지 리스트에서의 인덱스 값을 사용 int CListCtrl::InsertItem (int nItem, LPCTSTR lpszItem, int nImage);
Tree Control
트리 컨트롤 (1/2) 트리 컨트롤 = 트리 뷰 컨트롤 이미지와 텍스트를 이용하여 계층적인 형태로 정보를 표시하는 용도로 사용
트리 컨트롤 (2/2) 용어 항목 부모 항목 자식 항목 루트 항목 트리 컨트롤에 표시되는 하나의 정보 하나 이상의 하위 항목을 가진 항목 자식 항목 부모 항목에 딸린 하위 항목 루트 항목 계층 구조에서 최상위 항목 루트 항목은 부모 항목을 가지지 않음
트리 컨트롤 클래스 (1/11) 트리 컨트롤 생성과 초기화 CTreeCtrl 객체 선언 후 CTreeCtrl::Create()로 트리 컨트롤 생성 CImageList 객체 선언 후 CImageList::Create(), CImageList::Add() 등을 이용하여 생성과 초기화 CTreeCtrl::SetImageList()로 트리 컨트롤에서 사용할 이미지 리스트 설정 CTreeCtrl::InsertItem()으로 항목 추가
트리 컨트롤 클래스 (2/11) 예제 코드 // ① CTreeCtrl 객체 선언과 트리 컨트롤 생성 m_tree.Create(WS_CHILD|WS_VISIBLE|WS_BORDER| TVS_HASBUTTONS|TVS_HASLINES|TVS_LINESATROOT, CRect(10, 10, 150, 150), this, 101); // ② CImageList 객체 선언과 이미지 리스트 생성, 초기화 CImageList il; il.Create(IDB_BITMAP1, 16, 1, RGB(255, 255, 255));
트리 컨트롤 클래스 (3/11) 예제 코드 (cont'd) // ③ 이미지 리스트 설정 m_tree.SetImageList(&il, TVSIL_NORMAL); il.Detach(); // ④ 항목 추가 // 1레벨 초기화 HTREEITEM hSun = m_tree.InsertItem("태양", 0, 0, TVI_ROOT, TVI_LAST);
트리 컨트롤 클래스 (4/11) 예제 코드 (cont'd) // 2레벨 초기화 m_tree.InsertItem("수성", 1, 1, hSun, TVI_LAST); m_tree.InsertItem("금성", 1, 1, hSun, TVI_LAST); HTREEITEM hEarth = m_tree.InsertItem("지구", 1, 1, hSun, TVI_LAST); HTREEITEM hMars = m_tree.InsertItem("화성", 1, 1, hSun, TVI_LAST); // 3레벨 초기화 m_tree.InsertItem("달", 2, 2, hEarth, TVI_LAST); m_tree.InsertItem("포보스", 2, 2, hMars, TVI_LAST); m_tree.InsertItem("데이모스", 2, 2, hMars, TVI_LAST);
트리 컨트롤 클래스 (5/11) 주요 함수 dwStyle: 컨트롤 스타일을 지정. 일반 윈도우 스타일(WS_*)과 트리 컨트롤 스타일(TVS_*)의 조합을 사용 rect: 컨트롤의 크기와 위치 pParentWnd: 부모 윈도우 nID: 컨트롤 ID BOOL CTreeCtrl::Create (DWORD dwStyle, const RECT& rect, CWnd* pParentWnd, UINT nID);
트리 컨트롤 클래스 (6/11) 주요 함수 (cont'd) pImageList: 트리 컨트롤에서 사용할 이미지 리스트 nImageListType: 이미지 리스트에 포함된 이미지의 용도. 항목을 나타내는 일반 이미지일 경우에는 TVSIL_NORMAL, 사용자 정의 상태 이미지일 경우에는 TVSIL_STATE를 사용 CImageList* CTreeCtrl::SetImageList (CImageList * pImageList, int nImageListType);
트리 컨트롤 클래스 (7/11) 주요 함수 (cont'd) lpszItem: 항목에 표시할 텍스트 nImage: 항목에 표시할 이미지를 나타내며 이미지 리스트에서의 인덱스 값을 사용 nSelectedImage: 항목이 선택되면 표시할 이미지를 나타내며 이미지 리스트에서의 인덱스 값을 사용 HTREEITEM CTreeCtrl::InsertItem (LPCTSTR lpszItem, int nImage, int nSelectedImage, HTREEITEM hParent = TVI_ROOT, HTREEITEM hInsertAfter = TVI_LAST);
트리 컨트롤 클래스 (8/11) 주요 함수 (cont'd) hParent: 부모 항목을 나타내는 HTREEITEM 값이다. 루트 항목을 추가할 경우에는 TVI_ROOT를 사용 hInsertAfter: 항목을 추가할 위치를 나타내며 보통 다음 표의 값 중 하나를 사용. 항목 다음 위치에 추가하고 싶을 경우 그 항목을 나타내는 HTREEITEM 값을 사용 값 의미 TVI_FIRST 제일 앞쪽에 추가한다. TVI_LAST 제일 뒤쪽에 추가한다. TVI_ROOT 루트 항목으로 추가한다. TVI_SORT 철자순으로 정렬이 되도록 추가한다.
트리 컨트롤 클래스 (9/11) 스타일 변경하기 dwRemove: 제거할 스타일 dwAdd: 추가할 스타일 nFlags: 기본값 사용 BOOL CWnd::ModifyStyle (DWORD dwRemove, DWORD dwAdd, UINT nFlags = 0);
트리 컨트롤 클래스 (10/11) 선택 항목 알아내기 HTREEITEM hItem = m_tree.GetSelectedItem(); if(hItem != NULL) { CString str = m_tree.GetItemText(hItem); MessageBox(str); }
트리 컨트롤 클래스 (11/11) 항목 추가와 삭제 항목 추가 항목 삭제 CTreeCtrl::InsertItem() CTreeCtrl::DeleteItem() HTREEITEM hItem = m_tree.GetSelectedItem(); if(hItem != NULL) { m_tree.DeleteItem(hItem); }