Initial commit
This commit is contained in:
+196
@@ -0,0 +1,196 @@
|
||||
//---------------------------------------------------------------------------
|
||||
#include <vcl.h>
|
||||
#pragma hdrstop
|
||||
|
||||
#include "StateBtn.h"
|
||||
//---------------------------------------------------------------------------
|
||||
#pragma package(smart_init)
|
||||
//---------------------------------------------------------------------------
|
||||
#include "PanelDB.h"
|
||||
//---------------------------------------------------------------------------
|
||||
__fastcall TStateBtn::TStateBtn(TPanelDB *panel)
|
||||
{
|
||||
m_Panel = panel;
|
||||
|
||||
FIndex = 0;
|
||||
FLeft = FTop = FWidth = FHeight = 0;
|
||||
FState = 0;
|
||||
FStateCount = 4;
|
||||
|
||||
FEnable = true;
|
||||
FEnter = false;
|
||||
FDown = false;
|
||||
FStateCus = false;
|
||||
|
||||
m_UP = m_PRE = m_NEXT = m_PAR = NULL;
|
||||
m_Data = NULL;
|
||||
}
|
||||
//---------------------------------------------------------------------------
|
||||
__fastcall TStateBtn::~TStateBtn()
|
||||
{
|
||||
Clear();
|
||||
}
|
||||
//---------------------------------------------------------------------------
|
||||
void __fastcall TStateBtn::Clear()
|
||||
{
|
||||
if( m_LstSub.size() ) {
|
||||
|
||||
BTNLST::iterator lst_FBTNLST;
|
||||
for( lst_FBTNLST = m_LstSub.begin();
|
||||
lst_FBTNLST!= m_LstSub.end();
|
||||
lst_FBTNLST++ )
|
||||
{
|
||||
TStateBtn *pBtn = *lst_FBTNLST;
|
||||
SAFE_DELETE(pBtn)
|
||||
}
|
||||
m_LstSub.clear();
|
||||
}
|
||||
}
|
||||
//---------------------------------------------------------------------------
|
||||
TRect __fastcall TStateBtn::GetBounds()
|
||||
{
|
||||
TRect rtThis;
|
||||
if(m_PAR) {
|
||||
rtThis = TRect(m_PAR->Left+FLeft, m_PAR->Top+FTop,
|
||||
m_PAR->Left+FLeft+FWidth, m_PAR->Top+FTop+FHeight);
|
||||
}
|
||||
else {
|
||||
rtThis = TRect(FLeft, FTop, FLeft+FWidth, FTop+FHeight);
|
||||
}
|
||||
|
||||
return rtThis;
|
||||
}
|
||||
//---------------------------------------------------------------------------
|
||||
BTNLST* __fastcall TStateBtn::GetSub()
|
||||
{
|
||||
return &m_LstSub;
|
||||
}
|
||||
//---------------------------------------------------------------------------
|
||||
TStateBtn* __fastcall TStateBtn::GetSubCusor(TPoint pt)
|
||||
{
|
||||
TStateBtn *pCur = this;
|
||||
TRect rt = TRect( Left, Top, Left+Width, Top+Height);
|
||||
|
||||
if( PtInRect( rt, pt ) ) {
|
||||
|
||||
TStateBtn *pSub = 0;
|
||||
if( m_LstSub.size() ) {
|
||||
|
||||
TPoint ptTmp = pt;
|
||||
BTNLST::iterator lst_FBTNLST;
|
||||
for(lst_FBTNLST = m_LstSub.begin();
|
||||
lst_FBTNLST != m_LstSub.end();
|
||||
lst_FBTNLST++ )
|
||||
{
|
||||
ptTmp = TPoint(pt.X-Left, pt.Y-Top);
|
||||
pSub = (*lst_FBTNLST)->GetSubCusor(ptTmp);
|
||||
if( pSub ) return pSub;
|
||||
}
|
||||
}
|
||||
|
||||
if( 0==pSub ) return pCur;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
//---------------------------------------------------------------------------
|
||||
void __fastcall TStateBtn::SetSub(TStateBtn *pBtn)
|
||||
{
|
||||
m_LstSub.push_back(pBtn);
|
||||
pBtn->m_PAR = this;
|
||||
}
|
||||
//---------------------------------------------------------------------------
|
||||
void __fastcall TStateBtn::SetBounds(int nLeft, int nTop, int nWidth, int nHeight)
|
||||
{
|
||||
Left = nLeft;
|
||||
Top = nTop;
|
||||
Width = nWidth;
|
||||
Height = nHeight;
|
||||
}
|
||||
//---------------------------------------------------------------------------
|
||||
void __fastcall TStateBtn::SetData(void *pData)
|
||||
{
|
||||
m_Data = pData;
|
||||
}
|
||||
//----------------------------------------------------------------------------
|
||||
bool __fastcall TStateBtn::DoNotifyStateHandle()
|
||||
{
|
||||
if( !FStateCus ) {
|
||||
|
||||
int CurStateTmp = FState;
|
||||
if( false==FEnable ) {
|
||||
|
||||
CurStateTmp = Bs_DISABLE;
|
||||
|
||||
}else {
|
||||
|
||||
if( FDown ) CurStateTmp = Bs_DOWN;
|
||||
else if( FEnter ) CurStateTmp = Bs_ENTER;
|
||||
else CurStateTmp = Bs_NORMAL;
|
||||
|
||||
if( FStateCount<=CurStateTmp ) CurStateTmp = FStateCount-1;
|
||||
}
|
||||
|
||||
FState = CurStateTmp;
|
||||
}
|
||||
// else if( OnNotifyState ) OnNotifyState(this);
|
||||
|
||||
if( OnNotifyState ) OnNotifyState(this);
|
||||
|
||||
return true;
|
||||
}
|
||||
//----------------------------------------------------------------------------
|
||||
void __fastcall TStateBtn::Paint(TCanvas *Canvas)
|
||||
{
|
||||
if( !DoNotifyStateHandle() ) return;
|
||||
|
||||
TCanvas *CanvasDr = Canvas;
|
||||
|
||||
TRect rtThis = GetBounds();
|
||||
|
||||
if( NULL==CanvasDr ) CanvasDr = m_Panel->m_CanvasDr;
|
||||
|
||||
if( FNotifyDraw ) //»æÖÆ
|
||||
{
|
||||
if( FNotifyDraw ) {
|
||||
|
||||
if( !m_PAR && FState==Bs_NORMAL && m_Panel->m_BMPBkg ) {
|
||||
|
||||
StretchBlt(CanvasDr->Handle,
|
||||
rtThis.left, rtThis.Top,
|
||||
rtThis.Width(), rtThis.Height(),
|
||||
m_Panel->m_BMPBkg->Canvas->Handle,
|
||||
rtThis.left, rtThis.Top,
|
||||
rtThis.Width(), rtThis.Height(),
|
||||
SRCCOPY);
|
||||
}
|
||||
FNotifyDraw(this, FState, rtThis, CanvasDr);
|
||||
}
|
||||
|
||||
if( m_LstSub.size() ) {
|
||||
|
||||
BTNLST::iterator lst_FBTNLST;
|
||||
for(lst_FBTNLST = m_LstSub.begin();
|
||||
lst_FBTNLST != m_LstSub.end();
|
||||
lst_FBTNLST++ )
|
||||
{
|
||||
(*lst_FBTNLST)->Paint(CanvasDr);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if( NULL==Canvas ) {
|
||||
|
||||
HDC hDC = GetDC(m_Panel->Handle);
|
||||
StretchBlt(hDC, rtThis.Left, rtThis.Top, rtThis.Width(), rtThis.Height(),
|
||||
CanvasDr->Handle, rtThis.Left, rtThis.Top, rtThis.Width(), rtThis.Height(),
|
||||
SRCCOPY);
|
||||
DeleteDC(hDC);
|
||||
}
|
||||
}
|
||||
//---------------------------------------------------------------------------
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
Reference in New Issue
Block a user