MFC 设置ClistCtr 选中状态时的背景色

MFC CListCtrl 如何设置选中状态的背景色OnCustomDraw


问题:CListCtrl如何高亮选中一行 http://zhidao.baidu.com/question/100664911.html

扩展:单行、双行及完成状态的字体等等。。。

主要是改写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;
}
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值