有時候需要自定義CListCtrl 的柵格,比如其顏色,寬度等,但是如果通過自定義畫,宿主畫均不能達到這種效果,這個時候只能通過自己來處理WM_PAINT消息來達到這種效果了,代碼如下:
void CMyList::OnPaint()
{
CPaintDC dc(this); // device context for painting
// TODO: Add your message handler code here
// Do not call CListCtrl::OnPaint() for painting messages
CRect rect,txtRect;
CPoint mypoint;
int chunk_height=GetCountPerPage();
int nStart=GetTopIndex();
CPen pen(PS_SOLID,1,RGB(200,200,100));
dc.SelectObject(&pen);
CFont *ft=GetFont();
dc.SelectObject(ft);
dc.SetBkMode(TRANSPARENT);
CRect itemRC;
GetClientRect(itemRC);
for (int i=nStart;i<= (nStart + chunk_height);i++)
{
int nWidth=GetColumnWidth(0);
GetItemPosition(i,&mypoint);
rect.left = mypoint.x -2;
rect.top = mypoint.y-2;
rect.right = mypoint.x + nWidth -2;
GetItemPosition(i+1,&mypoint);
rect.bottom =mypoint.y;
dc.Rectangle(rect);
CString szText=GetItemText(i,0);
txtRect = rect;
txtRect.DeflateRect(6,0);
dc.DrawText(szText,txtRect,DT_LEFT );
rect.left = rect.right ;
nWidth=GetColumnWidth(1);
rect.right = rect.left + nWidth ;
dc.Rectangle(rect);
rect.left = rect.right ;
nWidth=GetColumnWidth(2);
rect.right = rect.left + nWidth ;
dc.Rectangle(rect);
rect.left = rect.right;
rect.right = itemRC.right;
dc.Rectangle(rect);
}
}
程序效果如下: