松鼠的博客

导航

统计

自绘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文件
复制代码
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[] = {0x630x630x720x750x6E0x00 }; // 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;
}
复制代码

posted on   Xproer-松鼠  阅读(687)  评论(0编辑  收藏  举报

编辑推荐:
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· 没有源码,如何修改代码逻辑?
阅读排行:
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 记一次.NET内存居高不下排查解决与启示
· DeepSeek 开源周回顾「GitHub 热点速览」
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
点击右上角即可分享
微信分享提示