松鼠的博客

导航

自绘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 2008-08-14 17:04  Xproer-松鼠  阅读(702)  评论(0)    收藏  举报