设置ListCtrl列表控件其中某一行的字体和背景颜色,可以最终达到如下效果:
操作步骤如下所示:
1.先添加一个自定义消息
ON_NOTIFY ( NM_CUSTOMDRAW,IDC_V_H264_NALLIST, OnCustomdrawMyList )
注:在BEGIN_MESSAGE_MAP()和END_MESSAGE_MAP()之间。第二个参数是LIstCtrl的ID,第三个参数是消息响应函数。
2.下面是具体的函数。根据表格内容的不同,设置不同的背景颜色。
比如:“NAL负载类型”为SLICE的时候,背景为青色;为SPS的时候,背景为黄色;为PPS的时候,背景为咖啡色。
//ListCtrl加颜色 void CSpecialVH264Dlg::OnCustomdrawMyList ( NMHDR* pNMHDR, LRESULT* pResult ) { //This code based on Michael Dunn's excellent article on //list control custom draw at http://www.codeproject.com/listctrl/lvcustomdraw.asp NMLVCUSTOMDRAW* pLVCD = reinterpret_cast<NMLVCUSTOMDRAW*>( pNMHDR ); // Take the default processing unless we set this to something else below. *pResult = CDRF_DODEFAULT; // First thing - check the draw stage. If it's the control's prepaint // stage, then tell Windows we want messages for every item. 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 ) { COLORREF clrNewTextColor, clrNewBkColor; int nItem = static_cast<int>( pLVCD->nmcd.dwItemSpec ); CString strTemp = m_vh264nallist.GetItemText(nItem,2); if(strcmp(strTemp,"SLICE")==0){ clrNewTextColor = RGB(0,0,0); //Set the text clrNewBkColor = RGB(0,255,255); //青色 } else if(strcmp(strTemp,"SPS")==0){ clrNewTextColor = RGB(0,0,0); //text clrNewBkColor = RGB(255,255,0); //黄色 } else if(strcmp(strTemp,"PPS")==0){ clrNewTextColor = RGB(0,0,0); //text clrNewBkColor = RGB(255,153,0); //咖啡色 }else if(strcmp(strTemp,"SEI")==0){ clrNewTextColor = RGB(0,0,0); //text clrNewBkColor = RGB(255,66,255); //粉红色 }else if(strcmp(strTemp,"IDR_SLICE")==0){ clrNewTextColor = RGB(0,0,0); //text clrNewBkColor = RGB(255,0,0); //红色 }else{ clrNewTextColor = RGB(0,0,0); //text clrNewBkColor = RGB(255,255,255); //白色 } pLVCD->clrText = clrNewTextColor; pLVCD->clrTextBk = clrNewBkColor; // Tell Windows to paint the control itself. *pResult = CDRF_DODEFAULT; } }