공통컨트롤 HCI Programming 2 (321190) 2008 년가을학기 11/26/2008 박경신 공통컨트롤 (Window Common Control) Animate Control Image List Control List Control Progress Bar Control Tab Control Tree Control Spin Control Slider Control 2 공통컨트롤종류 공통컨트롤종류 컨트롤이름 MFC 클래스 역할 애니메이션 CAnimateCtrl AVI 비디오클립재생 날짜시간선택기 CDateTimeCtrl 날짜또는시간선택 확장콤보박스 CComboBoxEx 일종의콤보박스로텍스트와이미지표시 헤더 CHeaderCtrl 여러열 (column) 로표시되는텍스트의폭조절 핫키 CHotKeyCtrl 핫키입력과생성 CImageList 여러개의이미지관리 리스트 CListCtrl 텍스트와아이콘을다양한방법으로표시 달력 CMonthCalCtrl 날짜정보표시와선택 컨트롤이름 MFC 클래스역할리바 (Rebar) CRebarCtrl 다른컨트롤을자식윈도우로포함하는툴바 리치에디트 CRichEditCtrl 다양한기능을제공하는텍스트입력컨트롤 슬라이더 CSliderEx 눈금표시를가질수있는일종의스크롤바 스핀버튼 CSpinButtonCtrl 두개의화살표시로값증강 상태바 CStatusBarCtrl 프로그램의상태표시 프로그래스 CProgressCtrl 작업진행상황표시 3 4 탭 툴바 CTabCtrl CToolbarCtrl 동일한화면영역에서로다른페이지를표시및전환 명령메시지를발생시키는비트맵버튼의집합 툴팁 CTooltipCtrl 툴바버튼등다른컨트롤에조그만크기의팝업윈도우를표시 트리 CTreeCtrl 항목을계층적으로표시
공통컨트롤특징 표준컨트롤은 USER.EXE 에구현되어있지만공통컨트롤은 COMCTL32.DLL 에구현되어있다. COMCTL32.DLL 의버전에따라사용할수있는공통컨트롤의종류와기능에제약이있다. 사용하기전에반드시 ::InitCommonControls() 또는 ::InitCommonControlsEx() 를호출해야한다. MFC 를사용하는경우이과정은자동으로이루어진다. 일반적으로통지메시지를위해표준컨트롤은 WM_COMMAND 메시지를사용하지만공통컨트롤은 WM_NOTIFY 메시지를사용한다. MFC 클래스계층도 공통컨트롤클래스계층도 5 6 (Image List) 동일한크기의이미지집합 각각의이미지를배열항목처럼취급하여 0부터시작하는인덱스로참조 다른컨트롤의아이콘이나비트맵을관리하는이미지집합 사용예 트리컨트롤 (CTreeCtrl) 과리스트컨트롤 (CListCtrl) 에사용되는비트맵 생성방법 CImageList m_il; m_il.create(...); 7 8
생성함수 원본 마스크 생성예 BOOL CImageList::Create (int cx, int cy, UINT nflags, int ninitial, int ngrow); BOOL CImageList::Create (UINT nbitmapid, int cx, int ngrow, COLORREF crmask); 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)); cx, cy: 이미지의폭과높이 ( 픽셀단위 ) nflags: 의타입지정 (ILC_COLOR4 : 4 비트 16 색상 ) ninitial: 초기에포함할이미지개수 ngrow: 새로운이미지를추가하기위해의메모리를재할당할때얼마만큼여분의메모리를할당할것인가를나타냄 nbitmapid: 비트맵리소스 ID crmask: 투명색으로사용할색상 9 IDB_BITMAP1 10 이미지추가함수 에새로운비트맵이나아이콘을추가 int CImageList::Add (HICON hicon); int CImageList::Add (CBitmap* pbmimage, COLORREF crmask); hicon: 아이콘리소스를가리키는핸들값 pbmimage: 비트맵리소스를담고있는 CBitmap 객체의주소 crmask: 투명색으로사용할색상 이미지추가예 // 두개의아이콘을에추가한다. 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)); 11 12
화면출력함수 그리기스타일 (nstyle) BOOL CImageList::Draw (CDC* pdc, int nimage, POINT pt, UINT nstyle); pdc: 출력할대상을나타내는디바이스컨텍스트 nimage: 출력할이미지의인덱스 pt: 출력좌표 nstyle: 그리기스타일 ( 다음페이지표참조 ) 값 ILD_BLEND25, ILD_FOCUS ILD_BLEND50, ILD_SELECTED, ILD_BLEND ILD_MASK ILD_NORMAL 의미 시스템하이라이트색상을 25% 섞어서출력 시스템하이라이트색상을 50% 섞어서출력 마스크를출력 이미지의배경색을이용하여출력하며배경색이 CLR_NONE 으로설정된경우마스크를이용하여이미지를투명하게출력 ILD_TRANSPARENT 마스크를이용하여이미지를투명하게출력 13 14 void CExImageListView::OnDraw(CDC* pdc) { CBrush brush(hs_cross, RGB(200, 200, 200)); pdc->selectobject(&brush); CRect rect; GetClientRect(&rect); pdc->rectangle(&rect); m_il.setbkcolor(clr_none); // 이미지의배경색을투명하게설정 m_il.draw(pdc, 0, CPoint(100, 100), ILD_NORMAL); m_il.draw(pdc, 0, CPoint(200, 100), ILD_TRANSPARENT); m_il.draw(pdc, 0, CPoint(300, 100), ILD_BLEND25); m_il.draw(pdc, 0, CPoint(400, 100), ILD_BLEND50); m_il.draw(pdc, 0, CPoint(500, 100), ILD_MASK); 탭컨트롤 (Tab Control) 동일한화면영역에서로다른내용을표시 정보를기능별로분류하고자할때사용 주어진탭을선택함에따라해당하는정보를분류하여보여줌 작은대화상자안에많은정보를표현하고자할때사용 m_il.setbkcolor(rgb(0, 0, 0)); // 이미지의배경색을검은색으로설정 m_il.draw(pdc, 1, CPoint(100, 200), ILD_NORMAL); m_il.draw(pdc, 1, CPoint(200, 200), ILD_TRANSPARENT); m_il.draw(pdc, 1, CPoint(300, 200), ILD_BLEND25); m_il.draw(pdc, 1, CPoint(400, 200), ILD_BLEND50); m_il.draw(pdc, 1, CPoint(500, 200), ILD_MASK); } 15 16
탭컨트롤스타일 탭컨트롤스타일 탭컨트롤통지메시지 WM_NOTIFY 통지메시지발생 통지메시지와더불어다음과같은통지코드전달 통지코드 의미 TCN_SELCHANGING 탭선택이변경되기직전이다. TCN_SELCHANGE 탭선택이변경되었다. TCN_KEYDOWN 키를눌렀다. NM_CLICK 마우스왼쪽버튼을클릭하였다. NM_RCLICK 마우스오른쪽버튼을클릭하였다. 17 18 탭컨트롤클래스 탭에사용할설정하기 탭컨트롤클래스 TCITEM 구조체 : 하나의탭에대한정보를가진구조체 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); nitem: 탭의인덱스 (0, 1,...) TCITEM: 하나의탭에대한정보를가진구조체 lpszitem: 새로운탭에표시할텍스트 ( 레이블 ) nimage: 탭에표시할이미지 ( 인덱스값 ) 19 typedef struct tagtcitem { UINT mask; DWORD dwstate; DWORD dwstatemask; LPTSTR psztext; // 탭레이블 int cchtextmax; // 탭레이블길이 int iimage; LPARAM lparam; } TCITEM, FAR *LPTCITEM; mask: TCIF_IMAGE, TCIF_PARAM, TCIF_RTLREADING, TCIF_STATE, TCIF_TEXT 20
탭컨트롤클래스 탭추가예 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); 탭컨트롤클래스 탭선택변경과선택된탭알아내기 int CTabCtrl::SetCurSel (int nitem); int CTabCtrl::GetCurSel (); m_tab.insertitem(0, "Tab #0"); // 매개변수이용탭추가 m_tab.insertitem(1, "Tab #1"); m_tab.insertitem(2, "Tab #2"); 21 22 스핀버튼컨트롤 (Spin Button Control) 스핀버튼컨트롤 = 업다운컨트롤 화살표가두개붙어있어서마우스클릭이나키보드로값을증감하는용도로사용 Edit Box 안에붙여서함께사용 Auto buddy 스타일을설정하고, 탭순서를테스트박스 스핀버튼순으로설정 스핀버튼컨트롤 스핀버튼컨트롤스타일 스핀버튼컨트롤 버디컨트롤 23 24
스핀버튼컨트롤클래스 범위설정과현재범위얻기 void CSpinButtonCtrl::SetRange (short nlower, short nupper); void CSpinButtonCtrl::GetRange (int &lower, int &upper); 위치설정과현재위치얻기 int CSpinButtonCtrl::SetPos (int npos); int CSpinButtonCtrl::GetPos (); 스핀버튼컨트롤클래스 숫자의진수변경 int CSpinButtonCtrl::SetBase (int nbase); 스핀버튼컨트롤통지메시지 마우스로조작하면 WM_VSCROLL 또는 WM_HSCROLL 메시지발생 버디설정 CWnd* CSpinButtonCtrl::SetBuddy (CWnd* pwndbuddy); 25 26 프로그레스컨트롤 (Progress Bar Control) 오랜시간이걸리는작업의진행상황을시각적으로표시하는용도로사용 프로그레스컨트롤 프로그레스컨트롤스타일 27 28
프로그레스컨트롤클래스 범위설정과현재범위얻기 void CProgressCtrl::SetRange (short nlower, short nupper); void CProgressCtrl::GetRange (int& nlower, int& nupper); 위치설정과현재위치얻기 슬라이더컨트롤 (Slider Control) 주어진범위의값이나비연속적인값을입력하고자할때사용 주어진범위안에서마우스를드래그함으로써값을증가, 감소할수있게하는컨트롤 int CProgressCtrl::SetPos (int npos); int CProgressCtrl::GetPos (); 위치값증감 int CProgressCtrl::OffsetPos (int npos); int CProgressCtrl::SetStep (int nstep); int CProgressCtrl::StepIt (); 29 30 슬라이더컨트롤클래스 Animate Control 범위설정과현재범위얻기 void CSliderCtrl::SetRange( int nmin, int nmax, BOOL bredraw = FALSE ); void CSliderCtrl::GetRange( int& nmin, int& nmax ) 위치설정과현재위치얻기 int CSliderCtrl::SetPos (int npos); int CSliderCtrl::GetPos (); 슬라이더컨트롤통지메시지 NM_CUSTOMDRAW 발생 31 AVI 동영상파일을재생하고제어하는데사용 ( 사운드지원안됨 ) CAnimateCtrl 주요메소드 리소스나파일로부터 AVI clip 열기 BOOL Open( LPCTSTR lpszfilename ); BOOL Open( UINT nid ); AVI clip 실행 BOOL Play( UINT nfrom, UINT nto, UINT nrep ); ACS_AUTOPLAY로스타일이설정된경우는불필요 AVI clip의지정한프레임으로이동하여보여줌 BOOL Seek( UINT nto ); AVI clip 의실행정지 BOOL Stop( ); AVI clip 닫기 BOOL Close( ); 32