ListCtrl控件添加NM_CUSTOMDRAW消息
VC6没有ListCtrl控件的NM_CUSTOMDRAW属性,要自己添加,添加的步骤:
1、Message Map
BEGIN_MESSAGE_MAP( ... , ...)
//{{AFX_MSG_MAP(CCustomDrawDlg)
// ......
ON_NOTIFY(NM_CUSTOMDRAW, IDC_LIST, OnNMCustomdrawList)
// Add here
// IDC_LIST Specify the ID of the Ctrl
// OnNMCustomdrawCtrl Specify the function name
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
2、类的声明中添加
afx_msg void OnNMCustomdrawList(NMHDR *pNMHDR, LRESULT *pResult);
3、对应的cpp文件中添加定义
CListCtrl列表中,改写几列的文字颜色
在ListCtrl控件绘画前处理NM_CUSTOMDRAW消息。
告诉Windows我们想对每个Item处理NM_CUSTOMDRAW消息。当这些消息中的一个到来,告诉Windows我们想在每个SubItem的绘制前处理这个消息当这些消息到达,我们就为每个SubItem设置文字和背景的颜色。
- void CMyDlg::OnCustomdrawMyList ( NMHDR* pNMHDR, LRESULT* pResult )
- {
- 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;
- }
- elseif ( 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;
- }
- elseif ( (CDDS_ITEMPREPAINT | CDDS_SUBITEM) == pLVCD->nmcd.dwDrawStage )
- {
- // This is the prepaint stage for a subitem. Here's where we set the
- // item's text and background colors. Our return value will tell
- // Windows to draw the subitem itself, but it will use the new colors
- // we set here.
- // The text color will cycle through red, green, and light blue.
- // The background color will be light blue for column 0, red for
- // column 1, and black for column 2.
- COLORREF crText, crBkgnd;
- if ( 0 == pLVCD->iSubItem )
- {
- crText = RGB(255,0,0);
- crBkgnd = RGB(128,128,255);
- }
- elseif ( 1 == pLVCD->iSubItem )
- {
- crText = RGB(0,255,0);
- crBkgnd = RGB(255,0,0);
- }
- else
- {
- crText = RGB(128,128,255);
- crBkgnd = RGB(0,0,0);
- }
- // Store the colors back in the NMLVCUSTOMDRAW struct.
- pLVCD->clrText = crText;
- pLVCD->clrTextBk = crBkgnd;
- // Tell Windows to paint the control itself.
- *pResult = CDRF_DODEFAULT;
- }
- }
void CMyDlg::OnCustomdrawMyList ( NMHDR* pNMHDR, LRESULT* pResult )
{
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;
}
elseif ( 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;
}
elseif ( (CDDS_ITEMPREPAINT | CDDS_SUBITEM) == pLVCD->nmcd.dwDrawStage )
{
// This is the prepaint stage for a subitem. Here's where we set the
// item's text and background colors. Our return value will tell
// Windows to draw the subitem itself, but it will use the new colors
// we set here.
// The text color will cycle through red, green, and light blue.
// The background color will be light blue for column 0, red for
// column 1, and black for column 2.
COLORREF crText, crBkgnd;
if ( 0 == pLVCD->iSubItem )
{
crText = RGB(255,0,0);
crBkgnd = RGB(128,128,255);
}
elseif ( 1 == pLVCD->iSubItem )
{
crText = RGB(0,255,0);
crBkgnd = RGB(255,0,0);
}
else
{
crText = RGB(128,128,255);
crBkgnd = RGB(0,0,0);
}
// Store the colors back in the NMLVCUSTOMDRAW struct.
pLVCD->clrText = crText;
pLVCD->clrTextBk = crBkgnd;
// Tell Windows to paint the control itself.
*pResult = CDRF_DODEFAULT;
}
}
l clrTextBk的颜色只是针对每一列,在最后一列的右边那个区域颜色也还是和ListCtrl控件的背景颜色一致。l 当我重新看文档的时候,我注意到有一篇题目是“NM_CUSTOMDRAW (list view)”的文章,它说你可以在最开始的custom draw消息中返回CDRF_NOTIFYSUBITEMDRAW就可以处理SubItem了,而不需要在CDDS_ITEMPREPAINT绘画段中去指定CDRF_NOTIFYSUBITEMDRAW。但是我试了一下,发现这种方法并不起作用,你还是需要处理CDDS_ITEMPREPAINT段。