Files
2026-06-13 00:05:19 +08:00

241 lines
6.3 KiB
C++

//---------------------------------------------------------------------------
#include <vcl.h>
#pragma hdrstop
#include "PanelDB.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
//---------------------------------------------------------------------------
__fastcall TPanelDB::TPanelDB(TComponent* AOwner)
: Vcl::Extctrls::TPanel(AOwner)
{
ParentColor = false;
Ctl3D = false;
ParentCtl3D = false;
DoubleBuffered = true;
m_bBkgDrawed = false;
m_bDBCreated = false;
m_BtnSel = m_BtnFocus = NULL;
m_bLeft = false;
m_CanvasDr = new TCanvas();
m_CanvasDr->Font->Name = "Tahoma";
m_BMPBkg = NULL;
}
//---------------------------------------------------------------------------
__fastcall TPanelDB::~TPanelDB()
{
SAFE_DELETE(m_BMPBkg)
BtnClear();
DCRelease();
SAFE_DELETE( m_CanvasDr );
}
//---------------------------------------------------------------------------
void __fastcall TPanelDB::CreateWnd(void)
{
Vcl::Extctrls::TPanel::CreateWnd();
}
//---------------------------------------------------------------------------
void __fastcall TPanelDB::CreateParams(Controls::TCreateParams &Params)
{
Vcl::Extctrls::TPanel::CreateParams(Params);
}
//---------------------------------------------------------------------------
void __fastcall TPanelDB::WMEraseBkgnd(TWMEraseBkgnd &Message)
{
Message.Result = true;
}
//---------------------------------------------------------------------------
void __fastcall TPanelDB::WMSize(Winapi::Messages::TWMSize &Message)
{
DCRelease();
DCInit();
}
//---------------------------------------------------------------------------
void __fastcall TPanelDB::DCInit()
{
m_BufDC = CreateCompatibleDC(Canvas->Handle);
m_BufBitmap = CreateCompatibleBitmap(Canvas->Handle, Width, Height);
SelectObject(m_BufDC, m_BufBitmap);
m_CanvasDr->Handle = m_BufDC;
m_bDBCreated = true;
}
//---------------------------------------------------------------------------
void __fastcall TPanelDB::DCRelease()
{
DeleteDC(m_BufDC);
DeleteObject(m_BufBitmap);
}
//---------------------------------------------------------------------------
void __fastcall TPanelDB::Paint()
{
if( !m_bDBCreated || !m_CanvasDr ) DCInit();
DoPaintBKG(m_CanvasDr);
if(FOnPaintBKG) FOnPaintBKG(this, m_CanvasDr, TRect(0, 0, Width, Height));
DoPaintLst(m_CanvasDr);
BitBlt(Canvas->Handle,
0, 0, Width, Height,
m_CanvasDr->Handle,
0, 0, SRCCOPY);
}
//---------------------------------------------------------------------------
void __fastcall TPanelDB::DoPaintBKG(TCanvas *pCanvas)
{
if( m_BMPBkg && Width==m_BMPBkg->Width && Height==m_BMPBkg->Height) {
StretchBlt(pCanvas->Handle, 0, 0, Width, Height,
m_BMPBkg->Canvas->Handle, 0, 0, Width, Height,
SRCCOPY);
}
else {
m_bBkgDrawed = false;
}
if( !m_bBkgDrawed) {
TRect rtThis = TRect(0, 0, Width, Height);
if( FOnDrawBKG ) {
FOnDrawBKG(this, pCanvas, rtThis);
}
else {
pCanvas->Brush->Color = this->Color;
pCanvas->FillRect(rtThis);
}
if( !m_BMPBkg ) {
m_BMPBkg = new TBitmap();
}
m_BMPBkg->SetSize(Width, Height);
StretchBlt(m_BMPBkg->Canvas->Handle, 0, 0,Width, Height,
pCanvas->Handle, 0, 0,Width, Height,
SRCCOPY);
m_bBkgDrawed = true;
}
}
//---------------------------------------------------------------------------
void __fastcall TPanelDB::DoPaintLst(TCanvas *pCanvas)
{
BTNLST::iterator lst_FBTNLST;
for( lst_FBTNLST = m_LstBtn.begin();
lst_FBTNLST != m_LstBtn.end();
lst_FBTNLST++ )
{
(*lst_FBTNLST)->Paint(pCanvas);
}
}
//---------------------------------------------------------------------------
void __fastcall TPanelDB::MouseDown(System::Uitypes::TMouseButton Button, System::Classes::TShiftState Shift, int X, int Y)
{
TPoint pt = TPoint(X, Y);
TStateBtn *pCur = GetBtnCur(pt);
NULL_RETURN(pCur)
if( Button==mbLeft ) {
m_bLeft = true;
BtnDown(pCur, pt);
}
else if( Button==mbRight ) {
m_bLeft = false;
BtnDown(pCur, pt, false);
}
m_BtnSel = pCur;
}
//---------------------------------------------------------------------------
void __fastcall TPanelDB::MouseUp(System::Uitypes::TMouseButton Button, System::Classes::TShiftState Shift, int X, int Y)
{
TPoint pt = TPoint(X, Y);
if( Button==mbLeft ) {
BtnUp(m_BtnFocus, m_BtnSel, pt);
}
else if( Button==mbRight ) {
BtnUp(m_BtnFocus, m_BtnSel, pt, false);
}
if( m_BtnFocus==m_BtnSel && m_BtnSel ) {
if( m_bLeft && m_BtnSel->OnClick )
m_BtnSel->OnClick(m_BtnSel);
else if( !m_bLeft && m_BtnSel->OnClickR )
m_BtnSel->OnClickR(m_BtnSel);
}
m_BtnSel = NULL;
}
//---------------------------------------------------------------------------
void __fastcall TPanelDB::MouseMove(System::Classes::TShiftState Shift, int X, int Y)
{
TPoint pt = TPoint(X, Y);
TStateBtn *pCur = GetBtnCur(pt);
BtnMove(pCur, pt);
m_BtnFocus = pCur;
}
//---------------------------------------------------------------------------
void __fastcall TPanelDB::CMMouseLeave(TMessage &Message)
{
BtnMove(NULL, TPoint(-1, -1));
BtnLeave();
m_BtnFocus = NULL;
m_BtnSel = NULL;
}
//---------------------------------------------------------------------------
void __fastcall TPanelDB::Click(void)
{
if( OnClick ) OnClick(this);
}
//---------------------------------------------------------------------------
void __fastcall TPanelDB::DblClick(void)
{
if( m_BtnFocus ) {
if( m_bLeft && m_BtnFocus->OnDBClick )
m_BtnFocus->OnDBClick(m_BtnFocus);
}
if( OnDblClick ) OnDblClick(this);
}
//---------------------------------------------------------------------------
TStateBtn* __fastcall TPanelDB::GetBtnCur(TPoint pt)
{
TStateBtn *pCur = 0;
BTNLST::iterator lst_FBTNLST;
for( lst_FBTNLST = m_LstBtn.begin();
lst_FBTNLST!= m_LstBtn.end();
lst_FBTNLST++ )
{
pCur = (*lst_FBTNLST)->GetSubCusor( pt );
if( pCur ) { break; }
}
return pCur;
}
//---------------------------------------------------------------------------
void __fastcall TPanelDB::BtnAdd(TStateBtn *pBtn)
{
m_LstBtn.push_back(pBtn);
}
//---------------------------------------------------------------------------
void __fastcall TPanelDB::BtnClear()
{
if(m_LstBtn.size()<=0) return;
BTNLST::iterator lst_FBTNLST;
for( lst_FBTNLST = m_LstBtn.begin();
lst_FBTNLST!= m_LstBtn.end();
lst_FBTNLST++ )
{
TStateBtn *pBtn = *lst_FBTNLST;
SAFE_DELETE(pBtn)
}
m_LstBtn.clear();
}
//---------------------------------------------------------------------------