改变List列表控件中的字体颜色和单元格背景颜色

时间:2021-07-04 19:44:21
1、首先应该有一个在对话框上的ListCtrl,并且ListCtrl属性为Report和多列模式
2、重载NM_CUSTOMDRAW消息,手工添加或者用wizard添加均可以。手工添加的格式如下:
     首先在消息映射中加入以下代码
     ON_NOTIFY(NM_CUSTOMDRAW, IDC_LIST_XXX, &CDlgXXX::OnNMCustomdrawXXX)
     在头文件中添加public:函数
     afx_msg void OnNMCustomdrawXXX( NMHDR*, LRESULT*)
     在cpp文件中添加该函数的实现
3、函数的一个具体实现如下:
     void CDlgXXX::OnNMCustomdrawXXX(NMHDR *pNMHDR, LRESULT *pResult)
{
     //LPNMCUSTOMDRAW pNMCD = reinterpret_cast<LPNMCUSTOMDRAW>(pNMHDR);
     NMLVCUSTOMDRAW* pLVCD = reinterpret_cast<NMLVCUSTOMDRAW*>(pNMHDR);
     // TODO: Add your control notification handler code here
     *pResult = CDRF_DODEFAULT;
     if ( CDDS_PREPAINT == pLVCD->nmcd.dwDrawStage )
     {
          *pResult = CDRF_NOTIFYITEMDRAW;         
     }
     else if ( CDDS_ITEMPREPAINT == pLVCD->nmcd.dwDrawStage )
     {
          // This is the notification message for an item. We'll request
          // notifications before each subitem's prepaint stage.
          *pResult = CDRF_NOTIFYSUBITEMDRAW;
     }
     else if ( (CDDS_ITEMPREPAINT | CDDS_SUBITEM) == pLVCD->nmcd.dwDrawStage)
     {
          CString str = m_ListRunState.GetItemText(pLVCD->nmcd.dwItemSpec,pLVCD->iSubItem);
          if (str[0] == '!')//警告信息或者错误信息
          {
               pLVCD->clrText = RGB(255,0,0);//显示为红色
               *pResult = CDRF_DODEFAULT;
               return;
          }
     }
}
本例子实现了对'!'开头的单元格字体以红色显示的功能。

不同MFC版本中的第一行类型转换可能不一样,为了处理单个单元格,将第一行注释,直接copy第二行,下面的判断语句也直接copy即可,具体含义可以查看msdn。
pLVCD->nmcd.dwItemSpec表示当前行的索引值
pLVCD->iSubItem表示当前列的索引值
pLVCD->clrText代表当前单元格字体的颜色
pLVCD->clrTextBk代表当前单元格的背景色