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) 4. void SetBgColor(COLORREF crBg) 5. void SetBgColorProgress(COLORREF crBg) 6. void SetUnderLine(BOOL bUnderLine=TRUE) 7. void SetColorUnderLine(COLORREF crUnderLine) 7. BOOL GetProgressColor(int nItem, int nSubItem, COLORREF &cf) 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) 15. BOOL GetSubItemRect(int iItem, int iSubItem, int nArea, CRect& rect) 16. int InsertItem(int nItem, LPCTSTR lpszItem)
18. int InsertItem(const LVITEM* pItem); 19. BOOL SetComboBox(int nItem, int nSubItem, BOOL bEnableCombo, CStringArray *psa=NULL) 20. BOOL SetEditBox(...) 21. BOOL SetDateBox(...); 22. BOOL SetProgress(int nItem, int nSubItem, BOOL bShowProgressText = TRUE, LPCTSTR lpszProgressText = NULL) 23. BOOL SetCheckbox(int nItem, int nSubItem, int nCheckedState) 24. BOOL SetItemData(int nItem, DWORD dwData) 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) 31. void UpdateProgress(int nItem, int nSubItem, int nPercent, COLORREF crText, COLORREF crBar, CString ProgressText=_T("")) 32. virtual void Sort(int nSubItem, BOOL bSort) 33. void SetRowHeight(int nRowHeight) 34. void SetTextFont(CFont *pTextFont)
1. virtual BOOL OnNotify(WPARAM wParam, LPARAM lParam, LRESULT* pResult) 2. void DrawProgress(...) 3. void DrawCheckbox(...) 4. void DrawText(...) 5. int DrawImage(int nItem, int nSubItem, CDC* pDC, COLORREF crText, COLORREF crBkgnd, CRect rect, XLISTCTRLDATA *pXLCD) 6. void ShowComboBox(int nItem, int nSubItem) 7. void ShowEditBox(int nItem, int nSubItem) 8. void ShowDateBox(int nItem, int nSubItem) - 커스터마이징을 위한 메시지 함수
10. afx_msg void OnLButtonDown(UINT nFlags, CPoint point) 11. afx_msg void OnPaint() - OnCustomDraw 메시지 핸들링을 위해 Default함수를 호출함 12. afx_msg BOOL OnEraseBkgnd(CDC* pDC) 13. afx_msg LRESULT OnMouseLeave(WPARAM wParam, LPARAM lParam) 14. virtual BOOL PreTranslateMessage(MSG* pMsg); 15. afx_msg LRESULT OnEditChange( WPARAM wParam, LPARAM lParam ) 16. afx_msg LRESULT OnDateChange( WPARAM wParam, LPARAM lParam ) 17. afx_msg LRESULT OnComboChange( WPARAM wParam, LPARAM lParam ) 18. void SetLButtonDown(int nStartItem, int nStartSubItem) 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에 스킨 및 여러가지 컨트롤 적용하기|작성자 무장공비
댓글