修改 CListCtrl 的标题栏颜色;重写 CListCtrl 标题栏

在网上找了好久都没结果,后终于找到一个全部贴图的,稍微修改下就变成时修改颜色的

1.要重写CListCtrl组件。
2.在里面增加修改标题栏的类。
3.在这个类里面重写OnPaint()函数。

 

---------------------------------------------------------------------------------
//重写的CListCtrl
class CMyListCtrl : public CListCtrl
{
public:
 CSkinHeaderCtrl m_SkinHeaderCtrl;
}


---------------------------------------------------------------------------------
//CListCtrl标题栏皮肤类(CSkinHeaderCtrl)中的OnPaint()函数
//在此可以全部贴图,或修改颜色
void CSkinHeaderCtrl::OnPaint()
{
 
 CPaintDC dc(this); // device context for painting
 CRect rect, rectItem, clientRect;
 GetClientRect(&rect);
 GetClientRect(&clientRect);
 CMemDC memDC(&dc, rect);
 CDC bitmapDC;
 bitmapDC.CreateCompatibleDC(&dc);

 memDC.FillSolidRect(&rect, m_BkColor);//CListCtrl标头背景颜色
 int nItems = GetItemCount();
 CBitmap bitmap;
 
 bitmap.LoadBitmap(IDB_COLUMNHEADER_SPAN);//标题中区分项目的线条,在资源中应该是一条1个像素宽的竖线图片

 for(int i = 0; i <nItems; i++)
 {
  
  TCHAR buf1[256];
  HD_ITEM hditem1;
  
  hditem1.mask = HDI_TEXT | HDI_FORMAT | HDI_ORDER;
  hditem1.pszText = buf1;
  hditem1.cchTextMax = 255;
  GetItem( i, &hditem1 );
  
  GetItemRect(i, &rect);
  CBitmap* pOldBitmap = NULL;
  
  //make sure we draw the start piece
  //on the first item so it has a left border

  //For the following items we will just use the
  //right border of the previous items as the left
  //border
  if(hditem1.iOrder==0)
  {
  }
  else
  {
   pOldBitmap = bitmapDC.SelectObject(&bitmap);
   memDC.BitBlt(rect.left,rect.top,1,20,&bitmapDC,0,0,SRCCOPY);
  }
  //draw the end piece of the column header
  if(i==nItems-1)
  {
   memDC.BitBlt((rect.right-0), 0, 2, 20, &bitmapDC,0,0,SRCCOPY);
   bitmapDC.SelectObject(pOldBitmap);
  }

  rectItem.DeflateRect(2,2,2,2);
  UINT uFormat = DT_SINGLELINE | DT_NOPREFIX | DT_TOP |DT_CENTER | DT_END_ELLIPSIS ;
  DRAWITEMSTRUCT DrawItemStruct;
  GetItemRect(i, &rectItem);
  
  
  DrawItemStruct.CtlType  = 100;
  DrawItemStruct.hDC   = dc.GetSafeHdc();
  DrawItemStruct.itemAction = ODA_DRAWENTIRE;
  DrawItemStruct.hwndItem  = GetSafeHwnd();
  DrawItemStruct.rcItem = rectItem;
  DrawItemStruct.itemID = i;
  DrawItem(&DrawItemStruct);

  
  CFont font;
  LOGFONT lf;
  memset(&lf, 0, sizeof(LOGFONT));
  lf.lfHeight = 12;
  strcpy(lf.lfFaceName, "宋体");
  font.CreateFontIndirect(&lf);

  CFont* def_font = memDC.SelectObject(&font);
  
  memDC.SetBkMode(TRANSPARENT);
  memDC.SetTextColor(RGB(0,0,255));//CListCtrlt头部字体颜色
  rectItem.DeflateRect(2,2,2,2);
  
  TCHAR buf[256];
  HD_ITEM hditem;
  
  hditem.mask = HDI_TEXT | HDI_FORMAT | HDI_ORDER;
  hditem.pszText = buf;
  hditem.cchTextMax = 255;
  GetItem( DrawItemStruct.itemID, &hditem );

  memDC.DrawText(buf, &rectItem, uFormat);
  memDC.SelectObject(def_font);
  font.DeleteObject();
 }

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值