自绘TTrackBar
.h文件
class PACKAGE ttrackBar11 : public TTrackBar
{
private:
TCanvas *m_pCanvas;
protected:
void __fastcall CrnNotify(TWMNotify &Message);
void __fastcall CrnCustomDraw(TWMNotify &Message);
BEGIN_MESSAGE_MAP
VCL_MESSAGE_HANDLER(CN_NOTIFY, TWMNotify, CrnNotify);
END_MESSAGE_MAP(TWinControl);
public:
__fastcall ttrackBar11(TComponent* Owner);
__fastcall ~ttrackBar11();
__published:
};
.cpp文件
{
private:
TCanvas *m_pCanvas;
protected:
void __fastcall CrnNotify(TWMNotify &Message);
void __fastcall CrnCustomDraw(TWMNotify &Message);
BEGIN_MESSAGE_MAP
VCL_MESSAGE_HANDLER(CN_NOTIFY, TWMNotify, CrnNotify);
END_MESSAGE_MAP(TWinControl);
public:
__fastcall ttrackBar11(TComponent* Owner);
__fastcall ~ttrackBar11();
__published:
};
static inline void ValidCtrCheck(ttrackBar11 *)
{
new ttrackBar11(NULL);
}
//---------------------------------------------------------------------------
__fastcall ttrackBar11::ttrackBar11(TComponent* Owner)
: TTrackBar(Owner)
{
m_pCanvas = new TCanvas;
}
__fastcall ttrackBar11::~ttrackBar11()
{
delete m_pCanvas;
}
//---------------------------------------------------------------------------
namespace Trackbar11
{
void __fastcall PACKAGE Register()
{
TComponentClass classes[1] = {__classid(ttrackBar11)};
RegisterComponents("Samples", classes, 0);
}
}
//---------------------------------------------------------------------------
//---------------------------------------------------------------------------
void __fastcall ttrackBar11::CrnNotify(TWMNotify &Message)
{
LPNMCUSTOMDRAW lpDraw = (LPNMCUSTOMDRAW)Message.NMHdr;
if(lpDraw->hdr.code == NM_CUSTOMDRAW)
{
try
{
m_pCanvas->Lock();
m_pCanvas->Handle = lpDraw->hdc;
if(!(lpDraw->dwDrawStage & CDDS_ITEM))
Message.Result = CDRF_NOTIFYITEMDRAW;
else
CrnCustomDraw(Message);
}
__finally
{
m_pCanvas->Handle = NULL;
m_pCanvas->Unlock();
}
}
}
//---------------------------------------------------------------------------
void __fastcall ttrackBar11::CrnCustomDraw(TWMNotify &Message)
{
LPNMCUSTOMDRAW lpDraw = (LPNMCUSTOMDRAW)Message.NMHdr;
// 63 63 72 75 6E 2E 63 6F 6D
if(!(lpDraw->dwDrawStage & CDDS_PREPAINT))
return;
TRect rct = lpDraw->rc;
if(lpDraw->dwItemSpec == TBCD_THUMB) // 绘制滑块
{
m_pCanvas->Brush->Color = clRed;
m_pCanvas->FillRect(rct);
Frame3D(m_pCanvas, rct, clWhite, clGray, 1);
}
else if(lpDraw->dwItemSpec == TBCD_CHANNEL)
{
// ccrun注:可以自己搞个图片贴上去,效果更好
//m_pCanvas->CopyRect(rct, Form1->Image1->Canvas, Form1->Image1->ClientRect);
m_pCanvas->Brush->Color = clSkyBlue;
m_pCanvas->FillRect(rct);
char cc[] = {0x63, 0x63, 0x72, 0x75, 0x6E, 0x00 }; // a joke - -#
String strCaption = String().sprintf("%s TrackBar", cc);
int nLeftOffset = (rct.Width() - m_pCanvas->TextWidth(strCaption)) / 2;
int nTopOffset = (rct.Height() - m_pCanvas->TextHeight(strCaption)) / 2;
m_pCanvas->Font->Color = clBlue;
m_pCanvas->Font->Name = "宋体";
m_pCanvas->Font->Size = 9;
m_pCanvas->TextRect(rct, rct.Left + nLeftOffset, rct.Top + nTopOffset, strCaption);
DrawEdge(m_pCanvas->Handle, &rct, EDGE_SUNKEN, BF_RECT);
}
// 如果是绘制刻度就交给系统默认的处理
Message.Result = (lpDraw->dwItemSpec == TBCD_TICS)?
CDRF_DODEFAULT: CDRF_SKIPDEFAULT;
}
{
new ttrackBar11(NULL);
}
//---------------------------------------------------------------------------
__fastcall ttrackBar11::ttrackBar11(TComponent* Owner)
: TTrackBar(Owner)
{
m_pCanvas = new TCanvas;
}
__fastcall ttrackBar11::~ttrackBar11()
{
delete m_pCanvas;
}
//---------------------------------------------------------------------------
namespace Trackbar11
{
void __fastcall PACKAGE Register()
{
TComponentClass classes[1] = {__classid(ttrackBar11)};
RegisterComponents("Samples", classes, 0);
}
}
//---------------------------------------------------------------------------
//---------------------------------------------------------------------------
void __fastcall ttrackBar11::CrnNotify(TWMNotify &Message)
{
LPNMCUSTOMDRAW lpDraw = (LPNMCUSTOMDRAW)Message.NMHdr;
if(lpDraw->hdr.code == NM_CUSTOMDRAW)
{
try
{
m_pCanvas->Lock();
m_pCanvas->Handle = lpDraw->hdc;
if(!(lpDraw->dwDrawStage & CDDS_ITEM))
Message.Result = CDRF_NOTIFYITEMDRAW;
else
CrnCustomDraw(Message);
}
__finally
{
m_pCanvas->Handle = NULL;
m_pCanvas->Unlock();
}
}
}
//---------------------------------------------------------------------------
void __fastcall ttrackBar11::CrnCustomDraw(TWMNotify &Message)
{
LPNMCUSTOMDRAW lpDraw = (LPNMCUSTOMDRAW)Message.NMHdr;
// 63 63 72 75 6E 2E 63 6F 6D
if(!(lpDraw->dwDrawStage & CDDS_PREPAINT))
return;
TRect rct = lpDraw->rc;
if(lpDraw->dwItemSpec == TBCD_THUMB) // 绘制滑块
{
m_pCanvas->Brush->Color = clRed;
m_pCanvas->FillRect(rct);
Frame3D(m_pCanvas, rct, clWhite, clGray, 1);
}
else if(lpDraw->dwItemSpec == TBCD_CHANNEL)
{
// ccrun注:可以自己搞个图片贴上去,效果更好
//m_pCanvas->CopyRect(rct, Form1->Image1->Canvas, Form1->Image1->ClientRect);
m_pCanvas->Brush->Color = clSkyBlue;
m_pCanvas->FillRect(rct);
char cc[] = {0x63, 0x63, 0x72, 0x75, 0x6E, 0x00 }; // a joke - -#
String strCaption = String().sprintf("%s TrackBar", cc);
int nLeftOffset = (rct.Width() - m_pCanvas->TextWidth(strCaption)) / 2;
int nTopOffset = (rct.Height() - m_pCanvas->TextHeight(strCaption)) / 2;
m_pCanvas->Font->Color = clBlue;
m_pCanvas->Font->Name = "宋体";
m_pCanvas->Font->Size = 9;
m_pCanvas->TextRect(rct, rct.Left + nLeftOffset, rct.Top + nTopOffset, strCaption);
DrawEdge(m_pCanvas->Handle, &rct, EDGE_SUNKEN, BF_RECT);
}
// 如果是绘制刻度就交给系统默认的处理
Message.Result = (lpDraw->dwItemSpec == TBCD_TICS)?
CDRF_DODEFAULT: CDRF_SKIPDEFAULT;
}
浙公网安备 33010602011771号