重绘CHeaderCtrl分割线

自己重绘分割线的那一部分,或者重绘整个背景


效果图:


// MyHeaderCtrl.cpp : 实现文件
//


#include "stdafx.h"
#include "MyHeaderCtrl.h"


// CMyHeaderCtrl


IMPLEMENT_DYNAMIC(CMyHeaderCtrl, CHeaderCtrl)


CMyHeaderCtrl::CMyHeaderCtrl()
{
m_rgb=RGB(180,180,255);
m_gradient=5;
m_height=1;


m_alignFormat=0;
m_fontHeight=15;
m_fontWidth=0;
m_fontColor=RGB(0,0,0);//black


m_leastWidth=30;
m_alignFormat=DT_CENTER|DT_SINGLELINE|DT_VCENTER;
}


CMyHeaderCtrl::~CMyHeaderCtrl()
{
}


BEGIN_MESSAGE_MAP(CMyHeaderCtrl, CHeaderCtrl)
ON_WM_PAINT()
ON_MESSAGE(HDM_LAYOUT,OnLayout)
END_MESSAGE_MAP()


// CMyHeaderCtrl 消息处理程序


void CMyHeaderCtrl::OnPaint()
{
CPaintDC dc(this); // device context for painting
CRect rcClient;
GetClientRect(&rcClient);


CDC memDC;
CBitmap bmp;
memDC.CreateCompatibleDC(&dc);


int i=0,itemCount=0;
CRect tRect;
CRect rect;
itemCount=GetItemCount();


bmp.CreateCompatibleBitmap(&dc,rcClient.Width(),rcClient.Height());
CBitmap *pOldBmp=memDC.SelectObject(&bmp);
memDC.FillSolidRect(0,0,rcClient.Width(),rcClient.Height(),RGB(200,200,200));

for(i=0;i<itemCount;i++)
{
//Drawimage
//get rect

GetItemRect(i,&tRect);
rect=tRect;
rect.left++;
DrawImage(&memDC,&rect);
//drawtext
rect.left++;


int sizeOfBuffer=1024;
TCHAR lpBuffer[1024];
HDITEM header;
header.mask = HDI_TEXT;
header.pszText = lpBuffer;
header.cchTextMax = sizeOfBuffer;


GetItem(i,&header);
CString str=lpBuffer;
DrawText(&memDC,rect,str);
}


CRect rc;
GetItemRect(itemCount-1,&rc);
rc.left=rc.right+1;
rc.right=rcClient.right;
//draw the rest
DrawImage(&memDC,rc);


dc.BitBlt(0,0,rcClient.Width(),rcClient.Height(),&memDC,0,0,SRCCOPY);
memDC.SelectObject(pOldBmp);
}


LRESULT CMyHeaderCtrl::OnLayout(WPARAM wParam,LPARAM lParam)
{
LRESULT lResult=CHeaderCtrl::DefWindowProc(HDM_LAYOUT,wParam,lParam);
HD_LAYOUT lay=*(HD_LAYOUT*)lParam;
RECT *pRc=lay.prc;
WINDOWPOS *pPos=lay.pwpos;


int nHeight=(pPos->cy)*m_height;
pPos->cy=nHeight;
pRc->top=nHeight;


return lResult;
}


void CMyHeaderCtrl::DrawImage(CDC *pDC,const CRect &rc)
{
CRect rect(rc);
int i;
int r,g,b;
r=GetRValue(m_rgb),g=GetGValue(m_rgb),b=GetBValue(m_rgb);
for(i=rc.top;i<rc.bottom;i++)
{
rect.bottom=rect.top+1;//draw one line each time
CBrush _brush;
_brush.CreateSolidBrush(RGB(r,g,b));
pDC->FillRect(&rect,&_brush);
r-=m_gradient,g-=m_gradient,b-=m_gradient;
r=r<0?0:r;g=g<0?0:g;b=b<0?0:b;
rect.top=rect.bottom;
}
}


void CMyHeaderCtrl::DrawText(CDC *pDC,const CRect &rc,CString &str)
{
CRect rect(rc);
pDC->SetBkMode(TRANSPARENT);
pDC->SetTextColor(m_fontColor);
//get data of font
CFont font;
font.CreateFont(m_fontHeight,m_fontWidth,0,0,0,false,false,0,0,0,0,0,0,NULL);
CFont *pOldFont=pDC->SelectObject(&font);
//caculate the offset
TEXTMETRIC tm;
pDC->GetTextMetrics(&tm);
int offset=(rect.Height()-tm.tmHeight)/2;
rect.OffsetRect(0,offset);
pDC->DrawText(str,&rect,m_alignFormat);
pDC->SelectObject(pOldFont);
}

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值