Presentation is loading. Please wait.

Presentation is loading. Please wait.

Visual C++ Programming Common Controls

Similar presentations


Presentation on theme: "Visual C++ Programming Common Controls"— Presentation transcript:

1 Visual C++ Programming Common Controls
Department of Digital Contents Sang Il Park

2 Common Controls

3 공통 컨트롤 기초 (1/5) 컨트롤 툴바 표준 컨트롤 공통 컨트롤

4 공통 컨트롤 기초 (2/5) 공통 컨트롤 종류

5 공통 컨트롤 기초 (3/5) 공통 컨트롤 종류 (cont'd)

6 공통 컨트롤 기초 (4/5) 특징 표준 컨트롤은 USER.EXE에 구현되어 있지만 공통 컨트롤은 COMCTL32.DLL에 구현되어 있다. COMCTL32.DLL의 버전에 따라 사용할 수 있는 공통 컨트롤의 종류와 기능에 제약이 있다. 사용하기 전에 반드시 ::InitCommonControls() 또는 ::InitCommonControlsEx()를 호출해야 한다. MFC를 사용하는 경우 이 과정은 자동으로 이루어진다. 일반적으로 통지 메시지를 위해 표준 컨트롤은 WM_COMMAND 메시지를 사용하지만 공통 컨트롤은 WM_NOTIFY 메시지를 사용한다.

7 공통 컨트롤 기초 (5/5) MFC 클래스 계층도

8 List Control

9 리스트 컨트롤 (1/3) 리스트 컨트롤 = 리스트 뷰 컨트롤 표시 방법
이미지와 텍스트를 이용하여 다양한 형태로 정보를 표시하는 용도로 사용 표시 방법 아이콘 보기 32*32 크기의 아이콘과 텍스트로 항목 표시 작은 아이콘 보기 16*16 크기의 아이콘과 텍스트로 항목 표시 목록 보기

10 리스트 컨트롤 (2/3) 표시 방법 (cont'd) 보고서 보기 헤더 컨트롤 항목 서브 항목
16*16 크기의 아이콘과 텍스트로 항목 표시 서브 항목으로 부가적인 정보 표시 헤더 컨트롤로 각 열의 폭 조절과 항목 정렬 가능 헤더 컨트롤 항목 서브 항목

11 리스트 컨트롤 (3/3) 리스트 컨트롤 스타일

12 리스트 컨트롤 클래스 (1/17) 리스트 컨트롤 생성과 초기화
CListCtrl 객체 선언 후 CListCtrl::Create()로 리스트 컨트롤 생성 CListCtrl::InsertColumn()으로 보고서 보기에서 표시할 헤더 초기화 CListCtrl::InsertItem()으로 항목 추가 CListCtrl::SetItemText()로 하위 항목 초기화

13 리스트 컨트롤 클래스 (2/17) 예제 코드 // ① CListCtrl 객체 선언과 리스트 컨트롤 생성
CListCtrl m_list; m_list.Create(WS_CHILD|WS_VISIBLE|WS_BORDER|LVS_REPORT, CRect(0, 0, 300, 100), this, IDC_LIST1); // ② 헤더 초기화 m_list.InsertColumn(0, "이름", LVCFMT_LEFT, 100); m_list.InsertColumn(1, "성적", LVCFMT_LEFT, 100); m_list.InsertColumn(2, "학점", LVCFMT_LEFT, 100);

14 리스트 컨트롤 클래스 (4/17) 예제 코드 (cont'd) // ③ 항목 추가
m_list.InsertItem(0, "김철수", 0); m_list.InsertItem(1, "이영희", 0); m_list.InsertItem(2, "박선아", 0); // ④ 하위 항목 추가 m_list.SetItemText(0, 1, "90"); m_list.SetItemText(0, 2, "A"); m_list.SetItemText(1, 1, "95"); m_list.SetItemText(1, 2, "A+"); m_list.SetItemText(2, 1, "70"); m_list.SetItemText(2, 2, "B0");

15 리스트 컨트롤 클래스 (5/17) 주요 함수 dwStyle: 컨트롤 스타일을 지정. 일반 윈도우 스타일(WS_*)과 리스트 컨트롤 스타일(LVS_*)의 조합을 사용 rect: 컨트롤의 크기와 위치 pParentWnd: 부모 윈도우 nID: 컨트롤 ID BOOL CListCtrl::Create (DWORD dwStyle, const RECT& rect, CWnd* pParentWnd, UINT nID);

16 리스트 컨트롤 클래스 (7/17) 주요 함수 (cont'd)
nCol: 열 번호를 나타내며 0부터 시작 lpszColumnHeading: 헤더 컨트롤에 표시할 텍스트 nFormat: 헤더 컨트롤에 표시할 텍스트의 정렬 방식을 나타내며 LVCFMT_LEFT(왼쪽), LVCFMT_RIGHT(오른쪽), LVCFMT_CENTER(가운데) 중 하나를 선택 nWidth: 열의 폭(픽셀 단위) nSubItem: 연관된 하위 항목의 인덱스를 나타내며, 보통 nCol과 같은 값을 사용 int CListCtrl::InsertColumn (int nCol, LPCTSTR lpszColumnHeading, int nFormat = LVCFMT_LEFT, int nWidth = -1, int nSubItem = -1);

17 리스트 컨트롤 클래스 (8/17) 주요 함수 (cont'd) nItem: 항목 인덱스이며 0부터 시작
lpszItem: 항목에 표시할 텍스트 nImage: 항목에 표시할 이미지로서 이미지 리스트에서의 인덱스 값을 사용 int CListCtrl::InsertItem (int nItem, LPCTSTR lpszItem, int nImage);

18 리스트 컨트롤 클래스 (9/17) 주요 함수 (cont'd) nItem: 항목 인덱스이며 0부터 시작
nSubItem: 하위 항목 인덱스이며 1부터 시작. 0을 사용하면 항목 텍스트 변경 가능 lpszText: 하위 항목(nSubItem>0) 또는 항목(nSubItem=0)에 표시할 텍스트 BOOL CListCtrl::SetItemText (int nItem, int nSubItem, LPCTSTR lpszText);

19 리스트 컨트롤 클래스 (10/17) 표준 스타일(LVS_*) 변경하기 dwRemove: 제거할 스타일
dwAdd: 추가할 스타일 nFlags: 기본값 사용 BOOL CWnd::ModifyStyle (DWORD dwRemove, DWORD dwAdd, UINT nFlags = 0); // 아이콘 보기로 변경한다. m_list.ModifyStyle(LVS_TYPEMASK, LVS_ICON); // 레이블 편집을 가능하게 한다. m_list.ModifyStyle(0, LVS_EDITLABELS);

20 리스트 컨트롤 클래스 (11/17) 확장 스타일(LVS_EX_*) 변경하기 dwNewStyle : 새로 적용할 확장 스타일
DWORD CListCtrl::SetExtendedStyle (DWORD dwNewStyle); // 보고서 보기에서 격자 무늬를 표시한다. m_list.SetExtendedStyle(m_list.GetExtendedStyle()| LVS_EX_GRIDLINES); // 보고서 보기에서 항목을 선택하면 줄 전체가 선택되도록 한다. m_list.SetExtendedStyle(m_list.GetExtendedStyle() | LVS_EX_FULLROWSELECT);

21 리스트 컨트롤 클래스 (12/17) 선택 항목 알아내기 - 마우스 또는 키보드로 새로운 항목을 선택한 경우
메시지 맵을 통해 메시지를 받고, 메시지 핸들러를 통해 내용을 구현 // 메시지맵 ON_NOTIFY(LVN_ITEMCHANGED, IDC_LIST1, OnItemchangedList1) // 메시지 핸들러 모양 void CExListCtrlView::OnItemchangedList1(NMHDR* pNMHDR, LRESULT* pResult) {…}

22 리스트 컨트롤 클래스 (14/17) 선택 항목 알아내기 – NMLISTVIEW 구조체
typedef struct tagNMLISTVIEW { NMHDR hdr; // information about message int iItem; // 이벤트를 발생시킨 아이템번호 int iSubItem; // 이벤트를 발생시킨 서브아이템 UINT uNewState; // 발생한 변화 (LVIS_SELECTED) UINT uOldState; // 이전의 상태 UINT uChanged; // 변화된 대상 (LVIF_STATE) POINT ptAction; // 이벤트가 일어난 장소 LPARAM lParam; } NMLISTVIEW, *LPNMLISTVIEW;

23 리스트 컨트롤 클래스 (13/17) 선택 항목 알아내기 – 메시지 핸들러
void CExListCtrlView::OnItemchangedList1(NMHDR* pNMHDR, LRESULT* pResult) { NMLISTVIEW* pNMLV = (NMLISTVIEW*) pNMHDR; if(pNMLV->uChanged & LVIF_STATE) { if(pNMLV->uNewState & (LVIS_SELECTED|LVIS_FOCUSED)) { CString str = m_list.GetItemText(pNMLV->iItem, 0); AfxGetMainWnd()->SetWindowText(str); } *pResult = 0;

24 리스트 컨트롤 클래스 (16/17) 선택 항목 알아내기 - 선택된 다수 개의 항목을 조사하는 경우
void CExListCtrlView::PrintSelectedItemIndex() { POSITION pos = m_list.GetFirstSelectedItemPosition(); if(pos != NULL) { while(pos) { int nItem = m_list.GetNextSelectedItem(pos); TRACE("항목 %d번이 선택되었습니다.\n", nItem); }

25 리스트 컨트롤 클래스 (17/17) 항목 추가와 삭제 항목 추가 항목 삭제 CListCtrl::InsertItem()
하나의 항목을 삭제하려면 CListCtrl::DeleteItem(), 모든 항목을 삭제하려면 CListCtrl::DeleteAllItems() 사용 // 첫 번째 항목 삭제 m_list.DeleteItem(0); // 모든 항목 삭제 m_list.DeleteAllItems();

26 리스트 뷰 (1/3) CListView 클래스 리스트 컨트롤을 이용한 사용자 인터페이스 제공 리스트 컨트롤

27 리스트 뷰 (2/3) CListView 클래스 사용 예
// 리스트 컨트롤 객체에 대한 참조값(CListCtrl 타입)을 얻는다. CListCtrl& list = GetListCtrl(); // 참조 변수를 이용하여 리스트 컨트롤을 다룬다. list.SetImageList(...); list.InsertColumn(...); ...

28 리스트 뷰 (3/3) MFC 클래스 계층도

29 CImageList

30 이미지 리스트 (1/9) 이미지 리스트 사용 예 동일한 크기의 이미지 집합
각각의 이미지를 배열 항목처럼 취급하여 0부터 시작하는 인덱스로 참조 사용 예 트리 컨트롤과 리스트 컨트롤에 사용되는 비트맵

31 이미지 리스트 (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);

32 이미지 리스트 (3/9) 이미지 리스트 생성 함수 (cont'd) nInitial: 초기에 포함할 이미지 개수
nGrow: 새로운 이미지를 추가하기 위해 이미지 리스트의 메모리를 재할당할 때 얼마만큼 여분의 메모리를 할당할 것인가를 나타냄 nBitmapID: 비트맵 리소스 ID crMask: 투명색으로 사용할 색상 원본 마스크

33 이미지 리스트 (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));

34 이미지 리스트 (5/9) 이미지 추가 함수 hIcon: 아이콘 리소스를 가리키는 핸들값
pbmImage: 비트맵 리소스를 담고 있는 CBitmap 객체의 주소 crMask: 투명색으로 사용할 색상 int CImageList::Add (HICON hIcon); int CImageList::Add (CBitmap* pbmImage, COLORREF crMask);

35 이미지 리스트 (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));

36 이미지 리스트 (7/9) 화면 출력 함수 pDC: 출력할 대상을 나타내는 디바이스 컨텍스트
nImage: 출력할 이미지의 인덱스 pt: 출력 좌표 nStyle: 그리기 스타일(다음 페이지 표 참조) BOOL CImageList::Draw (CDC* pDC, int nImage, POINT pt, UINT nStyle);

37 이미지 리스트 (8/9) 그리기 스타일

38 이미지 리스트 (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); }

39 이미지 리스트와 리스트 컨트롤 리스트 컨트롤 생성과 초기화
CImageList 객체 선언 후 CImageList::Create(), CImageList::Add() 등을 이용하여 생성과 초기화 CListCtrl::SetImageList()로 리스트 컨트롤에서 사용할 이미지 리스트 설정

40 이미지 리스트와 리스트 컨트롤 주요 함수 pImageList: 리스트 컨트롤에서 사용할 이미지 리스트
nImageListType: 이미지 리스트에 포함된 이미지의 용도를 나타내는 상수값 CImageList* CListCtrl::SetImageList (CImageList* pImageList, int nImageListType); nImageListType 용도 LVSIL_NORMAL 아이콘 보기 (32X32) LVSIL_SMALL 작은 아이콘 보기, 목록 보기, 보고서 보기 (16X16)

41 이미지 리스트와 리스트 컨트롤 주요 함수 nItem: 항목 인덱스이며 0부터 시작 lpszItem: 항목에 표시할 텍스트
nImage: 항목에 표시할 이미지로서 이미지 리스트에서의 인덱스 값을 사용 int CListCtrl::InsertItem (int nItem, LPCTSTR lpszItem, int nImage);

42 Tree Control

43 트리 컨트롤 (1/2) 트리 컨트롤 = 트리 뷰 컨트롤 이미지와 텍스트를 이용하여 계층적인 형태로 정보를 표시하는 용도로 사용

44 트리 컨트롤 (2/2) 용어 항목 부모 항목 자식 항목 루트 항목 트리 컨트롤에 표시되는 하나의 정보
하나 이상의 하위 항목을 가진 항목 자식 항목 부모 항목에 딸린 하위 항목 루트 항목 계층 구조에서 최상위 항목 루트 항목은 부모 항목을 가지지 않음

45 트리 컨트롤 클래스 (1/11) 트리 컨트롤 생성과 초기화
CTreeCtrl 객체 선언 후 CTreeCtrl::Create()로 트리 컨트롤 생성 CImageList 객체 선언 후 CImageList::Create(), CImageList::Add() 등을 이용하여 생성과 초기화 CTreeCtrl::SetImageList()로 트리 컨트롤에서 사용할 이미지 리스트 설정 CTreeCtrl::InsertItem()으로 항목 추가

46 트리 컨트롤 클래스 (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));

47 트리 컨트롤 클래스 (3/11) 예제 코드 (cont'd) // ③ 이미지 리스트 설정
m_tree.SetImageList(&il, TVSIL_NORMAL); il.Detach(); // ④ 항목 추가 // 1레벨 초기화 HTREEITEM hSun = m_tree.InsertItem("태양", 0, 0, TVI_ROOT, TVI_LAST);

48 트리 컨트롤 클래스 (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);

49 트리 컨트롤 클래스 (5/11) 주요 함수 dwStyle: 컨트롤 스타일을 지정. 일반 윈도우 스타일(WS_*)과 트리 컨트롤 스타일(TVS_*)의 조합을 사용 rect: 컨트롤의 크기와 위치 pParentWnd: 부모 윈도우 nID: 컨트롤 ID BOOL CTreeCtrl::Create (DWORD dwStyle, const RECT& rect, CWnd* pParentWnd, UINT nID);

50 트리 컨트롤 클래스 (6/11) 주요 함수 (cont'd) pImageList: 트리 컨트롤에서 사용할 이미지 리스트
nImageListType: 이미지 리스트에 포함된 이미지의 용도. 항목을 나타내는 일반 이미지일 경우에는 TVSIL_NORMAL, 사용자 정의 상태 이미지일 경우에는 TVSIL_STATE를 사용 CImageList* CTreeCtrl::SetImageList (CImageList * pImageList, int nImageListType);

51 트리 컨트롤 클래스 (7/11) 주요 함수 (cont'd) lpszItem: 항목에 표시할 텍스트
nImage: 항목에 표시할 이미지를 나타내며 이미지 리스트에서의 인덱스 값을 사용 nSelectedImage: 항목이 선택되면 표시할 이미지를 나타내며 이미지 리스트에서의 인덱스 값을 사용 HTREEITEM CTreeCtrl::InsertItem (LPCTSTR lpszItem, int nImage, int nSelectedImage, HTREEITEM hParent = TVI_ROOT, HTREEITEM hInsertAfter = TVI_LAST);

52 트리 컨트롤 클래스 (8/11) 주요 함수 (cont'd)
hParent: 부모 항목을 나타내는 HTREEITEM 값이다. 루트 항목을 추가할 경우에는 TVI_ROOT를 사용 hInsertAfter: 항목을 추가할 위치를 나타내며 보통 다음 표의 값 중 하나를 사용. 항목 다음 위치에 추가하고 싶을 경우 그 항목을 나타내는 HTREEITEM 값을 사용 의미 TVI_FIRST 제일 앞쪽에 추가한다. TVI_LAST 제일 뒤쪽에 추가한다. TVI_ROOT 루트 항목으로 추가한다. TVI_SORT 철자순으로 정렬이 되도록 추가한다.

53 트리 컨트롤 클래스 (9/11) 스타일 변경하기 dwRemove: 제거할 스타일 dwAdd: 추가할 스타일
nFlags: 기본값 사용 BOOL CWnd::ModifyStyle (DWORD dwRemove, DWORD dwAdd, UINT nFlags = 0);

54 트리 컨트롤 클래스 (10/11) 선택 항목 알아내기 HTREEITEM hItem = m_tree.GetSelectedItem(); if(hItem != NULL) { CString str = m_tree.GetItemText(hItem); MessageBox(str); }

55 트리 컨트롤 클래스 (11/11) 항목 추가와 삭제 항목 추가 항목 삭제 CTreeCtrl::InsertItem()
CTreeCtrl::DeleteItem() HTREEITEM hItem = m_tree.GetSelectedItem(); if(hItem != NULL) { m_tree.DeleteItem(hItem); }

56 ANNOUNCEMENT Programming Assignment #4 오늘 (6월4일) 오후 6시 이전에 홈페이지에 올릴 예정
숙제 기한은 6월 13일(토요일) 23시59분까지 제출 방법은 이전과 동일 (리포트 및 코드: 이메일 제출)

57 Tab Control

58 탭 컨트롤 (1/3) 탭 컨트롤 동일한 화면 영역에 서로 다른 내용을 표시

59 탭 컨트롤 (2/3) 탭 컨트롤 스타일

60 탭 컨트롤 (3/3) 탭 컨트롤 통지 메시지 WM_NOTIFY 통지 메시지 발생
통지 메시지와 더불어 다음과 같은 통지 코드 전달 통지 코드 의미 TCN_SELCHANGING 탭 선택이 변경되기 직전이다. TCN_SELCHANGE 탭 선택이 변경되었다. TCN_KEYDOWN 키를 눌렀다. NM_CLICK 마우스 왼쪽 버튼을 클릭하였다. NM_RCLICK 마우스 오른쪽 버튼을 클릭하였다.

61 탭 컨트롤 클래스 (1/3) 탭 추가하기 nItem: 탭의 인덱스(0, 1, ...)
TCITEM: 하나의 탭에 대한 정보를 가진 구조체 lpszItem: 새로운 탭에 표시할 텍스트(레이블) nImage: 탭에 표시할 이미지(이미지 리스트 인덱스값) LONG CTabCtrl::InsertItem (int nItem, TCITEM* pTabCtrlItem); LONG CTabCtrl::InsertItem (int nItem, LPCTSTR lpszItem); LONG CTabCtrl::InsertItem (int nItem, LPCTSTR lpszItem, int nImage);

62 탭 컨트롤 클래스 (2/3) 탭 추가 예 TCITEM tcItem; tcItem.mask = TCIF_TEXT;
tcItem.pszText = "Tab #0"; m_tab.InsertItem(0, &tcItem); tcItem.pszText = "Tab #1"; m_tab.InsertItem(1, &tcItem); tcItem.pszText = "Tab #2"; m_tab.InsertItem(2, &tcItem); m_tab.InsertItem(0, "Tab #0"); m_tab.InsertItem(1, "Tab #1"); m_tab.InsertItem(2, "Tab #2");

63 탭 컨트롤 클래스 (3/3) 탭 선택 변경과 선택된 탭 알아내기
int CTabCtrl::SetCurSel (int nItem); int CTabCtrl::GetCurSel ();

64 프로그레스 컨트롤 (1/2) 프로그레스 컨트롤 오랜 시간이 걸리는 작업의 진행 상황을 시각적으로 표시하는 용도로 사용

65 프로그레스 컨트롤 (2/2) 프로그레스 컨트롤 스타일

66 프로그레스 컨트롤 클래스 범위 설정와 현재 범위 얻기 위치 설정과 현재 위치 얻기 위치값 증감
void CProgressCtrl::SetRange (short nLower, short nUpper); void CProgressCtrl::GetRange (int& nLower, int& nUpper); int CProgressCtrl::SetPos (int nPos); int CProgressCtrl::GetPos (); int CProgressCtrl::OffsetPos (int nPos); int CProgressCtrl::SetStep (int nStep); int CProgressCtrl::StepIt ();


Download ppt "Visual C++ Programming Common Controls"

Similar presentations


Ads by Google