1、首先应该有一个在对话框上的ListCtrl,并且ListCtrl属性为Report和多列模式
//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;
}
}
}
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代表当前单元格的背景色