最近搜索了一下,大都是使用CListCtrl的派生类实现改变某一行颜色的功能。能不能直接处理呢?比如,基于对话框的界面上,放一个ListCtrl控件,通过增加消息映射的功能改变颜色呢?我看到网上有一个代码,如下:使用NM_CUSTOMDRAW消息映射(1)声明消息处理函数:afx_msg void OnCustomDrawList ( NMHDR* pNMHDR, LRESULT* pResult );(2)手动添加消息映射:ON_NOTIFY_REFLECT ( NM_CUSTOMDRAW, OnCustomDrawList )(3)编写自绘消息处理函数(4)触发消息
代码如下,好像没有问题,但就是不触发这个消息CMap< DWORD , DWORD& , COLORREF , COLORREF& > MapItemColor;//声明MapItemColor//消息映射
BEGIN_MESSAGE_MAP(CMyDlg, CDialog)
//{{AFX_MSG_MAP(CMyDlg)
ON_WM_SYSCOMMAND()
ON_WM_PAINT()
ON_WM_QUERYDRAGICON()
ON_BN_CLICKED(IDC_BUTTON_START, OnButtonStart)//想通过点击一个按钮直接触发NM_CUSTOMDRAW ON_NOTIFY_REFLECT(NM_CUSTOMDRAW, OnCustomDrawList)//这里 //}}AFX_MSG_MAP
END_MESSAGE_MAP()//{{AFX_MSG(CMyDlg)
virtual BOOL OnInitDialog();
afx_msg void OnSysCommand(UINT nID, LPARAM lParam);
afx_msg void OnPaint();
afx_msg HCURSOR OnQueryDragIcon();
afx_msg void OnButtonStart(); afx_msg void OnCustomDrawList( NMHDR* pNMHDR, LRESULT* pResult );//这里//}}AFX_MSG
void CMyDlg::OnCustomDrawList(NMHDR* pNMHDR, LRESULT* pResult)
{
    *pResult = CDRF_DODEFAULT;

    NMLVCUSTOMDRAW *lplvdr=(NMLVCUSTOMDRAW*)pNMHDR;
    NMCUSTOMDRAW &nmcd = lplvdr->nmcd;

    switch(lplvdr->nmcd.dwDrawStage)//判断状态
    {
    case CDDS_PREPAINT:
{
*pResult = CDRF_NOTIFYITEMDRAW;
break;
}
    case CDDS_ITEMPREPAINT://如果为画ITEM之前就要进行颜色的改变
{
COLORREF ItemColor;
if(MapItemColor.Lookup(nmcd.dwItemSpec, ItemColor))
                        //根据在SetItemColor(DWORD iItem, COLORREF color) 设置的//ITEM号和COLORREF 在摸板中查找,然后进行颜色赋值。
{
lplvdr->clrTextBk = ItemColor;
*pResult = CDRF_DODEFAULT;
}
break;
}
default:
break;
    }}void CMyDlg::SetItemColor(DWORD iItem, COLORREF color)
{
    MapItemColor.SetAt(iItem, color);//设置某行的颜色。

    m_ListCtrl.RedrawItems(iItem,iItem);//重新染色    UpdateWindow();
}为什么我在OnButtonStart();里面直接调用SetItemColor不行呢?void CEMailAssist2Dlg::OnButtonStart() 
{
// TODO: Add your control notification handler code here
SetItemColor(0, RGB(0, 255, 0));
}通过设置断点调试,发现根本就没有相应NM_CUSTOMDRAW这个消息,是什么原因啊?请朋友们指点一下,谢谢。

解决方案 »

  1.   

    http://blog.csdn.net/dylgsy/archive/2006/06/21/818550.aspx------------------------------------
    Posted By EasyCsdn1.0
      

  2.   

    自己发送NM_CUSTOMDRAW消息试试。
      

  3.   

    ON_NOTIFY_REFLECT是反射宏,是在控件类内部响应使用的,在父窗口响应要用ON_NOTIFY宏。
      

  4.   

    ON_NOTIFY(NM_CUSTOMDRAW, OnCustomDrawList)
      

  5.   

    http://topic.csdn.net/t/20050603/11/4056526.html
      

  6.   

    重新建了一个工程,可以用了,原来的那个工程使用了Skin++,估计是将消息映射给改变了,所以不能用。感谢给位!
      

  7.   

    ON_NOTIFY(NM_CUSTOMDRAW, OnCustomDrawList)