CListCtrl 中添加控制进度条 (2)

本文介绍了一种使用自定义绘制(CustomDraw)消息来改变列表视图(ListView)项显示效果的方法,通过调整颜色和绘制方式,实现了百分比类型的项特殊高亮显示的功能。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1。添加变量

 COLORREF m_clrText;
 COLORREF m_clrBkgnd;
 COLORREF m_clrHText;
 COLORREF m_clrHBkgnd;
 COLORREF m_clrPercent;
 COLORREF m_clrHPercent;

 

构造函数中初始化

 m_clrText = ::GetSysColor(COLOR_WINDOWTEXT);
 m_clrBkgnd = ::GetSysColor(COLOR_WINDOW);
 m_clrHText = ::GetSysColor(COLOR_HIGHLIGHTTEXT);
 m_clrHBkgnd = ::GetSysColor(COLOR_HIGHLIGHT);
 m_clrPercent = ::GetSysColor(COLOR_HIGHLIGHT);
 m_clrPercent=RGB(0,255,0);
 m_clrHPercent = ::GetSysColor(COLOR_BTNFACE);
// m_clrHPercent = RGB(255,0,0);

 

2.添加消息函数

 消息:ON_NOTIFY_REFLECT(NM_CUSTOMDRAW, OnCustomDraw)

 函数:

OnCustomDraw(NMHDR* pNMHDR, LRESULT* pResult)

{

LPNMLVCUSTOMDRAW lplvcd = (LPNMLVCUSTOMDRAW)pNMHDR;

    switch(lplvcd->nmcd.dwDrawStage)
 {
 case CDDS_PREPAINT:
    *pResult = CDRF_NOTIFYSUBITEMDRAW;
  break;
 case CDDS_ITEMPREPAINT:
      *pResult = CDRF_NOTIFYSUBITEMDRAW;
  break;
 case CDDS_ITEMPREPAINT|CDDS_SUBITEM:
  {
   int iCol = lplvcd->iSubItem;
   int iRow = lplvcd->nmcd.dwItemSpec;
   CString sItem = GetItemText(iRow, iCol);
   CRect rcItem;
   GetCellRect(iRow, iCol, LVIR_BOUNDS, rcItem);
   
   CDC *pDC= CDC::FromHandle(lplvcd->nmcd.hdc);
   int State = ListView_GetItemState(m_hWnd, iRow, LVIS_CUT|LVIS_SELECTED|LVIS_FOCUSED);

   pDC->FillSolidRect(&rcItem, (State &LVIS_SELECTED) ? m_clrHBkgnd : m_clrBkgnd);
   rcItem.DeflateRect(2, 1);
   if(sItem.Right(1) == '%')
   {
    pDC->Rectangle(rcItem);
    rcItem.DeflateRect(1, 1);
    CRect rcLeft, rcRight;
    rcLeft = rcRight = rcItem;
    rcLeft.right = rcLeft.left + MulDiv(atoi(sItem), rcItem.Width(), 100);
    rcRight.left = rcLeft.right;
    if((State &LVIS_SELECTED))
    {
    // pDC->FillSolidRect(rcLeft, m_clrHPercent);
    // pDC->FillSolidRect(rcRight, m_clrBkgnd);
     pDC->FillSolidRect(rcLeft, m_clrPercent);
     pDC->FillSolidRect(rcRight, m_clrBkgnd);

     pDC->SetTextColor(m_clrText);
     pDC->DrawText(sItem, rcItem, DT_VCENTER|DT_CENTER|DT_SINGLELINE);
    }
    else
    {
     pDC->FillSolidRect(rcLeft, m_clrPercent);
     pDC->FillSolidRect(rcRight, m_clrHPercent);
     CRgn rgn;
     rgn.CreateRectRgnIndirect(rcLeft);
     pDC->SelectClipRgn(&rgn);
     pDC->SetTextColor(m_clrBkgnd);
     pDC->DrawText(sItem, rcItem, DT_VCENTER|DT_CENTER|DT_SINGLELINE);

     rgn.SetRectRgn(rcRight);
     pDC->SelectClipRgn(&rgn);
     pDC->SetTextColor(m_clrText);
     pDC->DrawText(sItem, rcItem, DT_VCENTER|DT_CENTER|DT_SINGLELINE);
     pDC->SelectClipRgn(NULL);
    }
   }
   else
   {
    pDC->SetTextColor((State & LVIS_SELECTED) ? m_clrHText:m_clrText);
    pDC->DrawText(sItem, -1, &rcItem, DT_NOCLIP | DT_LEFT | DT_VCENTER);
   }
  }
  *pResult= CDRF_SKIPDEFAULT;
  break;
 }

}

 

3.添加函数

GetCellRect(int iRow, int iCol, int nArea, CRect &rect)

{

if(iCol)
  return GetSubItemRect(iRow, iCol, nArea, rect);
 
 if(GetHeaderCtrl()->GetItemCount() == 1)
  return GetItemRect(iRow, rect, nArea);
 
 CRect rCol1;
 if(!GetSubItemRect(iRow, 1, nArea, rCol1))
  return FALSE;
 
 if(!GetItemRect(iRow, rect, nArea))
  return FALSE;
 
 rect.right = rCol1.left;
 
 return TRUE;

}

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值