◈ 개발 환경
1. OS 환경 : WindowXP
2. 사용 언어 : VC++ 6.0
3. 개발에 필요한 환경
1) StdAfx.h 파일에 #include <afxcview.h> 을 등록합니다.
2) ColorListCtrlView.cpp 파일에서 CView로 된 것들을 CListView로 변경합니다.
(ColorListCtrlView.h 파일에서 CView로 된 것들을 CListView로 변경)
◈ 프로그램 설명
1. 리스트컨트롤에 다섯개의 컬럼들이 있으며, 하나를 선택해도 한줄 모두 선택되도록 하였습니다.
2. 리스트컨트롤에 3~5번째 컬럼에 그라데이션 효과를 내어 색상을 주었습니다.
3. 1번째 열의 텍스트 색상은 빨간색, 2번째 열의 텍스트 색상은 녹색, 3번째 열부터는 파란색으로
설정했습니다.
◈ 중요 소스 설명
CListView에서 계승받은 ColorListCtrlVIew클래스에 OnCustomDraw()함수에서 리스트뷰에 출력될
void CColorListCtrlView::OnCustomDraw(NMHDR* pNMHDR, LRESULT* pResult)
{ *pResult = 0; COLORREF text_color = 0; COLORREF bg_color = RGB(255, 255, 255); LPNMLVCUSTOMDRAW lplvcd = (LPNMLVCUSTOMDRAW)pNMHDR; switch(lplvcd->nmcd.dwDrawStage){ case CDDS_PREPAINT: *pResult = CDRF_NOTIFYITEMDRAW; return; // 배경 혹은 텍스트를 수정한다. case CDDS_ITEMPREPAINT: // 1번째 열 빨간색, 2번째 열 녹색, 3번째 이하는 파란색의 글자색을 갖는다. if(lplvcd->nmcd.dwItemSpec == 0) text_color = RGB(255, 0, 0); else if(lplvcd->nmcd.dwItemSpec == 1) text_color = RGB(0, 255, 0); else text_color = RGB(0, 0, 255); lplvcd->clrText = text_color; *pResult = CDRF_NOTIFYITEMDRAW; return; // 서브 아이템의 배경 혹은 텍스트를 수정한다. case CDDS_SUBITEM | CDDS_PREPAINT | CDDS_ITEM: if(lplvcd->iSubItem != 0){ // 1번째 행이라면... if(lplvcd->iSubItem == 1){ text_color = RGB(0, 127, 127); bg_color = RGB(255, 255, 255); } else { text_color = RGB(255, 255, 255); if(lplvcd->nmcd.dwItemSpec == 0) bg_color = RGB(255, 0, 102); else if(lplvcd->nmcd.dwItemSpec == 1) bg_color = RGB(255, 0, 0); else bg_color = RGB(0, 102 - (int)lplvcd->nmcd.dwItemSpec, 204 - (int)lplvcd->nmcd.dwItemSpec*2); } lplvcd->clrText = text_color; lplvcd->clrTextBk = bg_color; } *pResult = CDRF_NEWFONT; return; } } |
◈ 참고 사항
Common Control이 4.7이상이 되면서 NM_CUSTOMDRAW라는 메시지가 생겼습니다.
특정 컨트롤(Header, List View, Toolbar …)들은 각 아이템을 그리기 전에 이 메시지를 부모 윈도우
에게 전달해 부모 윈도우가 직접 그릴 수 있는 기회를 제공합니다.
가장 쉽게 사용할 수 있는 예는 트리 컨트롤에서 텍스트의 색과 배경색상을 바꾸는 것입니다.
(리스트 컨트롤이나 NM_CUSTOMDRAW를 보내는 다른 컨트롤들도 거의 비슷한 방법을 사용)
'C & C++ > MFC 컨트롤' 카테고리의 다른 글
[Dialog] 캡션이나 아이콘을 깜박이게 하는 FlashWindow (0) | 2011.12.14 |
---|---|
[Dialog] 자동 사이즈 다이얼로그 (0) | 2011.12.14 |
[Static] Static 글자 색상, 크기 조절 (0) | 2011.11.24 |
다이얼로그 안으로 밖으로 (0) | 2011.11.21 |
툴바의 위치를 레지스트리에 저장하자 (0) | 2011.11.17 |
댓글