604
社区成员
发帖
与我相关
我的任务
分享
//---------------------------------------------------------------------------
void __fastcall TCrnTrackBar::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;//改变,再次触发重绘事件的时候,值为CDDS_PREPAINT
else
CrnCustomDraw(Message); //所以就不会执行到这里的重绘函数
}
__finally
{
m_pCanvas->Handle = NULL;
m_pCanvas->Unlock();
}
}
}
//------------------------------------改---------------------------------------
void __fastcall TMyTrackBar::CrnNotify(TWMNotify &Message)
{
LPNMCUSTOMDRAW lpDraw = (LPNMCUSTOMDRAW)Message.NMHdr;
if(lpDraw->hdr.code == NM_CUSTOMDRAW)
{
try
{
m_pCanvas->Lock();
m_pCanvas->Handle = lpDraw->hdc;
static bool bMouseState=false;
if(isMouseOn != bMouseState) //判断标志是否已改变;isMouseOn全局变量
{
bMouseState=isMouseOn ; //下面手动改变NMCUSTOMDRAW结构体的内容
lpDraw->dwDrawStage = CDDS_ITEMPREPAINT; //改变绘制状态,可以执行重绘函数
lpDraw->dwItemSpec = TBCD_THUMB; //绘制项为Thumb
lpDraw->uItemState = 0;
GetThumbRect(lpDraw->rc); //获得Thumb的区域,这个函数是我自己加的,下面有实现
}
if(!(lpDraw->dwDrawStage & CDDS_ITEM))
Message.Result = CDRF_NOTIFYITEMDRAW;
else
CrnCustomDraw(Message);
}
__finally
{
m_pCanvas->Handle = NULL;
m_pCanvas->Unlock();
}
}
}
//---------------------------------------------------------------------------
void __fastcall TMyTrackBar::GetThumbRect(RECT &rc)
{
SendMessage(this->Handle,TBM_GETTHUMBRECT,0,(LPARAM)&rc);
}
//---------------------------------------------------------------------------
#include <ComCtrls.hpp>
class PACKAGE TCrnTrackBar : 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 TCrnTrackBar(TComponent* Owner);
__fastcall ~TCrnTrackBar();
__published:
};
//---------------------------------------------------------------------------
__fastcall TCrnTrackBar::TCrnTrackBar(TComponent* Owner)
: TTrackBar(Owner)
{
m_pCanvas = new TCanvas;
}
//---------------------------------------------------------------------------
__fastcall TCrnTrackBar::~TCrnTrackBar()
{
delete m_pCanvas;
}
//---------------------------------------------------------------------------
void __fastcall TCrnTrackBar::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 TCrnTrackBar::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;
}
// 测试一哈
void __fastcall TForm1::Button1Click(TObject *Sender)
{
TCrnTrackBar *ctb = new TCrnTrackBar(this);
ctb->Parent = this;
ctb->Position = 2;
ctb->Left = 100;
ctb->Top = 100;
ctb->Show();
}