본문 바로가기

MS/MFC

리스트 컨트롤(CListCtrl) 안에 공용 컨트롤(CButton, CComboBox Control 등) 넣기


출처 : http://blog.naver.com/nanoteli?Redirect=Log&logNo=30109581803


1. 목적

수 많은 컨트롤을 줄을 맞춘 상태에서 다이얼로그 박스 안에 생성하고자 할 때

다이얼로그 박스의 공간이 부족할 수 있다.

따라서, 상하, 좌우 스크롤이 가능하고, 컨트롤들을 포함할 수 있는

별도의 컨트롤이 필요하다.

2. 구현

1) 위의 목적에 부합하는 컨트롤로서 리스트 컨트롤(CListCtrl)을 선택하고 파생시킨다.

2) LVS_REPORT, LVS_OWNERDRAWFIXED 속성을 주어 DrawItem 함수를 호출하도록 해준다.

3) DrawItem 함수를 재정의한다.

가. 고유 기능인 checkbox, icon을 표시할 수 있도록

나. text뿐만 아니라, controls을 표시할 수 있도록

다. 모든 controls을 표시하는 모드와 선택 행에만 controls을 표시하는 모드를 선택할 수 있도록

4) checkbox의 click 여부를 감시하기 위해 OnLButtonDown을 작성한다.

5) subitem의 배경색 및 text의 문자색을 설정해 주는 함수(_SetItemColor)를 작성한다.

6) 행의 높이를 설정해 주는 함수(_SetRowHeight)와 행의 높이를 가져오는 함수(_GetRowHeight)를 작성한다.

7) control을 추가해 주는 함수(_SetItemControl)와 추가된 control의 pointer를 가져오는 함수(_GetItemControl)를 작성한다.

8) LVM_SETITEMTEXT, LVM_INSERTCOLUMN, LVM_INSERTITEM, LVM_DELETECOLUMN, LVM_DELETEITEM,

그리고 LVM_DELETEALLITEMS message들을 처리해주는 OnWndMsg를 재정의한다.

9) mouse로 조정할 수 있는 column의 최소 너비를 설정해 주는 함수(_SetColumnWidthLowerLimit)와

그 값을 가져오는 함수(_GetColumnWidthLowerLimit)를 작성하고, 현재의 column 너비를 감시하기 위해 OnNotify를 재정의한다.

※ 최소 너비를 현재의 너비보다 더 크게 설정하면 Column 너비를 고정시킬 수 있다. 그러나, mouse를 고속으로 움직이면 무용지물이다.

10) 행의 높이, column의 너비, 그리고 column의 최소 너비를 자동으로 설정하는 함수(_AutoSize)를 작성한다.

11) 추가된 control에서 발생한 message를 parent window로 전달하기 위해 OnCmdMsg를 재정의한다. (updapted 2011-08-03)

3. 결과 (updapted 2011-08-03)

첨부 파일 : Common Controls.egg (Microsoft Visual Studio 2008, Windows XP or later)