Posted on 2012-09-27 14:49
盛勝 閱讀(1120)
評論(0) 編輯 收藏 引用
原理:
(1)在NM_CUSTOMDRAW消息處理函數中根據 dwDrawStage 狀態來編寫不同的處理代碼
(2)主要是判斷 CDDS_ITEMPREPAINT 狀態
(3)不要在對話框資源管理器中設置CListCtrl控件的Owner draw fixed屬性,否則在Debug模式下報錯。
方法一,使用NM_CUSTOMDRAW消息映射
(1)聲明消息處理函數:afx_msg void OnCustomDrawList ( NMHDR* pNMHDR, LRESULT* pResult );
(1)手動添加消息映射:ON_NOTIFY_REFLECT ( NM_CUSTOMDRAW, OnCustomDrawList )
(2)編寫自繪消息處理函數
void CListCtrl2::OnCustomDrawList ( NMHDR* pNMHDR, LRESULT* pResult )
{
NMLVCUSTOMDRAW* pLVCD = reinterpret_cast<NMLVCUSTOMDRAW*>(pNMHDR);
*pResult = CDRF_DODEFAULT;
int rowIndex = static_cast<int>(pLVCD->nmcd.dwItemSpec);
if(pLVCD->nmcd.dwDrawStage == CDDS_PREPAINT)
{
*pResult = CDRF_NOTIFYITEMDRAW;
}
else if (pLVCD->nmcd.dwDrawStage == CDDS_ITEMPREPAINT)
{
*pResult = CDRF_NOTIFYSUBITEMDRAW;
}//畫項
else if (pLVCD->nmcd.dwDrawStage == (CDDS_ITEMPREPAINT | CDDS_SUBITEM))
{
int nitem = static_cast<int> (pLVCD->nmcd.dwItemSpec);
int nsubitem = pLVCD->iSubItem;
CDC* pDC = CDC::FromHandle(pLVCD->nmcd.hdc);
CString str;
CRect rect;
CSize msize;
UINT nFormat = DT_VCENTER | DT_SINGLELINE;
rect.left += 3; //調整自繪輸出位置
//get rect of the sub item which is going to paint
GetSubItemRect(nitem,nsubitem,LVIR_BOUNDS,rect);
//get the context is going to paint on the subitem
str = GetItemText(nitem,nsubitem);
//如果選中
if(LVIS_SELECTED == this->GetItemState(rowIndex,LVIS_SELECTED)) //判斷當前項是否選中
{
//所畫項是選中項
pDC->SetTextColor(#d93c28);//字體顏色,因該是白色
pDC->FillSolidRect(&rect,#567de4);//背景,深藍色吧,試試
}
else
{
pDC->SetTextColor(#000000);//字體顏色,因該是白色
pDC->FillSolidRect(&rect,#ffffff);//背景,深藍色吧,試試
}
msize = pDC->GetTextExtent(str);
pDC->DrawText(str, &rect, nFormat); //自繪輸出
*pResult = CDRF_SKIPDEFAULT;
}
}