//只能用于一行,多行的话你改改 void CtestDlg::OnNMKillfocusList(NMHDR *pNMHDR, LRESULT *pResult) { // TODO: 在此添加控件通知处理程序代码 i = m_DownLogListCtrl.GetSelectionMark(); m_DownLogListCtrl.SetItemState(i, LVIS_DROPHILITED, LVIS_DROPHILITED); *pResult = 0; } void CtestDlg::OnNMSetfocusList(NMHDR *pNMHDR, LRESULT *pResult) { // TODO: 在此添加控件通知处理程序代码 //UINT nState=m_DownLogListCtrl.GetItemState(i,LVIF_STATE); //nState&=!nState; m_DownLogListCtrl.SetItemState(i, FALSE, LVIF_STATE); *pResult = 0; } 指定改变listctrl中某一行的颜色2007-02-15 15:50:51| 分类: vc.net | 标签: |字号大中小 订阅 指定改变listctrl中某一行的颜色,比如说刚添加进去的一行,让它改变颜色,这样记录多了,容易看到自己刚刚加如的行,方便操作可查看,也可以让添加和修改的记录显示不一样的颜色,方便的多了,VC自带的没有这种功能。 1. 首先从ClistCtrl 继承一个类,命名为CmyListCtrlNew 在头文件中加摸板 CMap<DWORD , DWORD& , COLORREF , COLORREF&> MapItemColor; 好在这里查找你的修改的颜色。 2. 自己写个消息映射,可能添加不上,要自己写。 BEGIN_MESSAGE_MAP(CMyListCtrlNew, CListCtrl) ON_NOTIFY_REFLECT(NM_CUSTOMDRAW, OnNMCustomdraw) // ON_WM_SIZE() END_MESSAGE_MAP() OnNMCustomdraw 为实现函数。 3. 写OnNMCustomdraw函数。 void CMyListCtrlNew::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 CMyListCtrlNew::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 CMyListCtrlNew::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;
} |
|