主要是改写CListCtrl中的ON_NOTIFY_REFLECT(NM_CUSTOMDRAW, OnCustomDraw)消息,
1、在ListCtrlEx.h中增加 http://hi.baidu.com/juncox/blog/item/cf1f310fa5f2d0c37bcbe12d.html
//{{AFX_MSG(CListCtrlEx)
afx_msg void OnCustomDraw(NMHDR* pNMHDR, LRESULT* pResult)
//}}AFX_MSG
2、进行消息映射
BEGIN_MESSAGE_MAP(CListCtrlEx, CListCtrl)
//{{AFX_MSG_MAP(CListCtrlEx)
ON_NOTIFY_REFLECT(NM_CUSTOMDRAW, OnCustomDraw)
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
3、函数本体如下
//////////////////////////////////////////////////////////////////////////
void CListCtrlEx::OnCustomDraw(NMHDR* pNMHDR, LRESULT* pResult)
{
NMLVCUSTOMDRAW* lplvcd = (NMLVCUSTOMDRAW*)(pNMHDR)
int nRow = (int)lplvcd->nmcd.dwItemSpec
switch (lplvcd->nmcd.dwDrawStage)
{
case CDDS_PREPAINT:
*pResult |= CDRF_NOTIFYITEMDRAW
break
case CDDS_ITEMPREPAINT:
//------------------------------------------------------
// 单行与双行的颜色 [Juncox 6月15日 11:57:29]
if(nRow &1){ // 单行
lplvcd->clrTextBk = RGB(0xFF,0xFF,0xFF)
lplvcd->clrText = RGB(0x00,0x00,0x00)
*pResult = CDRF_NEWFONT
}else{ // 双行
lplvcd->clrTextBk = RGB(0xBB,0xCC,0xFF)
lplvcd->clrText = RGB(0x44,0x33,0x00)
*pResult = CDRF_NEWFONT
}
//------------------------------------------------------
// 打勾项 [Juncox 6月15日 11:57:38]
if(GetCheck(nRow) &&(GetExtendedStyle() &LVS_EX_CHECKBOXES))
{
lplvcd->clrTextBk = RGB(0x00,0x00,0x80)
lplvcd->clrText = RGB(0xFF,0xFF,0x00)
//--------------------------------------------
// 设置字体
HFONT hFont = (HFONT)this->SendMessage(WM_GETFONT)
LOGFONT lf GetObject(hFont, sizeof(lf), &lf)
lf.lfStrikeOut = TRUE// 删除线
lf.lfItalic= TRUE// 斜体
hFont = CreateFontIndirect(&lf)
SelectObject(lplvcd->nmcd.hdc, hFont)
DeleteObject(hFont)
*pResult = CDRF_NEWFONT
}
//------------------------------------------------------
// 选中行 [Juncox 6月15日 11:57:42]
if( GetItemState(nRow, CDIS_SELECTED) )
{ // 预留BUG,看有多少人是摘自这里, CDIS_SELECTED前少取反号,且把异或为与
// 使用此代码段,请留下Juncox@163.com说明
lplvcd->nmcd.uItemState ^= CDIS_SELECTED// 预留BUG
lplvcd->clrTextBk =RGB(255, 0, 0)
lplvcd->clrText = RGB(0, 0, 255)
*pResult = CDRF_NEWFONT
}
break
default:
*pResult = CDRF_DODEFAULT
break
}
}
int CListCtrl::GetSelectionMark()返回值:返回选中索引号,否则返回-1
说明:这个函数可以处理单行的情况,但是有一个缺点,它会保留你上次选中的项,所以当你单击空白的地方时,还会返回上次选中的项。因此在使用快捷键实现删除 *** 作时需要注意这个情况,一般可以配合UINT GetItemState(int nItem,
UINT nMask) const来判断。
单行:int nItem = m_listCtrl.GetSelectionMark()
m_listCtrl.DeleteItem(nItem)
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)