CListCtrl的几点小用法

作者:京东瀚览家居官方旗舰店

 

1 //LVS_EX_INFOTIP具有鼠标提示当前单元格

ListView_SetExtendedListViewStyle(m_SkinList.m_hWnd, LVS_EX_FULLROWSELECT  | LVS_EX_HEADERDRAGDROP |LVS_EX_INFOTIP);

2//隐藏CListCtrl中自带的滚动条

InitializeFlatSB(m_SkinList.m_hWnd);

 FlatSB_EnableScrollBar(m_SkinList.m_hWnd, SB_BOTH, ESB_DISABLE_BOTH);

3.自绘进度条

void CMyListCtrl::OnCustomDraw(NMHDR* pNMHDR, LRESULT* pResult)
{


 *pResult = CDRF_DODEFAULT;
 CRect rcSubItem,rcPosItrm;
 LPNMLVCUSTOMDRAW lplvcd=(LPNMLVCUSTOMDRAW)pNMHDR;
 int iRow=lplvcd->nmcd.dwItemSpec;

 if (CDDS_PREPAINT == lplvcd->nmcd.dwDrawStage)
 {
  *pResult = CDRF_NOTIFYITEMDRAW;
  return;
 }else if (CDDS_ITEMPREPAINT == lplvcd->nmcd.dwDrawStage)
 {
  lplvcd->clrText=RGB(0,0,0);//黑色
  if(iRow %2)
  {
   lplvcd->clrTextBk = m_colRow2;
  }
  else
  {
   lplvcd->clrTextBk = m_colRow1;
  }
  *pResult = CDRF_NOTIFYSUBITEMDRAW;
  return;
 }else if ( (CDDS_SUBITEM | CDDS_ITEMPREPAINT  ) == lplvcd->nmcd.dwDrawStage )
 {
  *pResult = CDRF_NOTIFYPOSTPAINT;
  return;
 }else if ( (CDDS_SUBITEM | CDDS_ITEMPOSTPAINT  ) == lplvcd->nmcd.dwDrawStage )
 {

  if(lplvcd->iSubItem==m_ProgressColumn)
  {
   int Date=GetItemData(iRow);  //进度条的进度用SetItemData设置
     
   GetSubItemRect(iRow, m_ProgressColumn, LVIR_BOUNDS, rcSubItem);
   CDC *pDC=GetDC();
   CBrush brush0(RGB(255,255,255));
   rcSubItem.InflateRect(-5,-5);
   pDC->FillRect(&rcSubItem,&brush0);
   int iLength=rcSubItem.Width();
   int iPos=iLength * Date/100;
   rcPosItrm=rcSubItem;
   rcPosItrm.right=rcSubItem.left+iPos;
   CBrush brush1(RGB(0,255,255));
   pDC->FillRect(&rcPosItrm,&brush1);

   brush0.DeleteObject();
   brush1.DeleteObject();

  }
   
  // *pResult = CDRF_DODEFAULT;
   *pResult = CDRF_SKIPDEFAULT;
   return;
   
  }

4.使CListCtrl某列不能拖动,宽度固定

在class CSortHeaderCtrl : public CHeaderCtrl中加入虚函数

 virtual BOOL OnChildNotify(UINT msg, WPARAM wp, LPARAM lp, LRESULT* pRes);

//
// The header will send either HDN_BEGINTRACKA or HDN_BEGINTRACKW
// depending on how your parent list control responds to
// WM_NOTIFYFORMAT (default=HDN_BEGINTRACKW, Unicode). But if you're
// implementing a control to be used in any app, you should handle both
// notifications if you want it to work in either situation.
//
// Since OnChildNotify is virtual, all you have to do is override
// it--no need for message map entries to handle HDN_BEGINTRACKA/W.
//
BOOL CSortHeaderCtrl::OnChildNotify(UINT msg, WPARAM wp, LPARAM lp, LRESULT* pRes)
{
// NMHDR& nmh = *(NMHDR*)lp;
 HD_NOTIFY *phdn = (HD_NOTIFY *) lp;
 /*
 if ( (nmh.code == HDN_BEGINTRACKA || nmh.code == HDN_BEGINTRACKW ) ) {
 if (m_bLocked)
 return *pRes=TRUE; // eat message to disallow sizing
 }
 */
 if((phdn->hdr.code==HDN_BEGINTRACKA || phdn->hdr.code==HDN_BEGINTRACKW )
  && (phdn->iItem==2 ||phdn->iItem==3))
 {
   return *pRes=TRUE;
 }
// *pRes = 0;   //绝对不能调用此句,否则排序会导致程序死掉
 // otherwise, pass to header control for default processing
 return CHeaderCtrl::OnChildNotify(msg, wp, lp, pRes);
}

5.改变CListCtrl列表头的空白列的背景颜色

BOOL CSortHeaderCtrl::OnEraseBkgnd(CDC* pDC)
{

 COLORREF m_colRow1=RGB(164,190,138);
 CBrush brush0(m_colRow1);
 CRect rcRect;
 CSortHeaderCtrl::GetClientRect(rcRect);
 pDC->FillRect(&rcRect,&brush0);
 brush0.DeleteObject();
 // TODO: Add your message handler code here and/or call default

 return TRUE;
// return CHeaderCtrl::OnEraseBkgnd(pDC);
}

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值