自绘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;
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· 没有源码,如何修改代码逻辑?
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 记一次.NET内存居高不下排查解决与启示
· DeepSeek 开源周回顾「GitHub 热点速览」
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了