본문 바로가기
C & C++/MFC 컨트롤

리스트(List) 색상 변경 - 리스트

by izen8 2011. 12. 13.
반응형

개발 환경

 

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번째 열부터는 파란색으로

    설정했습니다.

 4. 1~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를 보내는 다른 컨트롤들도 거의 비슷한 방법을 사용)


반응형

댓글