//--------------------------------------------------------------------------- #include #pragma hdrstop #include "NotificationADPanelUnit.h" #define PERIOD_AD ( 3*1000 ) #define AD_SHOW_NUMBER 1 #define AD_CHANGE_WIDTH 10 #define AD_CHANGE_HEIGHT 6 #define AD_CHANGE_HEIGHT_TO_BOTTOM 5 #define AD_CHANGE_PIC2PIC 5 #define AD_PIC_LEFT 0 #define AD_PIC_TOP 0 #define AD_PIC_WIDTH Width #define AD_PIC_HEIGHT (Height - AD_CHANGE_HEIGHT - 2*AD_CHANGE_HEIGHT_TO_BOTTOM) const static COLORREF CLR_BKG = RGB(39, 42, 47); //--------------------------------------------------------------------------- #pragma package(smart_init) __fastcall TNotiADPanel::TNotiADPanel( TComponent* Owner, VCTJSON *VCJsonAD) : Vcl::Extctrls::TPanel( Owner ) { m_VCJsonAD = VCJsonAD; m_iIndex = 0; m_pADTimer = new TTimer(this); m_pADTimer->Enabled = false; m_pADTimer->Interval = PERIOD_AD; m_pADTimer->OnTimer = NotificationTimerProc; this->BevelOuter = bvNone; ParentColor = true; } //--------------------------------------------------------------------------- __fastcall TNotiADPanel::~TNotiADPanel() { if( m_pPaintBoxAD ) { delete m_pPaintBoxAD; m_pPaintBoxAD = NULL; } vector::iterator vc_pFindADChange; for( vc_pFindADChange = m_pPBADChange.begin(); vc_pFindADChange != m_pPBADChange.end(); vc_pFindADChange++ ) { if( *vc_pFindADChange ) { delete *vc_pFindADChange; *vc_pFindADChange = NULL; } } vector::iterator vc_pFindPIC; for( vc_pFindPIC = m_vcPIC.begin(); vc_pFindPIC != m_vcPIC.end(); vc_pFindPIC++ ) { if( *vc_pFindPIC ) { delete *vc_pFindPIC; *vc_pFindPIC = NULL; } } if( m_pADTimer ) { delete m_pADTimer; m_pADTimer = NULL; } } //--------------------------------------------------------------------------- void __fastcall TNotiADPanel::CreateWnd() { Vcl::Extctrls::TPanel::CreateWnd(); SetAD(); } //--------------------------------------------------------------------------- void __fastcall TNotiADPanel::WMEraseBkgnd(TWMEraseBkgnd &Message) { TRect rect = GetClientRect(); TCanvas* tempCanvas = new TCanvas; tempCanvas->Handle = Message.DC; tempCanvas->Brush->Color = CLR_BKG; //±³¾°ÑÕÉ« tempCanvas->FillRect( rect ); delete tempCanvas; tempCanvas = NULL; } //--------------------------------------------------------------------------- void __fastcall TNotiADPanel::NotificationTimerProc(TObject* Sender) { TTimer *NotiTimer = (TTimer *)Sender; int index = 0; int size = (*m_VCJsonAD).size(); if( size>AD_SHOW_NUMBER ) { if( NotiTimer == m_pADTimer ) { m_iIndex = ( (m_iIndex+1)==size )? 0: (m_iIndex+1); } vector::iterator vc_pFindADChange; bool bFind = false; VCTJSON::iterator vc_pFindAD; for( vc_pFindAD = (*m_VCJsonAD).begin(), vc_pFindADChange = m_pPBADChange.begin(); vc_pFindAD != (*m_VCJsonAD).end(), vc_pFindADChange != m_pPBADChange.end(); vc_pFindADChange++ ) { if( index==m_iIndex ) { (*vc_pFindADChange)->State = 1; bFind = true; }else{ (*vc_pFindADChange)->State = 0; if( !bFind ) { vc_pFindAD++; } } (*vc_pFindADChange)->Invalidate(); index++; } vector::iterator vc_pFindPIC = m_vcPIC.begin() + m_iIndex; m_pPaintBoxAD->GraphicImg = *vc_pFindPIC; m_pPaintBoxAD->StrUrl = (*vc_pFindAD).strUrl; m_pPaintBoxAD->Invalidate(); }else { m_pADTimer->Enabled = false; } } //--------------------------------------------------------------------------- void __fastcall TNotiADPanel::SetAD() { int adSize = (*m_VCJsonAD).size(); if( adSize ) { int startLoc = Width - adSize*(AD_CHANGE_WIDTH+AD_CHANGE_PIC2PIC) + AD_CHANGE_PIC2PIC; TUrlPaintBox *tmpPB; TPicture *picImg; VCTJSON::iterator vc_pFindAD; for( vc_pFindAD = (*m_VCJsonAD).begin(); vc_pFindAD != (*m_VCJsonAD).end(); vc_pFindAD++ ) { picImg = new TPicture(); String name = (*vc_pFindAD).strNamePic; picImg->LoadFromFile( (*vc_pFindAD).strNamePic ); m_vcPIC.push_back(picImg); if( adSize>1 ) { tmpPB = new TUrlPaintBox(this); tmpPB->Parent = this; tmpPB->Width = AD_CHANGE_WIDTH; tmpPB->Height = AD_CHANGE_HEIGHT; tmpPB->Left = startLoc; tmpPB->Top = Height - AD_CHANGE_HEIGHT - AD_CHANGE_HEIGHT_TO_BOTTOM; tmpPB->StateCount = 2; tmpPB->OnMouseEnter = ADChangeMouseEnter; tmpPB->OnMouseLeave = ADChangeMouseLeave; if( vc_pFindAD == (*m_VCJsonAD).begin() ) { tmpPB->State = 1; } tmpPB->BringToFront(); tmpPB->Visible = true; startLoc += AD_CHANGE_WIDTH + AD_CHANGE_PIC2PIC; m_pPBADChange.push_back(tmpPB); } } vc_pFindAD = (*m_VCJsonAD).begin(); m_pPaintBoxAD = new TUrlPaintBox(this); m_pPaintBoxAD->Parent = this; m_pPaintBoxAD->Width = AD_PIC_WIDTH; m_pPaintBoxAD->Height = AD_PIC_HEIGHT; m_pPaintBoxAD->Left = AD_PIC_LEFT; m_pPaintBoxAD->Top = AD_PIC_TOP; m_pPaintBoxAD->OnMouseEnter = PaintBoxMouseEnter; m_pPaintBoxAD->OnMouseLeave = PaintBoxMouseLeave; m_pPaintBoxAD->GraphicImg = *( m_vcPIC.begin() ); m_pPaintBoxAD->StrUrl = (*vc_pFindAD).strUrl; m_pPaintBoxAD->Visible = true; } m_pADTimer->Enabled = true; } //--------------------------------------------------------------------------- void __fastcall TNotiADPanel::PaintBoxMouseLeave(TObject *Sender) { int adSize = (*m_VCJsonAD).size(); if( adSize<=1 ){ return; } TPoint clientPos = ScreenToClient(Mouse->CursorPos); TUrlPaintBox *tmpPB = (TUrlPaintBox *)Sender; if( tmpPB==m_pPaintBoxAD ) { m_pADTimer->Enabled = true; } } //--------------------------------------------------------------------------- void __fastcall TNotiADPanel::PaintBoxMouseEnter(TObject *Sender) { int adSize = (*m_VCJsonAD).size(); if( adSize<=1 ){ return; } TUrlPaintBox *tmpPB = (TUrlPaintBox *)Sender; if( tmpPB==m_pPaintBoxAD ) { m_pADTimer->Enabled = false; } } //--------------------------------------------------------------------------- void __fastcall TNotiADPanel::ADChangeMouseEnter(TObject *Sender) { m_pADTimer->Enabled = false; TUrlPaintBox *tmpPB = (TUrlPaintBox *)Sender; int index = 0; vector::iterator vc_pFindADChange; for( vc_pFindADChange = m_pPBADChange.begin(); vc_pFindADChange != m_pPBADChange.end(); vc_pFindADChange++ ) { if( tmpPB==*vc_pFindADChange ) { break; } index++; } if( m_iIndex != index ) { m_iIndex = index; NotificationTimerProc(NULL); } } //--------------------------------------------------------------------------- void __fastcall TNotiADPanel::ADChangeMouseLeave(TObject *Sender) { m_pADTimer->Enabled = true; } //---------------------------------------------------------------------------