重构CListCtrl实现改变单行背景颜色

三个接口函数,设置某一行的文字颜色(前景色)和背景色,使用说明都放在注释里了,创建的列表要使用该类声明,如:CColorListCtrl m_List;

那么使用时,直接通过m_List.SetItemColor(1,RGB(0,0,0),RGB(255,255,255));设置颜色即可

继承CListCtrl

  1. #pragma once

  2. #include "afxcmn.h"

  3. typedef struct

  4. {

  5. COLORREF colText;

  6. COLORREF colTextBk;

  7. }TEXT_BK;

  8.  
  9. class CColorListCtrl :public CListCtrl

  10. {

  11. public:

  12. CColorListCtrl();

  13. ~CColorListCtrl();

  14. public:

  15. void SetItemColor(DWORD iItem, COLORREF TextColor, COLORREF TextBkColor); //设置某一行的前景色和背景色

  16. void SetAllItemColor(DWORD iItem, COLORREF TextColor, COLORREF TextBkColor);//设置全部行的前景色和背景色

  17. void ClearColor(); //清除颜色映射表

  18. CMap<DWORD, DWORD&, TEXT_BK, TEXT_BK&> MapItemColor;

  19. protected:

  20. //{{AFX_MSG(CColorListCtrl)

  21. //}}AFX_MSG

  22. void CColorListCtrl::OnNMCustomdraw(NMHDR *pNMHDR, LRESULT *pResult);

  23. DECLARE_MESSAGE_MAP()

  24. };

  25.  

实现CListCtrl没有的功能

  1. #include "StdAfx.h"

  2. #include "ColorListCtrl.h"

  3. CColorListCtrl::CColorListCtrl()

  4. {

  5. }

  6. CColorListCtrl::~CColorListCtrl()

  7. {

  8. }

  9. BEGIN_MESSAGE_MAP(CColorListCtrl, CListCtrl)

  10. //{{AFX_MSG_MAP(CLineColorListCtrl)

  11. // NOTE - the ClassWizard will add and remove mapping macros here.

  12. //}}AFX_MSG_MAP

  13. ON_NOTIFY_REFLECT(NM_CUSTOMDRAW, OnNMCustomdraw)

  14. END_MESSAGE_MAP()

  15.  
  16. void CColorListCtrl::OnNMCustomdraw(NMHDR *pNMHDR, LRESULT *pResult)

  17. {

  18. // TODO: Add your control notification handler code here

  19. *pResult = CDRF_DODEFAULT;

  20. NMLVCUSTOMDRAW * lplvdr=(NMLVCUSTOMDRAW*)pNMHDR;

  21. NMCUSTOMDRAW &nmcd = lplvdr->nmcd;

  22. switch(lplvdr->nmcd.dwDrawStage)//判断状态

  23. {

  24. case CDDS_PREPAINT:

  25. {

  26. *pResult = CDRF_NOTIFYITEMDRAW;

  27. break;

  28. }

  29. case CDDS_ITEMPREPAINT://如果为画ITEM之前就要进行颜色的改变

  30. {

  31. TEXT_BK tb;

  32.  
  33. if(MapItemColor.Lookup(nmcd.dwItemSpec, tb))

  34. // 根据在 SetItemColor(DWORD iItem, COLORREF color) 设置的

  35. // ITEM号和COLORREF 在摸板中查找,然后进行颜色赋值。

  36. {

  37. lplvdr->clrText = tb.colText;

  38. lplvdr->clrTextBk = tb.colTextBk;

  39. *pResult = CDRF_DODEFAULT;

  40. }

  41. }

  42. break;

  43. }

  44. }

  45. void CColorListCtrl::ClearColor()

  46. {

  47. MapItemColor.RemoveAll();

  48. }

  49. void CColorListCtrl::SetItemColor(DWORD iItem, COLORREF TextColor, COLORREF TextBkColor)

  50. {

  51. TEXT_BK tb;

  52. tb.colText = TextColor;

  53. tb.colTextBk = TextBkColor;

  54.  
  55.  
  56. MapItemColor.SetAt(iItem, tb);//设置某行的颜色。

  57. this->RedrawItems(iItem, iItem);//重新染色

  58.  
  59. //this->SetCheck(iItem,1);

  60. this->SetFocus(); //设置焦点

  61. UpdateWindow();

  62. }

  63. void CColorListCtrl::SetAllItemColor(DWORD iItem, COLORREF TextColor, COLORREF TextBkColor)

  64. {

  65. //INT_PTR ncount = this->GetItemCount();

  66. TEXT_BK tb;

  67. tb.colText = TextColor;

  68. tb.colTextBk = TextBkColor;

  69.  
  70. if(iItem > 0)

  71. {

  72. for(DWORD numItem = 0; numItem < iItem ;numItem ++)

  73. {

  74. //iItem = i;

  75. MapItemColor.SetAt(numItem, tb);

  76. this->RedrawItems(numItem, numItem);

  77. }

  78. }

  79. return;

  80. }

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值