티스토리 뷰

프로그래밍/MFC

CListCtrl 색상변경

에어버스 2019. 3. 20. 23:04

 

https://adnoctum.tistory.com/954

ListCtrl(ListCiew)를 다시 그릴때 NW_CUSTOMDRAW 메세지 핸들러를 작성해 주면 되는데, MSDN 에 그 설명이 약간은 모호하게 나와 있는데, 자세히 풀어 보자면 다음과 같다. 

환경 : Visual Studio 2010 on Windows 7  Professional SP1, English, 64-bit. 

ITEM 이나 subitem 이 그려질 때는 CUSTOMDRAW 구조체의 값 중 dwDrawStage 값이 CDDS_ITEMPREPAINT, 또는 CDDS_SUBITEM | CDDS_ITEMPREPAINT 값으로 설정이 된 후 custom draw message 가 호출이 된다. 따라서 이 값을 확인해서 작업을 하면 된다. 또한, 결과 중 LRESULT *pResult 값이 있는데, 만약 배경색이나 글자색 등 font 를 변경했을 때는 이 값에 그것을 알려 주는 값을 반환해 주어야 한다. 실제 코드를 보면 다음과 같다.

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
void CNormStateMonitorDlg::OnNMCustomdrawLstDir(NMHDR *pNMHDR, LRESULT *pResult)
{
    LPNMCUSTOMDRAW pNMCD = reinterpret_cast<LPNMCUSTOMDRAW>(pNMHDR);
    // TODO: Add your control notification handler code here
    if(pNMCD->dwDrawStage == CDDS_PREPAINT){
        *pResult = (LRESULT)CDRF_NOTIFYITEMDRAW; 
        return// 여기서 함수를 빠져 나가야 *pResult 값이 유지된다.
    }
 
    if(pNMCD->dwDrawStage == CDDS_ITEMPREPAINT){ 
 
        // 한 줄 (row) 가 그려질 때. 여기서만 설정하면 한 줄이 모두 동일하게 설정이 된다.
        if(_lstDir.GetItemData(pNMCD->dwItemSpec) == 0){//dwItemSpec 이 현재 그려지는 row index
            NMLVCUSTOMDRAW *pDraw = (NMLVCUSTOMDRAW*)(pNMHDR); 
             pDraw->clrText = 0xffffff
            pDraw->clrTextBk = 0x0
            //*pResult = (LRESULT)CDRF_NEWFONT;//여기서 나가면 sub-item 이 변경되지 않는다.
            *pResult = (LRESULT)CDRF_NOTIFYSUBITEMDRAW;//sub-item 을 변경하기 위해서. 
            return;//여기서 중단해야 *pResult 값이 유지된다.
        }
        else// When all matrices are already made. 
            NMLVCUSTOMDRAW *pDraw = (NMLVCUSTOMDRAW*)(pNMHDR); 
             pDraw->clrText = 0x0
            pDraw->clrTextBk = RGB(255,255,196);  
            *pResult = (LRESULT)CDRF_NEWFONT; 
            return
        }
    }
    else if(pNMCD->dwDrawStage == (CDDS_SUBITEM | CDDS_ITEMPREPAINT)){    
                // sub-item 이 그려지는 순간. 위에서 *pResult 에 CDRF_NOTIFYSUBITEMDRAW 를 해서 여기로
 
                // 올 수 있었던 것이다.
 
        NMLVCUSTOMDRAW *pDraw = (NMLVCUSTOMDRAW*)(pNMHDR); 
        CString text= _lstDir.GetItemText(pNMCD->dwItemSpec, pDraw->iSubItem); 
        if(text == _T("x")){
             pDraw->clrText = 0xff
            pDraw->clrTextBk = 0xf0fff0
        }
        else{
             pDraw->clrText = 0x0
            pDraw->clrTextBk = 0xffffff
        }
        
        *pResult = (LRESULT)CDRF_NEWFONT; // 이렇게 해야 설정한 대로 그려진다.
        return;
    } 
    *pResult = 0;
}
cs

 

기본적으로 list control 이 그려질 때 custom draw 가 여러 번 호출이 되고, 각각의 경우 어떠한 것을 그리려는 상황인지가 dwDrawStage 로 넘어 오는 것이다. 또한 dwItemSpec 이 현재 그려지는 row index 이다.  

공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2025/06   »
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30