Implementing CustomDraw into Your Project
Posted
by Sakthivel Sugumaran
on September 9th, 2002
Here are the steps you need to perform to use this utility:
- Create the MFC project with view as ListView.
- Apply styles to the view .cpp file.
- Add columns to the view .cpp file.
- Add the following line to the message map area of the view header(.h) file.
- Add the following line to the message map area of the view .cpp file.
- Add the OnCustomDraw function.
BOOL CMyListView::PreCreateWindow(CREATESTRUCT& cs)
{
//adding styles
cs.style |= LVS_REPORT;
return CListView::PreCreateWindow(cs);
}
void CMyListView::OnInitialUpdate()
{
CListView::OnInitialUpdate();
CListCtrl& ListCtrl = GetListCtrl();
//inserting 5 cols
ListCtrl.InsertColumn(0, "Col-1", LVCFMT_LEFT, 75);
ListCtrl.InsertColumn(1, "Col-2", LVCFMT_LEFT, 100);
ListCtrl.InsertColumn(2, "Col-3", LVCFMT_LEFT, 100);
ListCtrl.InsertColumn(3, "Col-4", LVCFMT_LEFT, 100);
ListCtrl.InsertColumn(4, "Col-5", LVCFMT_LEFT, 100);
//adding 10 items
CString item;
for(int i=0;i<10;i++)
{
item.Format("Item-%d",i);
ListCtrl.InsertItem(i,item);
}
}
afx_msg void OnCustomDraw(NMHDR* pNMHDR, LRESULT*
pResult);
ON_NOTIFY_REFLECT(NM_CUSTOMDRAW, OnCustomDraw)
void CMyListView::OnCustomDraw(NMHDR* pNMHDR,
LRESULT* pResult)
{
*pResult = 0;
COLORREF dwColourTxt = 0;
COLORREF dwColourBk = RGB(255, 255, 255);
LPNMLVCUSTOMDRAW lplvcd = (LPNMLVCUSTOMDRAW)pNMHDR;
switch(lplvcd->nmcd.dwDrawStage)
{
Case CDDS_PREPAINT:
{
*pResult = CDRF_NOTIFYITEMDRAW;
return;
}
// Modify item text and or background
Case CDDS_ITEMPREPAINT:
{
if(lplvcd->nmcd.dwItemSpec == 0)
{
dwColourTxt = RGB(255, 0, 0); // Red
}
else if(lplvcd->nmcd.dwItemSpec == 1)
{
dwColourTxt = RGB(0, 255, 0); // Green
}
Else
{
dwColourTxt = RGB(0, 0, 255); // Blue
}
lplvcd->clrText = dwColourTxt;
// If you want the sub items the same as
// the item, set *pResult to CDRF_NEWFONT
*pResult = CDRF_NOTIFYSUBITEMDRAW;
return;
}
// Modify sub item text and or background
case CDDS_SUBITEM | CDDS_PREPAINT | CDDS_ITEM:
{
// Ignore the first sub item; it is the item
// handled above
if(lplvcd->iSubItem != 0)
{
// First sub item
if(lplvcd->iSubItem == 1)
{
dwColourTxt = RGB(0, 127, 127);
// Pale blue
dwColourBk = RGB(255, 255, 255);
// White
}
// All sub items after the first
Else
{
dwColourTxt = RGB(255, 255, 255);
// White
if(lplvcd->nmcd.dwItemSpec == 0)
{
dwColourBk = RGB(255, 0, 102);
// Red
}
else if(lplvcd->nmcd.dwItemSpec == 1)
{
dwColourBk = RGB(204, 255, 153);
// Green
}
Else
{
dwColourBk = RGB(0, 102, 204);
// Blue
}
}
lplvcd->clrText = dwColourTxt;
lplvcd->clrTextBk = dwColourBk;
}
*pResult = CDRF_NEWFONT;
return;
}
}
}

Comments
Already existing article
Posted by Legacy on 09/10/2002 12:00amOriginally posted by: Thoemmi
Your solution is already covered by following article: http://codeguru.earthweb.com/listview/CustomDraw.shtml
Regards
ReplyThoemmi