공통 컨트롤의 종류와 특징을 개관한다. 각종 공통 컨트롤의 사용 방법을 익힌다.
공통 컨트롤 기초 (1/5) 공통 컨트롤 종류
공통 컨트롤 기초 (2/5) 공통 컨트롤 종류 (cont'd)
공통 컨트롤 기초 (3/5) 컨트롤 툴바
공통 컨트롤 기초 (4/5) 특징 표준 컨트롤은 USER.EXE에 구현되어 있지만 공통 컨트롤은 COMCTL32.DLL에 구현되어 있다. COMCTL32.DLL의 버전에 따라 사용할 수 있는 공통 컨트롤의 종류와 기능에 제약이 있다. 사용하기 전에 반드시 ::InitCommonControls() 또는 ::InitCommonControlsEx()를 호출해야 한다. MFC를 사용하는 경우 이 과정은 자동으로 이루어진다. 일반적으로 통지 메시지를 위해 표준 컨트롤은 WM_COMMAND 메시지를 사용하지만 공통 컨트롤은 WM_NOTIFY 메시지를 사용한다.
공통 컨트롤 기초 (5/5) MFC 클래스 계층도
이미지 리스트 (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); }
탭 컨트롤 (1/3) 탭 컨트롤 동일한 화면 영역에 서로 다른 내용을 표시
탭 컨트롤 (2/3) 탭 컨트롤 스타일
탭 컨트롤 (3/3) 탭 컨트롤 통지 메시지 WM_NOTIFY 통지 메시지 발생 통지 메시지와 더불어 다음과 같은 통지 코드 전달 통지 코드 의미 TCN_SELCHANGING 탭 선택이 변경되기 직전이다. TCN_SELCHANGE 탭 선택이 변경되었다. TCN_KEYDOWN 키를 눌렀다. NM_CLICK 마우스 왼쪽 버튼을 클릭하였다. NM_RCLICK 마우스 오른쪽 버튼을 클릭하였다.
탭 컨트롤 클래스 (1/3) 탭에 사용할 이미지 리스트 설정하기 탭 추가하기 nItem: 탭의 인덱스(0, 1, ...) TCITEM: 하나의 탭에 대한 정보를 가진 구조체 lpszItem: 새로운 탭에 표시할 텍스트(레이블) nImage: 탭에 표시할 이미지(이미지 리스트 인덱스값) CImageList * CTabCtrl::SetImageList (CImageList * pImageList); LONG CTabCtrl::InsertItem (int nItem, TCITEM* pTabCtrlItem); LONG CTabCtrl::InsertItem (int nItem, LPCTSTR lpszItem); LONG CTabCtrl::InsertItem (int nItem, LPCTSTR lpszItem, int nImage);
탭 컨트롤 클래스 (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");
탭 컨트롤 클래스 (3/3) 탭 선택 변경과 선택된 탭 알아내기 int CTabCtrl::SetCurSel (int nItem); int CTabCtrl::GetCurSel ();
스핀 버튼 컨트롤 (1/2) 스핀 버튼 컨트롤 = 업다운 컨트롤 화살표가 두 개 붙어 있어서 마우스 클릭이나 키보드로 값을 증감하는 용도로 사용 스핀 버튼 컨트롤 버디 컨트롤
스핀 버튼 컨트롤 (2/2) 스핀 버튼 컨트롤 스타일
스핀 버튼 컨트롤 클래스 (1/2) 범위 설정과 현재 범위 얻기 위치 설정과 현재 위치 얻기 버디 설정 void CSpinButtonCtrl::SetRange (short nLower, short nUpper); void CSpinButtonCtrl::GetRange (int &lower, int &upper); int CSpinButtonCtrl::SetPos (int nPos); int CSpinButtonCtrl::GetPos (); CWnd* CSpinButtonCtrl::SetBuddy (CWnd* pWndBuddy);
스핀 버튼 컨트롤 클래스 (2/2) 숫자의 진수 변경 스핀 버튼 컨트롤 통지 메시지 마우스로 조작하면 WM_VSCROLL 또는 WM_HSCROLL 메시지 발생 int CSpinButtonCtrl::SetBase (int nBase);
프로그레스 컨트롤 (1/2) 프로그레스 컨트롤 오랜 시간이 걸리는 작업의 진행 상황을 시각적으로 표시하는 용도로 사용
프로그레스 컨트롤 (2/2) 프로그레스 컨트롤 스타일
프로그레스 컨트롤 클래스 범위 설정와 현재 범위 얻기 위치 설정과 현재 위치 얻기 위치값 증감 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 ();