![](https://t1.daumcdn.net/cfile/tistory/99621C3359B8CA3F30)
위 화면에서 보는 것과 같이 기존 CXListCtrl에 여러가지 기능을 수정하고 추가하였습니다.
개발 환경
- Window XP : Intel X86 32bit
- Visual Studio 2005 : MFC 8.0 Unmanaged C++
에디터, 콤보, 날짜 컨트롤은 소스를 보시면 알겠지만 컨트롤에 대한 오브젝트가 클래스의 Static 멤버변수로 되어있습니다.
그리고 기존 CXListCtrl에서는 GDI를 사용하여 컨트롤을 직접 그리는 형태였습니다.
기능 확장성을 위해 지금처럼 컨트롤을 올리는 형태로 쓰는게 좋을 것 같습니다.
(아직 CheckBox와 Progress는 GDI로 직접 그리는 형태입니다.)
그리고 헤더컨트롤에 스킨 이미지를 적용했습니다. 현재는 헤더의 shadow 이미지가 한개지만 추후에는 마우스 over/out/click에
따라 이미지를 세분화하는게 좋겠습니다.
다음은 간단하게 XListCtrl에 추가한 기능들을 나열해 보았습니다.
1. 헤더 컨트롤
- 헤더 높이 설정, 헤더 컬러 설정, 헤더 폰트 설정, 헤더 스킨 적용
2. 리스트 컨트롤
- 마우스 이동시 라인별 Animate 효과
- Underline 표시, Underline 컬러 설정
- 아이템 높이 설정, 폰트 설정
- Combobox, Editbox, Datebox Contorl 추가 및 기능 구현
- 소트 함수 추가
- 탭키로 다음 아이템 활성화 기능(Combox, Editbox, Datebox)
CXListCtrl에서 사용하는 클래스 목록은 다음과 같습니다.
- CXHearderCtrl
- CXComboBox
- CXEditBox
- CXSpinBox
- CXDateBox
다음은 CXListCtrl의 외부에서 호출가능한 주요 설정
함수입니다.
1. void EnableFocusRect(BOOL bFocusRect=TRUE)
- 아이템 선택시 포커스 컬러를 적용 유무 선택
2. void EnableResize(BOOL bResize=TRUE)
- 컬럼
리사이징 가능 유무 선택
3. void SetNoItemMsg(CString strNoItemMsg)
-
아이템이 없을 때 표시할 스트링 지정
3. void SetStatusColumn(int nSubItem)
- 상태
컬럼을 지정 : 상태컬럼의 Rect은 다르게 조정되어 표시됨
4. void SetBgColor(COLORREF crBg)
- 리스트 배경색
지정
5. void SetBgColorProgress(COLORREF crBg)
-
Progress 배경색 지정
6. void SetUnderLine(BOOL bUnderLine=TRUE)
-
언더라인 유무 지정
7. void SetColorUnderLine(COLORREF crUnderLine)
- 언더라인 컬러 지정
7. BOOL GetProgressColor(int nItem, int nSubItem, COLORREF &cf)
- Progress 컬러 획득
8. void GetDrawColors(int nItem, int nSubItem, COLORREF& colorText,
COLORREF& colorBkgnd)
- 해당 서브아이템의 텍스트, 배경
컬러 획득
9. BOOL DeleteAllItems()
- 모든 아이템
삭제
10. BOOL DeleteItem(int nItem);
- 해당 아이템
삭제
11. int GetCheckbox(int nItem, int nSubItem)
- 해당 서브아이템의 체크 박스 상태 획득
12. int GetColumns()
- 컬럼수 획득
13. int GetCurSel()
- 현재 선택된 첫번째 아이템
획득
14. DWORD GetItemData(int nItem)
- 해당 아이템의
Data 획득
15. BOOL GetSubItemRect(int iItem, int iSubItem, int nArea, CRect&
rect)
- 해당 서브아이템의 Rect 획득
16. int InsertItem(int nItem, LPCTSTR lpszItem)
- 아이템 추가: 아이템 텍스트 설정
17. int InsertItem(int nItem, LPCTSTR lpszItem, COLORREF crText, COLORREF
crBackground)
- 아이템 추가: 아이템 텍스트, 텍스트 컬러, 배경 컬러
설정
18. int InsertItem(const LVITEM* pItem);
-
아이템 추가: LVIITEM 구조체 이용
19. BOOL SetComboBox(int nItem, int nSubItem, BOOL bEnableCombo, CStringArray
*psa=NULL)
- 해당 서브아이템 콤보박스 유무 설정 : 콤보박스 유무,
String Array 설정
20. BOOL SetEditBox(...)
- 해당 서브아이템 에디트박스 유무
설정 : 에디트박스 유무, 숫자입력일 경우 최소/최대값 지정, 문자열 최대길이 지정, 에디트 Style지정
21. BOOL SetDateBox(...);
- 해당 서브아이템 Date박스
유무 설정 : Date박스 유무, Date Format, Date박스 Style 지정
22. BOOL SetProgress(int nItem, int nSubItem, BOOL bShowProgressText = TRUE,
LPCTSTR lpszProgressText = NULL)
- 해당 서브아이템을
Progress로 설정
23. BOOL SetCheckbox(int nItem, int nSubItem, int nCheckedState)
- 해당 서브아이템 체크박스 상태 설정
24. BOOL SetItemData(int nItem, DWORD dwData)
- 해당 아이템 Data 설정
25. BOOL SetItemImage(int nItem, int nSubItem, int nImage, BOOL
bImageCenter=FALSE)
- 해당 서브아이템 이미지 설정 : 이미지
인덱스, 이미지 센터 유무 설정
26. int GetItemImage(int nItem, int nSubItem)
- 해당 서브아이템의 이미지 인덱스 획득
27. BOOL SetItemText(int nItem, int nSubItem, LPCTSTR lpszText)
- 해당 서브아이템 텍스트 설정
28. BOOL SetItemText(int nItem, int nSubItem, LPCTSTR lpszText, COLORREF
crText, COLORREF crBackground)
- 해당 서브아이템 텍스트,
텍스트 컬러, 텍스트 배경 컬러 설정
29. BOOL SetItemTextColor(int nItem, int nSubItem, COLORREF crText, COLORREF
crBackground)
- 해당 서브아이템 텍스트 컬러, 텍스트 배경 컬러
설정
30. void UpdateDate(int nItem, int nSubItem, CTime time, COLORREF crText,
COLORREF crBackground)
- 해당 Date박스 업데이트 : 시간,
텍스트 컬러, 배경 컬러 설정
31. void UpdateProgress(int nItem, int nSubItem, int nPercent, COLORREF
crText, COLORREF crBar, CString ProgressText=_T(""))
- 해당 Progress 업데이트 : 퍼센트 값, 텍스트 컬러, Progress Bar 컬러
설정
32. virtual void Sort(int nSubItem, BOOL bSort)
- 해당 서브아이템을 기준으로 정렬: bSort = TRUE:내림차순,
FALSE:오름차순
33. void SetRowHeight(int nRowHeight)
- 아이템
높이 설정
34. void SetTextFont(CFont *pTextFont)
- 리스트
폰트 설정
다음은 CXListCtrl의 내부에서 호출되는 주요 함수 및
메시지입니다.
1. virtual BOOL OnNotify(WPARAM wParam, LPARAM lParam, LRESULT*
pResult)
- 컬럼 사이즈 조정 및 제어
2. void DrawProgress(...)
- 해당 서브아이템의
Progress 그리기 : OnCustomDraw에서 호출됨
-
OnCustomDraw는 현재 OnPaint 함수속에 Default()를 통해서 호출됨, OnPaint 메시지를 핸들링 한다면 꼭
Default()함수를 호출 해야 함
3. void DrawCheckbox(...)
- 해당 서브아이템의 체크 박스를
그림 : OnCustomDraw에서 호출됨
- OnCustomDraw는
현재 OnPaint 함수속에 Default()를 통해서 호출됨, OnPaint 메시지를 핸들링 한다면 꼭 Default()함수를 호출 해야
함
4. void DrawText(...)
- 해당 서브아이템의 텍스트 그리기 :
OnCustomDraw에서 호출됨
- OnCustomDraw는 현재
OnPaint 함수속에 Default()를 통해서 호출됨, OnPaint 메시지를 핸들링 한다면 꼭 Default()함수를 호출 해야
함
5. int DrawImage(int nItem, int nSubItem, CDC* pDC, COLORREF crText, COLORREF
crBkgnd, CRect rect, XLISTCTRLDATA *pXLCD)
- 해당
서브아이템의 이미지 그리기 : OnCustomDraw에서 호출됨
-
OnCustomDraw는 현재 OnPaint 함수속에 Default()를 통해서 호출됨, OnPaint 메시지를 핸들링 한다면 꼭
Default()함수를 호출 해야 함
6. void ShowComboBox(int nItem, int nSubItem)
- 해당 서브아이템의 콤보박스 생성 및 표시 : OnLButtonDown에서
호출됨
7. void ShowEditBox(int nItem, int nSubItem)
- 해당 서브아이템의 에디트박스 생성 및 표시 : OnLButtonDown에서
호출됨
8. void ShowDateBox(int nItem, int nSubItem)
- 해당 서브아이템의 Date박스 생성 및 표시 : OnLButtonDown에서
호출됨
9. afx_msg void OnCustomDraw(NMHDR* pNMHDR, LRESULT*
pResult)
- 실제 아이템을 그려주는 함수 : 생성/표시되는 컨트롤들은 텍스트만
표시
- 커스터마이징을 위한 메시지 함수
10. afx_msg void OnLButtonDown(UINT nFlags, CPoint point)
- 실제 컨트롤을 생성/표시하는 함수
11. afx_msg void OnPaint()
- 아이템이 없을 때 메시지를
표시
- OnCustomDraw 메시지 핸들링을 위해 Default함수를
호출함
- OnPaint 메시지를
추가하지 않았다면 OnCustonDraw 메시지는 내부적으로 호출됨
12. afx_msg BOOL OnEraseBkgnd(CDC* pDC)
-
배경을 그림
13. afx_msg LRESULT OnMouseLeave(WPARAM wParam, LPARAM lParam)
- 마우스 이동시 아이템 별 Animate 효과 처리를 위해 추가된 메시지
14. virtual BOOL PreTranslateMessage(MSG* pMsg);
- 마우스 이동시 아이템 별 Animate 효과 처리를 위해 추가된 함수
15. afx_msg LRESULT OnEditChange( WPARAM wParam, LPARAM lParam )
- 에디트 박스 종료 시 호출 됨 : 에디트 박스는 KillFocus될 때
종료됨
- 변경된 값을 해당 서브아이템에 저장
16. afx_msg LRESULT OnDateChange( WPARAM wParam, LPARAM lParam )
- Date 박스 종료 시 호출 됨 : Date 박스는 KillFocus될 때
종료됨
- 변경된 값을 해당 서브아이템에 저장
17. afx_msg LRESULT OnComboChange( WPARAM wParam, LPARAM lParam )
- Combo 박스 종료 시 호출 됨 : Combo 박스는 KillFocus될 때
종료됨
- 변경된 값을 해당 서브아이템에 저장
18. void SetLButtonDown(int nStartItem, int nStartSubItem)
- 특정 컨트롤에서 Tab키 이벤트에 의해 호출되는 함수로 다음 컨트롤로 활성화
시킴
19. static int CALLBACK CompareFunc(LPARAM lParam1, LPARAM
lParam2, LPARAM lParamSort);
- MFC 내부에서 호출되는
Sort를 위한 콜백 함수
MFC 클래스를 커스터마이징 하거나 분석하기 위해서는 C++의 가상함수와 각종 MFC 매크로에 대한 이해는
필수 입니다. MFC 프레임웍의 기본이 가상함수에 의한 설계이고 실제 그 설계자 본인들을 위해 CRuntimeClass 클래스 부터 각정
매크로를 선언, 정의하여 사용하도록 설계되었습니다.
우리가 이 클래스들을 커스터마이징하기 위해선 그 구조를 잘 이해하는 수 밖에 없습니다.
물론 MFC 떠나 다른 프레임웍을 분석한다고 해도 똑같겠죠.
가상테이블과 런타임클래스의 무거움을 버리고 WTL/STL로만 개발할 수 있다면 좋겠습니다.;;
기타 의문점이나 개선사항 있으면 리플 부탁드립니다.
Update history
---------------------------------------------------------------------------------------------
- 2008.04.13_19:40 : Date Control 기능 보완, Date Format으로 한글이 가능하도록 Unicode 프로젝트로 설정
SkinListCtrl.zip
출처 : http://heart4u.co.kr/tblog/489