设置列表控件(ListCtrl)各种颜色

源码下载:ListCtrlColor.Zip

公开接口:

  1. //设置奇数行背景颜色  
  2. void SetOddItemBkColor(COLORREF color,BOOL bDraw);  
  3. //设置偶数行背景颜色  
  4. void SetEvenItemBkColor(COLORREF color,BOOL bDraw);  
  5. //设置热点行背景颜色  
  6. void SetHoverItemBkColor(COLORREF color,BOOL bDraw);  
  7. //设置选中行背景颜色  
  8. void SetSelectItemBkColor(COLORREF color,BOOL bDraw);  
  9. //设置奇数行文本颜色  
  10. void SetOddItemTextColor(COLORREF color,BOOL bDraw);  
  11. //设置偶数行文本颜色  
  12. void SetEvenItemTextColor(COLORREF color,BOOL bDraw);  
  13. //设置热点行文本颜色  
  14. void SetHoverItemTextColor(COLORREF color,BOOL bDraw);  
  15. //设置选中行文本颜色  
  16. void SetSelectItemTextColor(COLORREF color,BOOL bDraw);  
实现源码:

  1. // MyListCtrl.cpp : 实现文件  
  2.   
  3. IMPLEMENT_DYNAMIC(CMyListCtrl, CListCtrl)  
  4.   
  5. CMyListCtrl::CMyListCtrl()  
  6. {  
  7.     m_OddItemBkColor=0xFEF1E3;//奇数行背景颜色  
  8.     m_EvenItemBkColor=0xFFFFFF;//偶数行背景颜色  
  9.     m_HoverItemBkColor=0xFF;//热点行背景颜色  
  10.     m_SelectItemBkColor=GetSysColor(COLOR_HIGHLIGHT);//选中行背景颜色  
  11.     m_OddItemTextColor=GetSysColor(COLOR_BTNTEXT);//奇数行文本颜色  
  12.     m_EvenItemTextColor=GetSysColor(COLOR_BTNTEXT);//偶数行文本颜色  
  13.     m_HoverItemTextColor=GetSysColor(COLOR_HIGHLIGHTTEXT);//热点行文本颜色  
  14.     m_SelectItemTextColor=GetSysColor(COLOR_BTNTEXT);//选中行文本颜色  
  15.     m_nHoverIndex=-1;  
  16.     m_bTracking=FALSE;  
  17. }  
  18.   
  19. CMyListCtrl::~CMyListCtrl()  
  20. {  
  21. }  
  22.   
  23.   
  24. BEGIN_MESSAGE_MAP(CMyListCtrl, CListCtrl)  
  25.     ON_WM_MOUSEMOVE()  
  26.     ON_MESSAGE(WM_MOUSELEAVE,OnMouseLeave)  
  27.     ON_NOTIFY_REFLECT(NM_CUSTOMDRAW, &CMyListCtrl::OnNMCustomdraw)  
  28. END_MESSAGE_MAP()  
  29.   
  30.   
  31.   
  32. // CMyListCtrl 消息处理程序  
  33.   
  34.   
  35. void CMyListCtrl::SetOddItemBkColor(COLORREF color,BOOL bDraw)//设置奇数行背景颜色  
  36. {  
  37.     m_OddItemBkColor=color;  
  38.     if(bDraw)InvalidateRect(NULL);  
  39. }  
  40. void CMyListCtrl::SetEvenItemBkColor(COLORREF color,BOOL bDraw)//设置偶数行背景颜色  
  41. {  
  42.     m_EvenItemBkColor=color;  
  43.     if(bDraw)InvalidateRect(NULL);  
  44. }  
  45. void CMyListCtrl::SetHoverItemBkColor(COLORREF color,BOOL bDraw)//设置热点行背景颜色  
  46. {  
  47.     m_HoverItemBkColor=color;  
  48.     if(bDraw)InvalidateRect(NULL);  
  49. }  
  50. void CMyListCtrl::SetSelectItemBkColor(COLORREF color,BOOL bDraw)//设置选中行背景颜色  
  51. {  
  52.     m_SelectItemBkColor=color;  
  53.     if(bDraw)InvalidateRect(NULL);  
  54. }  
  55. void CMyListCtrl::SetOddItemTextColor(COLORREF color,BOOL bDraw)//设置奇数行文本颜色  
  56. {  
  57.     m_OddItemTextColor=color;  
  58.     if(bDraw)InvalidateRect(NULL);  
  59. }  
  60. void CMyListCtrl::SetEvenItemTextColor(COLORREF color,BOOL bDraw)//设置偶数行文本颜色  
  61. {  
  62.     m_EvenItemTextColor=color;  
  63.     if(bDraw)InvalidateRect(NULL);  
  64. }  
  65. void CMyListCtrl::SetHoverItemTextColor(COLORREF color,BOOL bDraw)//设置热点行文本颜色  
  66. {  
  67.     m_HoverItemTextColor=color;  
  68.     if(bDraw)InvalidateRect(NULL);  
  69. }  
  70. void CMyListCtrl::SetSelectItemTextColor(COLORREF color,BOOL bDraw)//设置选中行文本颜色  
  71. {  
  72.     m_SelectItemTextColor=color;  
  73.     if(bDraw)InvalidateRect(NULL);  
  74. }  
  75.   
  76.   
  77. void CMyListCtrl::OnMouseMove(UINT nFlags, CPoint point)  
  78. {  
  79.     int nIndex=HitTest(point);  
  80.     if(nIndex!=m_nHoverIndex){  
  81.         int nOldIndex=m_nHoverIndex;  
  82.         m_nHoverIndex=nIndex;  
  83.         CRect rc;  
  84.         if(nOldIndex!=-1){  
  85.             GetItemRect(nOldIndex,&rc,LVIR_BOUNDS);  
  86.             InvalidateRect(&rc);  
  87.         }         
  88.         if(m_nHoverIndex!=-1){  
  89.             GetItemRect(m_nHoverIndex,&rc,LVIR_BOUNDS);  
  90.             InvalidateRect(&rc);  
  91.         }  
  92.     }  
  93.     //=====================================================  
  94.     if(!m_bTracking)   
  95.     {   
  96.         TRACKMOUSEEVENT   tme;   
  97.         tme.cbSize   =   sizeof(tme);   
  98.         tme.hwndTrack   =   m_hWnd;   
  99.         tme.dwFlags   =   TME_LEAVE;//   |   TME_HOVER;   
  100.         tme.dwHoverTime   =   1;   
  101.         m_bTracking   =   _TrackMouseEvent(&tme);   
  102.     }   
  103.     CListCtrl::OnMouseMove(nFlags, point);  
  104. }  
  105. LRESULT CMyListCtrl::OnMouseLeave(WPARAM wParam, LPARAM lParam)  
  106. {  
  107.     m_bTracking=FALSE;  
  108.       
  109.     if(m_nHoverIndex!=-1){  
  110.         CRect rc;  
  111.         GetItemRect(m_nHoverIndex,&rc,LVIR_BOUNDS);  
  112.         m_nHoverIndex=-1;  
  113.         InvalidateRect(&rc);  
  114.     }  
  115.     return 0;  
  116. }  
  117. void CMyListCtrl::OnNMCustomdraw(NMHDR *pNMHDR, LRESULT *pResult)  
  118. {  
  119.     LPNMLVCUSTOMDRAW pNMCD = reinterpret_cast<LPNMLVCUSTOMDRAW>(pNMHDR);  
  120.     *pResult = 0;  
  121.     int nItemIndex=pNMCD->nmcd.dwItemSpec;  
  122.     if (pNMCD->nmcd.dwDrawStage==CDDS_PREPAINT){  
  123.         *pResult = CDRF_NOTIFYITEMDRAW;  
  124.     }else{  
  125.         if(nItemIndex==m_nHoverIndex){ //热点行  
  126.             pNMCD->clrTextBk=m_HoverItemBkColor;  
  127.             pNMCD->clrText=m_HoverItemTextColor;  
  128.         }else if(GetItemState(nItemIndex,LVIS_SELECTED) == LVIS_SELECTED){ //选中行  
  129.             pNMCD->clrTextBk=m_SelectItemBkColor;  
  130.             pNMCD->clrText=pNMCD->clrFace=m_SelectItemTextColor;  
  131.             ::SetTextColor(pNMCD->nmcd.hdc,m_SelectItemTextColor);  
  132.         }else if(nItemIndex % 2==0){//偶数行 比如 0、2、4、6  
  133.             pNMCD->clrTextBk=m_EvenItemBkColor;  
  134.             pNMCD->clrText=m_EvenItemTextColor;  
  135.         }else{  //奇数行 比如 1、3、5、7  
  136.             pNMCD->clrTextBk=m_OddItemBkColor;  
  137.             pNMCD->clrText=m_OddItemTextColor;  
  138.         }  
  139.         *pResult = CDRF_NEWFONT;  
  140.     }  
  141. }  
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值