改變CListCtrl某行的顏色
阿新 • • 發佈:2018-12-22
指定改變CListCtrl中某一行的顏色,比如說剛新增進去的一行,讓它改變顏色,這樣記錄多了,容易看到自己剛剛加如的行,方便操作可檢視,也可以讓新增和修改的記錄顯示不一樣的顏色,方便的多了,VC自帶的沒有這種功能。
1.首先從CListCtrl 繼承一個類,命名為CXListCtrl
在標頭檔案中加摸板
CMap<DWORD, DWORD&, COLORREF, COLORREF&> MapItemColor;
好在這裡查詢你的修改的顏色。
2.自己寫個訊息對映,可能新增不上,要自己寫。
BEGIN_MESSAGE_MAP(CXListCtrl, CListCtrl) ON_NOTIFY_REFLECT(NM_CUSTOMDRAW, OnNMCustomdraw) // ON_WM_SIZE() END_MESSAGE_MAP()
OnNMCustomdraw 為實現函式。
3.寫OnNMCustomdraw函式。
void CXListCtrlNew::OnNMCustomdraw(NMHDR *pNMHDR, LRESULT *pResult) { // TODO: Add your control notification handler code here *pResult = CDRF_DODEFAULT; NMLVCUSTOMDRAW * lplvdr=(NMLVCUSTOMDRAW*)pNMHDR; NMCUSTOMDRAW &nmcd = lplvdr->nmcd; switch(lplvdr->nmcd.dwDrawStage)//判斷狀態 { case CDDS_PREPAINT: { *pResult = CDRF_NOTIFYITEMDRAW; break; } case CDDS_ITEMPREPAINT://如果為畫ITEM之前就要進行顏色的改變 { COLORREF ItemColor; if(MapItemColor.Lookup(nmcd.dwItemSpec, ItemColor)) // 根據在 SetItemColor(DWORD iItem, COLORREF color) 設定的 // ITEM號和COLORREF 在摸板中查詢,然後進行顏色賦值。 { //lplvdr->clrText = RGB(0,0,0);//ItemColor; lplvdr->clrTextBk = ItemColor; *pResult = CDRF_DODEFAULT; } } break; } }
4.修改指定一行的顏色。
void CXListCtrl::SetItemColor(DWORD iItem, COLORREF color) { // m_iCurrentItem = iItem; // m_CurrentColor = color; MapItemColor.SetAt(iItem, color);//設定某行的顏色。 this->RedrawItems(iItem, iItem);//重新染色 //this->SetCheck(iItem,1); this->SetFocus(); //設定焦點 UpdateWindow(); }
5.修改全部行的顏色。
void CXListCtrl::SetAllItemColor(DWORD iItem,COLORREF TextBkColor)
{
//INT_PTR ncount = this->GetItemCount();
if(iItem > 0)
{
for(DWORD numItem = 0; numItem < iItem ;numItem ++)
{
//iItem = i;
MapItemColor.SetAt(numItem, TextBkColor);
this->RedrawItems(numItem, numItem);
}
}
return;
}