Files
AccompanyCube/TransSkinScrollBar.cpp
2026-06-13 00:10:11 +08:00

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)
}
}
//---------------------------------------------------------------------------