ON_NOTIFY()的问题(请高手进)
(1)在头文件中定义:afx_msg void OnDrawColorForMyList( NMHDR *pNmHdr, LRESULT *pResult);
该函数用来实现当用户选中ListControl的某一行后,使其变为红色;
(2)在对应的CPP文件中完成OnDrawColorForMyList()与空间的绑定,现在有3个ListControl要使用到这个函数:
ON_NOTIFY( NM_CUSTOMDRAW, IDC_LIST_LOG, OnDrawColorForMyList)
ON_NOTIFY( NM_CUSTOMDRAW, IDC_LIST_USER_SET, OnDrawColorForMyList)
ON_NOTIFY( NM_CUSTOMDRAW, IDC_LIST_ACT, OnDrawColorForMyList)
(3)下面是OnDrawColorForMyList()的定义:
//改变IDC_LIST_ACT选中行的颜色
void CSysMaintDlg::OnDrawColorForMyList( NMHDR *pNmHdr, LRESULT *pResult )
{
NMLVCUSTOMDRAW* pLVCD = reinterpret_cast<NMLVCUSTOMDRAW*>( pNmHdr );
*pResult = CDRF_DODEFAULT;
if ( CDDS_PREPAINT == pLVCD->nmcd.dwDrawStage )
{
*pResult = CDRF_NOTIFYITEMDRAW;
}
else if ( CDDS_ITEMPREPAINT == pLVCD->nmcd.dwDrawStage )
{
*pResult = CDRF_NOTIFYSUBITEMDRAW;
}
else if ( (CDDS_ITEMPREPAINT | CDDS_SUBITEM) == pLVCD->nmcd.dwDrawStage )
{
COLORREF clrNewTextColor, clrNewBkColor;
int nItem = static_cast<int>( pLVCD->nmcd.dwItemSpec );
//选中行显示字体为红色,否则为黑色
if(m_list_act.m_nCurRow== nItem) //设置为红色
{
clrNewTextColor = RGB( 255, 0, 0 );
}
else //设置为黑色
{
clrNewTextColor = RGB( 0, 0, 0 );
}
//设置背景色
if( nItem%2 ==0 )
{
clrNewBkColor = RGB( 240, 240, 240 ); //偶数行背景色为灰色
}
else
{
clrNewBkColor = RGB( 255, 255, 255 ); //奇数行背景色为白色
}
pLVCD->clrText = clrNewTextColor;
pLVCD->clrTextBk = clrNewBkColor;
*pResult = CDRF_DODEFAULT;
}
}
在这个函数中需要使用到ListControl的对象来获取当前选中的行,应该如何改写这个方法,可以使三个ListControl都使用这个函数呢?我不知道参数应该如何设置。
标注红色的地方是要用到的ListControl对象,应该怎样向这个函数传参数才能使这三个ListControl控件都能使用这个函数呢?
我问过一些高手,有的说自己定义一个类CMyListCtrl继承CListCtrl,在这个类里面添加 OnDrawColorForMyList()函数,然后给CListCtrl控件绑定一个CMyListCtrl对象,这样这个对象就可以使用这个函数实现自定义绘制。
但现在问题又来了:怎样绑定到ON_NOTIFY()呢,如果这样绑定:
CMyListCtrl m_list;
ON_NOTIFY( NM_CUSTOMDRAW, IDC_LIST_LOG, m_list.OnDrawColorForMyList)
肯定是不行的,那有没有什么办法解决这个问题呢?