차근차근/C

mfc / listcontrol / xlistctrl

예쁜꽃이피었으면 2015. 7. 10. 13:07

listcontrol 에서 컬럼에 날짜와 이미지를 입력해야 해서 검색하다가 찾았다...

사용법은 모르겠지만 일단 저장


XListCtrl - A custom-draw list control with subitem formatting

http://www.codeproject.com/Articles/1796/XListCtrl-A-custom-draw-list-control-with-subitem


XListCtrl_demo.zip


CXListCtrl 빌드 하기,



[MFC] CXListCtrl에 스킨 및 여러가지 컨트롤 적용하기(추가) 

http://www.devpia.com/Maeul/Contents/Detail.aspx?BoardID=51&MAEULNO=20&no=8096&page=24


정철원 (bluejcw)  정철원님께 메시지 보내기정철원님을 내 주소록에 추가합니다.정철원님의 개인게시판 가기번호: 8096  / 읽음:13,813

 

 

1. Edit Control 이용한 아이템 수정 기능

 

 

2. Edit/Spin Control을 이용한 아이템 수정 기능

 

 

3. Combo Box Control을 이용한 아이템 수정 기능

 

 

4. Date Control을 이용한 아이템 수정기능

 

 

위 화면에서 보는 것과 같이 기존 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로만 개발할 수 있다면 좋겠습니다.;;

 

기타 의문점이나 개선사항 있으면 리플 부탁드립니다.

 

에디트 컨트롤 업데이트 후 이미지 링크가 깨지네요. 이상하게 업로드 파일을 지우니깐 이미지가 다시 잘 보이는 군요.

소스파일은 아래 링크를 참조하세요.

http://c2down.cyworld.co.kr/download?fid=64221926a1ad600247491947e32f251e&name=SkinListCtrl2.zip

 

Update history

---------------------------------------------------------------------------------------------

- 2008.04.13_19:40  : Date Control 기능 보완, Date Format으로 한글이 가능하도록 Unicode 프로젝트로 설정

 



[CXListCtrl] MFC ListCtrl 에 여러가지 컨트롤 넣기

http://noonipoony.tistory.com/m/post/147


41.zip

이거 바로 실행됨.

반응형