Initial commit
This commit is contained in:
@@ -0,0 +1,768 @@
|
||||
//---------------------------------------------------------------------------
|
||||
|
||||
#include <vcl.h>
|
||||
#pragma hdrstop
|
||||
|
||||
#include "TransSkinScrollBar.h"
|
||||
//---------------------------------------------------------------------------
|
||||
#pragma package(smart_init)
|
||||
//---------------------------------------------------------------------------
|
||||
#include "BtnPanelUnit.h"
|
||||
#include <Vcl.Imaging.pngimage.hpp>
|
||||
#include <Vcl.Imaging.jpeg.hpp>
|
||||
#include <Vcl.Graphics.hpp>
|
||||
|
||||
#define PERIOD (200)
|
||||
|
||||
#define THUMB_MIN (14)
|
||||
#define THUMB_LEFT (1)
|
||||
|
||||
#define THUMB_GKG (Height-2*Width)
|
||||
#define THUMB_BKGLEFT (THUMB_GKG-THUMB_MIN)
|
||||
#define THUMB_WIDTH (Width-2*THUMB_LEFT)
|
||||
|
||||
#define H_THUMB_GKG (Width-2*Height)
|
||||
#define H_THUMB_BKGLEFT (H_THUMB_GKG-THUMB_MIN)
|
||||
#define H_THUMB_HEIGHT (Height-2*THUMB_LEFT)
|
||||
//---------------------------------------------------------------------------
|
||||
// ValidCtrCheck is used to assure that the components created do not have
|
||||
// any pure virtual functions.
|
||||
//
|
||||
static inline void ValidCtrCheck(TTransSkinScollBar *)
|
||||
{
|
||||
new TTransSkinScollBar(NULL);
|
||||
}
|
||||
//---------------------------------------------------------------------------
|
||||
//__fastcall TTransSkinScollBar::TTransSkinScollBar(TComponent* Owner)
|
||||
// : TPaintBox(Owner)
|
||||
//{
|
||||
//}
|
||||
////---------------------------------------------------------------------------
|
||||
namespace Transskinscrollbar
|
||||
{
|
||||
void __fastcall PACKAGE Register()
|
||||
{
|
||||
TComponentClass classes[1] = {__classid(TTransSkinScollBar)};
|
||||
RegisterComponents(L"Samples", classes, 0);
|
||||
}
|
||||
}
|
||||
//---------------------------------------------------------------------------
|
||||
__fastcall TTransSkinScollBar::TTransSkinScollBar(TComponent* Owner)
|
||||
: Vcl::Extctrls::TPanel(Owner)
|
||||
{
|
||||
ControlStyle >> csOpaque;
|
||||
DoubleBuffered = true;
|
||||
|
||||
Width = 14;
|
||||
Height = 80;
|
||||
|
||||
|
||||
FVertial = true;
|
||||
|
||||
FSBShow = 0;
|
||||
FSBTotal = 0;
|
||||
FSBTop = 0;
|
||||
|
||||
m_BtnBKG = new TBtnPanel(this);
|
||||
m_BtnBKG->OnPanelDrEvent = BtnPaintBKG;
|
||||
m_BtnBKG->OnPanelMsEvent = BtnEventBKG;
|
||||
m_BtnBKG->StateCount = 1;
|
||||
m_BtnBKG->Transparent = true;
|
||||
m_BtnBKG->TransparentValue = 150;
|
||||
|
||||
m_BtnThumb = new TBtnPanel(this);
|
||||
m_BtnThumb->OnPanelDrEvent = BtnPaintThumb;
|
||||
m_BtnThumb->OnPanelMsEvent = BtnEventThumb;
|
||||
m_BtnThumb->StateCount = 1;
|
||||
m_BtnThumb->Transparent = true;
|
||||
|
||||
m_BtnBKG->AddSubPanel(m_BtnThumb);
|
||||
|
||||
m_BtnLINEUp = new TBtnPanel(this);
|
||||
m_BtnLINEUp->OnPanelDrEvent = BtnPaintLINEUp;
|
||||
m_BtnLINEUp->OnPanelMsEvent = BtnEventLINEUp;
|
||||
m_BtnLINEUp->StateEnter = false;
|
||||
|
||||
m_BtnLINEDown = new TBtnPanel(this);
|
||||
m_BtnLINEDown->OnPanelDrEvent = BtnPaintLINEDown;
|
||||
m_BtnLINEDown->OnPanelMsEvent = BtnEventLINEDown;
|
||||
m_BtnLINEDown->StateEnter = false;
|
||||
|
||||
m_bLineUp = true;
|
||||
m_bPageUp = true;
|
||||
|
||||
m_pTTimerLine = new TTimer(this);
|
||||
m_pTTimerLine->Interval = PERIOD;
|
||||
m_pTTimerLine->OnTimer = EventTimerThumb;
|
||||
m_pTTimerLine->Enabled = false;
|
||||
|
||||
m_pTTimerPage = new TTimer(this);
|
||||
m_pTTimerPage->Interval = PERIOD;
|
||||
m_pTTimerPage->OnTimer = EventTimerThumb;
|
||||
m_pTTimerPage->Enabled = false;
|
||||
|
||||
FThumbWidth = -1;
|
||||
m_bPices = false;
|
||||
}
|
||||
//---------------------------------------------------------------------------
|
||||
|
||||
__fastcall TTransSkinScollBar::~TTransSkinScollBar(void)
|
||||
{
|
||||
SAFE_DELETE(m_BtnBKG)
|
||||
SAFE_DELETE(m_BtnThumb)
|
||||
SAFE_DELETE(m_BtnLINEUp)
|
||||
SAFE_DELETE(m_BtnLINEDown)
|
||||
SAFE_DELETE(m_pTTimerLine)
|
||||
SAFE_DELETE(m_pTTimerPage)
|
||||
}
|
||||
//---------------------------------------------------------------------------
|
||||
void __fastcall TTransSkinScollBar::SetSBTop(int nTop)
|
||||
{
|
||||
if(nTop<0)
|
||||
nTop = 0;
|
||||
else if(nTop>FSBTotal-FSBShow+1)
|
||||
nTop = nTop>FSBTotal-FSBShow+1;
|
||||
FSBTop = nTop;
|
||||
|
||||
TWMSize tmp;
|
||||
WMSize(tmp);
|
||||
}
|
||||
//---------------------------------------------------------------------------
|
||||
int __fastcall TTransSkinScollBar::CalThumbHeight()
|
||||
{
|
||||
if(FSBTotal==0) return 0;
|
||||
|
||||
int nHeight = 0;
|
||||
|
||||
if( -1==FThumbWidth ) {
|
||||
|
||||
int nPosS = THUMB_BKGLEFT;
|
||||
int nPosV = FSBTotal-FSBShow+1;
|
||||
|
||||
if( nPosS>=nPosV ) {
|
||||
|
||||
int nLenPiece = nPosS/nPosV;
|
||||
if( 0!=nPosS%nPosV ) {
|
||||
nLenPiece += nPosS%nLenPiece;
|
||||
}
|
||||
|
||||
nHeight = nLenPiece;
|
||||
|
||||
if( THUMB_GKG/nPosV>=nHeight ) {
|
||||
int nLenPiece = THUMB_GKG/nPosV;
|
||||
if( 0!=THUMB_GKG%nPosV ) {
|
||||
nLenPiece += THUMB_GKG%nLenPiece;
|
||||
}
|
||||
nHeight = nLenPiece;
|
||||
m_bPices = true;
|
||||
}
|
||||
}
|
||||
|
||||
if( nHeight<THUMB_MIN ) {
|
||||
nHeight += THUMB_MIN;
|
||||
m_bPices = false;
|
||||
}else{
|
||||
m_bPices = true;
|
||||
}
|
||||
}else{
|
||||
nHeight = FThumbWidth;
|
||||
m_bPices = true;
|
||||
}
|
||||
|
||||
return nHeight;
|
||||
}
|
||||
//---------------------------------------------------------------------------
|
||||
int __fastcall TTransSkinScollBar::CalThumbTop()
|
||||
{
|
||||
if(FSBTotal==0) return 0;
|
||||
|
||||
int nTop = Width;
|
||||
|
||||
if( m_bPices )
|
||||
nTop += THUMB_GKG*FSBTop/(FSBTotal-FSBShow+1);
|
||||
else
|
||||
nTop += THUMB_BKGLEFT*FSBTop/(FSBTotal-FSBShow+1);
|
||||
|
||||
|
||||
if( nTop+m_BtnThumb->Height>
|
||||
m_BtnBKG->Top+m_BtnBKG->Height )
|
||||
{
|
||||
nTop = m_BtnBKG->Top+m_BtnBKG->Height - CalThumbHeight();
|
||||
}
|
||||
|
||||
return nTop;
|
||||
}
|
||||
//---------------------------------------------------------------------------
|
||||
int __fastcall TTransSkinScollBar::CalThumbWidth()
|
||||
{
|
||||
if(FSBTotal==0) return 0;
|
||||
|
||||
int nWidth = 0;
|
||||
|
||||
if( -1==FThumbWidth ) {
|
||||
|
||||
int nPosS = H_THUMB_BKGLEFT;
|
||||
int nPosV = FSBTotal-FSBShow+1;
|
||||
|
||||
if( nPosS>=nPosV ) {
|
||||
|
||||
int nLenPiece = nPosS/nPosV;
|
||||
if( 0!=nPosS%nPosV ) {
|
||||
nLenPiece += nPosS%nLenPiece;
|
||||
}
|
||||
|
||||
nWidth = nLenPiece;
|
||||
|
||||
if( H_THUMB_GKG/nPosV>=nWidth ) {
|
||||
int nLenPiece = H_THUMB_GKG/nPosV;
|
||||
if( 0!=H_THUMB_GKG%nPosV ) {
|
||||
nLenPiece += H_THUMB_GKG%nLenPiece;
|
||||
}
|
||||
nWidth = nLenPiece;
|
||||
m_bPices = true;
|
||||
}
|
||||
}
|
||||
if( nWidth<THUMB_MIN ) {
|
||||
nWidth += THUMB_MIN;
|
||||
m_bPices = false;
|
||||
}else{
|
||||
m_bPices = true;
|
||||
}
|
||||
} else {
|
||||
nWidth = FThumbWidth;
|
||||
m_bPices = true;
|
||||
}
|
||||
|
||||
return nWidth;
|
||||
}
|
||||
//---------------------------------------------------------------------------
|
||||
int __fastcall TTransSkinScollBar::CalThumbLeft()
|
||||
{
|
||||
if(FSBTotal==0) return 0;
|
||||
|
||||
int nLeft = Height;
|
||||
if( m_bPices )
|
||||
nLeft += H_THUMB_GKG*FSBTop/(FSBTotal-FSBShow+1);
|
||||
else
|
||||
nLeft += H_THUMB_BKGLEFT*FSBTop/(FSBTotal-FSBShow+1);
|
||||
|
||||
if( nLeft+m_BtnThumb->Width>
|
||||
m_BtnBKG->Left+m_BtnBKG->Width )
|
||||
{
|
||||
nLeft = m_BtnBKG->Left+m_BtnBKG->Width - CalThumbWidth();
|
||||
}
|
||||
|
||||
return nLeft;
|
||||
}
|
||||
//---------------------------------------------------------------------------
|
||||
void __fastcall TTransSkinScollBar::SetVertial(bool bFVertial)
|
||||
{
|
||||
FVertial = bFVertial;
|
||||
|
||||
int WidthTmp = Width;
|
||||
int HeightTmp = Height;
|
||||
|
||||
if( FVertial ) {
|
||||
Width = (WidthTmp<HeightTmp)?WidthTmp:HeightTmp;
|
||||
Height = (WidthTmp<HeightTmp)?HeightTmp:WidthTmp;
|
||||
}else {
|
||||
Width = (WidthTmp>HeightTmp)?WidthTmp:HeightTmp;
|
||||
Height = (WidthTmp>HeightTmp)?HeightTmp:WidthTmp;
|
||||
}
|
||||
}
|
||||
//---------------------------------------------------------------------------
|
||||
void __fastcall TTransSkinScollBar::CreateWnd(void)
|
||||
{
|
||||
Vcl::Extctrls::TPanel::CreateWnd();
|
||||
|
||||
SetWindowLong( Parent->Handle, GWL_STYLE,
|
||||
GetWindowLong(Parent->Handle, GWL_STYLE) & ~WS_CLIPCHILDREN );
|
||||
|
||||
// SetBkMode( Canvas->Handle, TRANSPARENT);
|
||||
}
|
||||
//---------------------------------------------------------------------------
|
||||
void __fastcall TTransSkinScollBar::CreateParams(Controls::TCreateParams &Params)
|
||||
{
|
||||
Vcl::Extctrls::TPanel::CreateParams(Params);
|
||||
|
||||
Params.ExStyle |= WS_EX_TRANSPARENT;
|
||||
}
|
||||
//---------------------------------------------------------------------------
|
||||
void __fastcall TTransSkinScollBar::WMSize(Winapi::Messages::TWMSize &Message)
|
||||
{
|
||||
int WidthTmp = Width;
|
||||
int HeightTmp = Height;
|
||||
if( FVertial ) {
|
||||
Width = (WidthTmp<HeightTmp)?WidthTmp:HeightTmp;
|
||||
Height = (WidthTmp<HeightTmp)?HeightTmp:WidthTmp;
|
||||
}else {
|
||||
Width = (WidthTmp>HeightTmp)?WidthTmp:HeightTmp;
|
||||
Height = (WidthTmp>HeightTmp)?HeightTmp:WidthTmp;
|
||||
}
|
||||
|
||||
int nLeft, nTop, nWidth, nHeight;
|
||||
if( FVertial ) {
|
||||
|
||||
m_BtnBKG->Left = 0;
|
||||
m_BtnBKG->Top = Width;
|
||||
m_BtnBKG->Width = Width;
|
||||
m_BtnBKG->Height = Height-2*Width;
|
||||
|
||||
if(FSBTotal<=FSBShow) {
|
||||
nLeft = 0;
|
||||
nTop = 0;
|
||||
nWidth = 0;
|
||||
nHeight = 0;
|
||||
}else{
|
||||
nLeft = THUMB_LEFT;
|
||||
nTop = CalThumbTop();
|
||||
nWidth = THUMB_WIDTH;
|
||||
nHeight = CalThumbHeight();
|
||||
}
|
||||
m_BtnThumb->Left = nLeft;
|
||||
m_BtnThumb->Top = nTop;
|
||||
m_BtnThumb->Width = nWidth;
|
||||
m_BtnThumb->Height = nHeight;
|
||||
|
||||
|
||||
m_BtnLINEUp->Left = 0;
|
||||
m_BtnLINEUp->Top = 0;
|
||||
m_BtnLINEUp->Width = Width;
|
||||
m_BtnLINEUp->Height = Width;
|
||||
|
||||
m_BtnLINEDown->Left = 0;
|
||||
m_BtnLINEDown->Top = Height-Width;
|
||||
m_BtnLINEDown->Width = Width;
|
||||
m_BtnLINEDown->Height = Width;
|
||||
|
||||
}else{
|
||||
|
||||
m_BtnBKG->Left = Height;
|
||||
m_BtnBKG->Top = 0;
|
||||
m_BtnBKG->Width = Width-2*Height;
|
||||
m_BtnBKG->Height = Height;
|
||||
|
||||
if(FSBTotal<=FSBShow) {
|
||||
nLeft = 0;
|
||||
nTop = 0;
|
||||
nWidth = 0;
|
||||
nHeight = 0;
|
||||
}else{
|
||||
nLeft = CalThumbLeft();
|
||||
nTop = THUMB_LEFT;
|
||||
nWidth = CalThumbWidth();
|
||||
nHeight = H_THUMB_HEIGHT;
|
||||
}
|
||||
m_BtnThumb->Left = nLeft;
|
||||
m_BtnThumb->Top = nTop;
|
||||
m_BtnThumb->Width = nWidth;
|
||||
m_BtnThumb->Height = nHeight;
|
||||
|
||||
|
||||
m_BtnLINEUp->Left = 0;
|
||||
m_BtnLINEUp->Top = 0;
|
||||
m_BtnLINEUp->Width = Height;
|
||||
m_BtnLINEUp->Height = Height;
|
||||
|
||||
m_BtnLINEDown->Left = Width-Height;
|
||||
m_BtnLINEDown->Top = 0;
|
||||
m_BtnLINEDown->Width = Height;
|
||||
m_BtnLINEDown->Height = Height;
|
||||
}
|
||||
}
|
||||
//---------------------------------------------------------------------------
|
||||
void __fastcall TTransSkinScollBar::WMEraseBkgnd(TWMEraseBkgnd &Message)
|
||||
{
|
||||
Message.Result = true;
|
||||
}
|
||||
//---------------------------------------------------------------------------
|
||||
void __fastcall TTransSkinScollBar::AddThumbTop(int nAdd, bool bEraseBKG, TTimer *pTTimer)
|
||||
{
|
||||
int nTop = FSBTop;
|
||||
nTop += nAdd;
|
||||
|
||||
SetThumbTop(nTop, bEraseBKG, pTTimer);
|
||||
}
|
||||
//---------------------------------------------------------------------------
|
||||
void __fastcall TTransSkinScollBar::SetThumbTop(int nTop, bool bEraseBKG, TTimer *pTTimer)
|
||||
{
|
||||
if( nTop<0 ) {
|
||||
nTop = 0;
|
||||
if( pTTimer ) pTTimer->Enabled = false;
|
||||
}
|
||||
|
||||
if( nTop>=FSBTotal-FSBShow )
|
||||
{
|
||||
nTop = FSBTotal-FSBShow;
|
||||
|
||||
if( pTTimer ) pTTimer->Enabled = false;
|
||||
}
|
||||
|
||||
FSBTop = nTop;
|
||||
|
||||
if( FVertial )
|
||||
m_BtnThumb->Top = CalThumbTop();
|
||||
else
|
||||
m_BtnThumb->Left = CalThumbLeft();
|
||||
|
||||
if( FChangePos )
|
||||
FChangePos(this);
|
||||
|
||||
if( bEraseBKG ) {
|
||||
// m_BtnThumb->Update();
|
||||
// this->Invalidate();
|
||||
}
|
||||
}
|
||||
//---------------------------------------------------------------------------
|
||||
void __fastcall TTransSkinScollBar::EventTimerThumb(System::TObject* Sender)
|
||||
{
|
||||
int nAdd = 0;
|
||||
|
||||
if( Sender==(TObject *)m_pTTimerLine ) {
|
||||
|
||||
if( m_bLineUp ) {
|
||||
nAdd = -1;
|
||||
}else {
|
||||
nAdd = 1;
|
||||
}
|
||||
|
||||
}else if( Sender==(TObject *)m_pTTimerPage ) {
|
||||
|
||||
TPoint ptCur;
|
||||
GetCursorPos(&ptCur);
|
||||
ptCur = this->ScreenToClient(ptCur);
|
||||
|
||||
if( FVertial ) {
|
||||
|
||||
if( m_bPageUp ) {
|
||||
if( ptCur.Y>=m_BtnThumb->Top ) {
|
||||
m_pTTimerPage->Enabled = false;
|
||||
return;
|
||||
}
|
||||
nAdd = -FSBShow;
|
||||
|
||||
}else {
|
||||
if( ptCur.Y<=m_BtnThumb->Top+m_BtnThumb->Height ) {
|
||||
m_pTTimerPage->Enabled = false;
|
||||
return;
|
||||
}
|
||||
nAdd = FSBShow;
|
||||
}
|
||||
|
||||
}else {
|
||||
|
||||
if( m_bPageUp ) {
|
||||
if( ptCur.X>=m_BtnThumb->Left ) {
|
||||
m_pTTimerPage->Enabled = false;
|
||||
return;
|
||||
}
|
||||
nAdd = -FSBShow;
|
||||
}else {
|
||||
if( ptCur.X<=m_BtnThumb->Left+m_BtnThumb->Width ) {
|
||||
m_pTTimerPage->Enabled = false;
|
||||
return;
|
||||
}
|
||||
nAdd = FSBShow;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
AddThumbTop(nAdd, true, (TTimer *)Sender);
|
||||
}
|
||||
//---------------------------------------------------------------------------
|
||||
void __fastcall TTransSkinScollBar::BtnEventLINEUp(int MsTmp, int XPos, int YPos)
|
||||
{
|
||||
if( Ms_LDOWN==MsTmp ) {
|
||||
|
||||
m_bLineUp = true;
|
||||
AddThumbTop(-1, true);
|
||||
|
||||
m_pTTimerLine->Enabled = true;
|
||||
|
||||
}else if( Ms_LUP==MsTmp ) {
|
||||
|
||||
m_pTTimerLine->Enabled = false;
|
||||
|
||||
}else if( Ms_LLDOWN==MsTmp ) {
|
||||
|
||||
m_pTTimerLine->Enabled = false;
|
||||
AddThumbTop(-1, true);
|
||||
}
|
||||
}
|
||||
//---------------------------------------------------------------------------
|
||||
void __fastcall TTransSkinScollBar::BtnEventLINEDown(int MsTmp, int XPos, int YPos)
|
||||
{
|
||||
if( Ms_LDOWN==MsTmp ) {
|
||||
|
||||
m_bLineUp = false;
|
||||
AddThumbTop(1, true);
|
||||
|
||||
m_pTTimerLine->Enabled = true;
|
||||
|
||||
}else if( Ms_LUP==MsTmp ) {
|
||||
|
||||
m_pTTimerLine->Enabled = false;
|
||||
|
||||
}else if( Ms_LLDOWN==MsTmp ) {
|
||||
|
||||
m_pTTimerLine->Enabled = false;
|
||||
AddThumbTop(1, true);
|
||||
}
|
||||
}
|
||||
//---------------------------------------------------------------------------
|
||||
void __fastcall TTransSkinScollBar::BtnEventBKG(int MsTmp, int XPos, int YPos)
|
||||
{
|
||||
|
||||
TPoint pt = TPoint(XPos, YPos);
|
||||
TRect TRectUp, TRectDn;
|
||||
|
||||
if( Ms_LDOWN==MsTmp ||
|
||||
Ms_LLDOWN==MsTmp )
|
||||
{
|
||||
int nLeft, nTop, nWidth, nHeight;
|
||||
|
||||
if( FVertial ) {
|
||||
|
||||
nLeft = m_BtnBKG->Left;
|
||||
nTop = m_BtnBKG->Top;
|
||||
nWidth = m_BtnBKG->Width;
|
||||
nHeight = m_BtnThumb->Top - m_BtnBKG->Top;
|
||||
TRectUp = TRect(nLeft,
|
||||
nTop,
|
||||
nLeft+nWidth,
|
||||
nTop+nHeight);
|
||||
|
||||
nTop = m_BtnThumb->Top+m_BtnThumb->Height;
|
||||
nHeight = m_BtnBKG->Top+m_BtnBKG->Height-nTop;
|
||||
TRectDn = TRect(nLeft,
|
||||
nTop,
|
||||
nLeft+nWidth,
|
||||
nTop+nHeight);
|
||||
|
||||
}else {
|
||||
|
||||
nLeft = m_BtnBKG->Left;
|
||||
nTop = m_BtnBKG->Top;
|
||||
nWidth = m_BtnThumb->Left - m_BtnBKG->Left;
|
||||
nHeight = m_BtnBKG->Height;
|
||||
TRectUp = TRect(nLeft,
|
||||
nTop,
|
||||
nLeft+nWidth,
|
||||
nTop+nHeight);
|
||||
|
||||
nLeft = m_BtnThumb->Left+m_BtnThumb->Width;
|
||||
nWidth = m_BtnBKG->Left+m_BtnBKG->Width-nLeft;
|
||||
TRectDn = TRect(nLeft,
|
||||
nTop,
|
||||
nLeft+nWidth,
|
||||
nTop+nHeight);
|
||||
}
|
||||
}
|
||||
|
||||
if( Ms_LDOWN==MsTmp ) {
|
||||
|
||||
m_pTTimerPage->Enabled = true;
|
||||
if( PtInRect(TRectUp, pt ) ) {
|
||||
|
||||
m_bPageUp = true;
|
||||
if( 1==m_BtnBKG->StateCount )
|
||||
AddThumbTop(-FSBShow, true);
|
||||
else
|
||||
AddThumbTop(-FSBShow);
|
||||
|
||||
}else if( PtInRect(TRectDn, pt) ){
|
||||
|
||||
m_bPageUp = false;
|
||||
if( 1==m_BtnBKG->StateCount )
|
||||
AddThumbTop(FSBShow, true);
|
||||
else
|
||||
AddThumbTop(FSBShow);
|
||||
}
|
||||
}else if( Ms_LUP==MsTmp ) {
|
||||
|
||||
m_pTTimerPage->Enabled = false;
|
||||
|
||||
}else if( Ms_LLDOWN==MsTmp ) {
|
||||
|
||||
m_pTTimerPage->Enabled = false;
|
||||
if( PtInRect(TRectUp, pt ) ) {
|
||||
|
||||
m_bPageUp = true;
|
||||
AddThumbTop(-FSBShow, true);
|
||||
}else if( PtInRect(TRectDn, pt) ){
|
||||
|
||||
m_bPageUp = false;
|
||||
AddThumbTop(FSBShow, true);
|
||||
}
|
||||
}
|
||||
}
|
||||
//---------------------------------------------------------------------------
|
||||
void __fastcall TTransSkinScollBar::BtnEventThumb(int MsTmp, int XPos, int YPos)
|
||||
{
|
||||
static bool bBKGEnter = false;
|
||||
|
||||
if( Ms_DRAG==MsTmp ) {
|
||||
|
||||
int nCurPos, nAdd;
|
||||
if( FVertial ) {
|
||||
|
||||
nCurPos = YPos;
|
||||
nAdd =(FSBTotal-FSBShow+1)*(nCurPos-14)/THUMB_BKGLEFT;
|
||||
|
||||
}else {
|
||||
|
||||
nCurPos = XPos;
|
||||
nAdd =(FSBTotal-FSBShow+1)*(nCurPos-14)/H_THUMB_BKGLEFT;
|
||||
}
|
||||
|
||||
if( m_BtnBKG->StateEnter ) {
|
||||
m_BtnBKG->StateEnter = false;
|
||||
bBKGEnter = true;
|
||||
}
|
||||
SetThumbTop(nAdd, true);
|
||||
|
||||
}else if( Ms_LUP==MsTmp ){
|
||||
|
||||
if( bBKGEnter )
|
||||
m_BtnBKG->StateEnter = true;
|
||||
}
|
||||
}
|
||||
//---------------------------------------------------------------------------
|
||||
void __fastcall TTransSkinScollBar::Paint()
|
||||
{
|
||||
SetBkMode( Canvas->Handle, TRANSPARENT);
|
||||
StyleServices()->DrawParentBackground( Handle, Canvas->Handle, NULL, false);
|
||||
|
||||
HDC ParentDC = GetDC(Handle);
|
||||
//创建一个与显示设备兼容的内存设备
|
||||
HDC BufDC = CreateCompatibleDC(ParentDC);
|
||||
// 创建一个与显示设备兼容的位图
|
||||
HBITMAP BufBitmap = CreateCompatibleBitmap(Canvas->Handle, Width, Height);
|
||||
// 将设备与位图关联
|
||||
SelectObject(BufDC, BufBitmap);
|
||||
// CreateCompatibleBitmap创建位图后数据初始化为0,而RGB(0,0,0)则表示是黑色
|
||||
// 这里需要清除其黑色背景,使其变为透明
|
||||
PerformEraseBackground(this, BufDC);
|
||||
// 临时的Canvas,用来画图用,但它并不是必须的,可以直接使用GDI函数来画图
|
||||
TCanvas *CanvasDraw = new TCanvas();
|
||||
// 关联到内存设备
|
||||
CanvasDraw->Handle = BufDC;
|
||||
|
||||
//--------------------------------------
|
||||
SetBkMode( CanvasDraw->Handle, TRANSPARENT);
|
||||
StyleServices()->DrawParentBackground(
|
||||
Handle,
|
||||
CanvasDraw->Handle,
|
||||
NULL, false);
|
||||
m_BtnLINEUp->Paint(CanvasDraw);
|
||||
m_BtnBKG->Paint(CanvasDraw);
|
||||
m_BtnLINEDown->Paint(CanvasDraw);
|
||||
|
||||
// 一次性将内存图像数据覆盖过去,因为跳过了擦除背景过程,所以避免了闪烁的问题
|
||||
BitBlt(Canvas->Handle, 0, 0, ClientWidth, ClientHeight,
|
||||
CanvasDraw->Handle, 0, 0, SRCCOPY);
|
||||
// 释放资源
|
||||
DeleteDC(BufDC);
|
||||
DeleteObject(BufBitmap);
|
||||
SAFE_DELETE(CanvasDraw)
|
||||
}
|
||||
//---------------------------------------------------------------------------
|
||||
void __fastcall TTransSkinScollBar::BtnPaintLINEUp(int BsTmp, TRect TRectTmp, TCanvas *pCanvas)
|
||||
{
|
||||
int nLeft, nTop, nWidth, nHeight;
|
||||
|
||||
if( Bs_NORMAL==BsTmp ) {
|
||||
|
||||
pCanvas->Brush->Color = RGB(156, 156, 156);
|
||||
pCanvas->FillRect(TRectTmp);
|
||||
|
||||
pCanvas->Brush->Color = RGB(76, 76, 76);
|
||||
nLeft = TRectTmp.Width()/2/2+1;
|
||||
nTop = TRectTmp.Height()/2 - 1;
|
||||
nWidth = TRectTmp.Width()/2;
|
||||
nHeight = 2;
|
||||
pCanvas->FillRect(TRect(nLeft, nTop, nLeft+nWidth, nTop+nHeight));
|
||||
|
||||
}else if( Bs_DOWN==BsTmp ) {
|
||||
|
||||
pCanvas->Brush->Color = RGB(156, 156, 156);
|
||||
pCanvas->FillRect(TRectTmp);
|
||||
|
||||
pCanvas->Brush->Color = RGB(0, 0, 0);
|
||||
nLeft = TRectTmp.Width()/2/2+1;
|
||||
nTop = TRectTmp.Height()/2 - 1;
|
||||
nWidth = TRectTmp.Width()/2;
|
||||
nHeight = 2;
|
||||
pCanvas->FillRect(TRect(nLeft, nTop, nLeft+nWidth, nTop+nHeight));
|
||||
}
|
||||
}
|
||||
//---------------------------------------------------------------------------
|
||||
void __fastcall TTransSkinScollBar::BtnPaintLINEDown(int BsTmp, TRect TRectTmp, TCanvas *pCanvas)
|
||||
{
|
||||
int nLeft, nTop, nWidth, nHeight;
|
||||
|
||||
if( Bs_NORMAL==BsTmp ) {
|
||||
|
||||
pCanvas->Brush->Color = RGB(156, 156, 156);
|
||||
pCanvas->FillRect(TRectTmp);
|
||||
|
||||
pCanvas->Brush->Color = RGB(76, 76, 76);
|
||||
nLeft = TRectTmp.Left+TRectTmp.Width()/2/2;
|
||||
nTop = TRectTmp.Height()/2 - 1;
|
||||
nWidth = TRectTmp.Width()/2+1;
|
||||
nHeight = 2;
|
||||
TRect rtMinus = TRect(nLeft, nTop, nLeft+nWidth, nTop+nHeight);
|
||||
pCanvas->FillRect( rtMinus );
|
||||
|
||||
nLeft = TRectTmp.Left+TRectTmp.Width()/2-1;
|
||||
nTop = TRectTmp.Height()/2/2;
|
||||
nWidth = 2;
|
||||
nHeight = TRectTmp.Height()/2+1;
|
||||
pCanvas->FillRect(TRect(nLeft, nTop, nLeft+nWidth, nTop+nHeight));
|
||||
|
||||
}else if( Bs_DOWN==BsTmp ) {
|
||||
|
||||
pCanvas->Brush->Color = RGB(156, 156, 156);
|
||||
pCanvas->FillRect(TRectTmp);
|
||||
|
||||
pCanvas->Brush->Color = RGB(0, 0, 0);
|
||||
nLeft = TRectTmp.Left+TRectTmp.Width()/2/2;
|
||||
nTop = TRectTmp.Height()/2 - 1;
|
||||
nWidth = TRectTmp.Width()/2+1;
|
||||
nHeight = 2;
|
||||
TRect rtMinus = TRect(nLeft, nTop, nLeft+nWidth, nTop+nHeight);
|
||||
pCanvas->FillRect( rtMinus );
|
||||
|
||||
nLeft = TRectTmp.Left+TRectTmp.Width()/2-1;
|
||||
nTop = TRectTmp.Height()/2/2;
|
||||
nWidth = 2;
|
||||
nHeight = TRectTmp.Height()/2+1;
|
||||
pCanvas->FillRect(TRect(nLeft, nTop, nLeft+nWidth, nTop+nHeight));
|
||||
|
||||
}
|
||||
}
|
||||
//---------------------------------------------------------------------------
|
||||
void __fastcall TTransSkinScollBar::BtnPaintBKG(int BsTmp, TRect TRectTmp, TCanvas *pCanvas)
|
||||
{
|
||||
if( Bs_NORMAL==BsTmp ) {
|
||||
|
||||
pCanvas->Brush->Color = RGB(123, 123, 123);
|
||||
pCanvas->FillRect(TRectTmp);
|
||||
|
||||
pCanvas->Pen->Color = RGB(233, 233, 233);
|
||||
pCanvas->Rectangle(TRectTmp);
|
||||
}
|
||||
}
|
||||
//---------------------------------------------------------------------------
|
||||
void __fastcall TTransSkinScollBar::BtnPaintThumb(int BsTmp, TRect TRectTmp, TCanvas *pCanvas)
|
||||
{
|
||||
if( Bs_NORMAL==BsTmp ) {
|
||||
|
||||
TPngImage *png = new TPngImage();
|
||||
png->LoadFromResourceName(int(HInstance), L"round");
|
||||
pCanvas->StretchDraw(TRectTmp, png);
|
||||
SAFE_DELETE(png)
|
||||
}
|
||||
}
|
||||
//---------------------------------------------------------------------------
|
||||
|
||||
Reference in New Issue
Block a user