769 lines
19 KiB
C++
769 lines
19 KiB
C++
//---------------------------------------------------------------------------
|
|
|
|
#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)
|
|
}
|
|
}
|
|
//---------------------------------------------------------------------------
|
|
|