- MFC에서 CListCtrl를 상속받아 CCustomListCtrl란 클래스를 만든다.
- CCustomListCtrl에서 DrawItem 함수를 재정의한다.
void CCustomListCtrl::DrawItem(LPDRAWITEMSTRUCT lpDrawItemStruct)
{
// 메모1 : 리스트뷰 옵션에서 Owner Draw Fixed 옵션을 활성화 시켜줘야 이 함수가 호출된다.
// 메모2 : 이함수는 레코드마다 호출되는 함수이다.
{
// 메모1 : 리스트뷰 옵션에서 Owner Draw Fixed 옵션을 활성화 시켜줘야 이 함수가 호출된다.
// 메모2 : 이함수는 레코드마다 호출되는 함수이다.
LONG prev_left = lpDrawItemStruct->rcItem.left;
LV_COLUMN column_data;
memset(&column_data, 0, sizeof(LV_COLUMN));
column_data.mask = LVCF_WIDTH | LVCF_FMT;
// 컬럼수 만큼 루프를 돌린다. for(int column_index = 0; GetColumn(column_index, &column_data); column_index++)
{
// 단계1 : 컬럼 RECT영역을 구한다. RECT tempRC;
{
tempRC.top = lpDrawItemStruct->rcItem.top;
tempRC.bottom = lpDrawItemStruct->rcItem.bottom;
tempRC.left = (prev_left);
tempRC.right = (prev_left += column_data.cx);
}
{
// 단계1 : 컬럼 RECT영역을 구한다. RECT tempRC;
{
tempRC.top = lpDrawItemStruct->rcItem.top;
tempRC.bottom = lpDrawItemStruct->rcItem.bottom;
tempRC.left = (prev_left);
tempRC.right = (prev_left += column_data.cx);
}
// 단계2 : 컬럼 데이터를 가져온다. LV_ITEM tempLI;
wchar_t buffer[256];
{
tempLI.mask = LVIF_TEXT | LVIF_PARAM;
tempLI.iItem = lpDrawItemStruct->itemID;
tempLI.iSubItem = column_index;
tempLI.pszText = buffer;
tempLI.cchTextMax = sizeof(buffer);
VERIFY(GetItem(&tempLI));
}
// 단계3 : DC를 확보한다. 모든지 할수 있다...이젠... CDC* pDC = CDC::FromHandle(lpDrawItemStruct->hDC);
{
// 메모 : 컬럼별로 커스터마이징~ switch(column_index)
{
case 0:
if(lpDrawItemStruct->itemState & ODS_SELECTED) // 선택되어질때 {
pDC->FillSolidRect(&tempRC, GetSysColor(COLOR_HIGHLIGHT));
pDC->SetTextColor(RGB(0, 0, 0));
pDC->DrawText(buffer, ustrlen(buffer), &tempRC, DT_LEFT);
}
else
{
pDC->FillSolidRect(&tempRC, RGB(255, 0, 0));
pDC->SetTextColor(RGB(0, 0, 0));
pDC->DrawText(buffer, ustrlen(buffer), &tempRC, DT_LEFT);
}
break;
case 1:
if(lpDrawItemStruct->itemState & ODS_SELECTED) // 선택되어질때 {
pDC->FillSolidRect(&tempRC, GetSysColor(COLOR_HIGHLIGHT));
pDC->SetTextColor(RGB(0, 0, 0));
pDC->DrawText(buffer, ustrlen(buffer), &tempRC, DT_LEFT);
}
else
{
pDC->FillSolidRect(&tempRC, RGB(0, 255, 0));
pDC->SetTextColor(RGB(125, 125, 125));
pDC->DrawText(buffer, ustrlen(buffer), &tempRC, DT_LEFT);
}
break;
if(lpDrawItemStruct->itemState & ODS_SELECTED) // 선택되어질때 {
pDC->FillSolidRect(&tempRC, GetSysColor(COLOR_HIGHLIGHT));
pDC->SetTextColor(RGB(0, 0, 0));
pDC->DrawText(buffer, ustrlen(buffer), &tempRC, DT_LEFT);
}
else
{
pDC->FillSolidRect(&tempRC, RGB(0, 255, 0));
pDC->SetTextColor(RGB(125, 125, 125));
pDC->DrawText(buffer, ustrlen(buffer), &tempRC, DT_LEFT);
}
break;
case 2:
if(lpDrawItemStruct->itemState & ODS_SELECTED) // 선택되어질때 {
pDC->FillSolidRect(&tempRC, GetSysColor(COLOR_HIGHLIGHT));
pDC->SetTextColor(RGB(0, 0, 0));
pDC->DrawText(buffer, ustrlen(buffer), &tempRC, DT_LEFT);
}
else
{
pDC->FillSolidRect(&tempRC, RGB(0, 0, 255));
pDC->SetTextColor(RGB(125, 125, 125));
pDC->DrawText(buffer, ustrlen(buffer), &tempRC, DT_LEFT);
}
break;
}
}
}
}
if(lpDrawItemStruct->itemState & ODS_SELECTED) // 선택되어질때 {
pDC->FillSolidRect(&tempRC, GetSysColor(COLOR_HIGHLIGHT));
pDC->SetTextColor(RGB(0, 0, 0));
pDC->DrawText(buffer, ustrlen(buffer), &tempRC, DT_LEFT);
}
else
{
pDC->FillSolidRect(&tempRC, RGB(0, 0, 255));
pDC->SetTextColor(RGB(125, 125, 125));
pDC->DrawText(buffer, ustrlen(buffer), &tempRC, DT_LEFT);
}
break;
}
}
}
}
댓글 없음 :
댓글 쓰기