//--------------------------------------------------------------------------- #include #pragma hdrstop #include "GlobalUnit.h" #include "RecordPanelUnit.h" //--------------------------------------------------------------------------- #pragma package(smart_init) #define COLOR_NONRECORD RGB(205,205,205) #define COLOR_WAVE_NEW RGB(15,229,226) #define COLOR_WAVE_OLD RGB(75,148,147) #define COLOR_MODIFYLINE RGB(200,15,15) //--------------------------------------------------------------------------- __fastcall RecordPanelUnit::TPanel::TPanel(TComponent* AOwner) : TShowBarsPanel(AOwner) { m_iModifyBeginBar = m_iModifyBeginPoint = m_iModifyEndBar = m_iModifyEndPoint = -1; m_bShowModifyPos = false; m_imgBeginPos = m_imgEndPos = NULL; } //--------------------------------------------------------------------------- void __fastcall RecordPanelUnit::TPanel::CreateWnd(void) { TShowBarsPanel::CreateWnd(); if( !ParentBackground ){ m_imgBeginPos = new TPngImage(); m_imgBeginPos->LoadFromResourceName(int(HInstance), L"RecordBeginPos"); m_imgEndPos = new TPngImage(); m_imgEndPos->LoadFromResourceName(int(HInstance), L"RecordEndPos"); m_nModifyFlagWidth = m_imgBeginPos->Width; m_nModifyFlagHeight = m_imgBeginPos->Height; } } //--------------------------------------------------------------------------- __fastcall RecordPanelUnit::TPanel::~TPanel() { if( m_imgBeginPos ) delete m_imgBeginPos; if( m_imgEndPos ) delete m_imgEndPos; } //--------------------------------------------------------------------------- void RecordPanelUnit::TPanel::AddNewBar( int iBar ) { int iRow, iCol; m_nBarNum++; m_nRowNum = m_nBarNum / m_nColumnNum; if( m_nBarNum % m_nColumnNum>0 ){ m_nRowNum++; } if( m_nRowNum>m_nRowShow ){ if( !m_sbVert->Visible ){ m_sbVert->Visible = true; m_sbVert->SetRange( 0, m_nRowNum-1 ); m_sbVert->SetPageSize( m_nRowShow ); } else { m_sbVert->SetRange( 0, m_nRowNum-1 ); } } iRow = iBar / m_nColumnNum - m_nBeginShowRow; iCol = iBar % m_nColumnNum; TRect rectNew(0,0,0,0); rectNew.left = iCol * m_nBarWidth + m_nLeftBound; rectNew.right = rectNew.left + m_nBarWidth + 1; //包含左右边框 rectNew.top = iRow * m_nBarHeight + m_nTopBound; rectNew.bottom = rectNew.top + m_nBarHeight + 1; //包含上下边框 if( iRow>(m_nRowShow-1) ){ int nRowScroll = min( m_nRowShow+m_nBeginShowRow-1, m_nRowNum-iRow ); // 显示到第2行 ScrollView( nRowScroll ); } else{ InvalidateRect( Handle, &rectNew, FALSE ); } } //--------------------------------------------------------------------------- void __fastcall RecordPanelUnit::TPanel::DrawBarOperation( int iBar, int left, int top ) { if( m_bShowModifyPos ){ //绘制重录起止标志 if( m_iModifyBeginBar==iBar ){ int X = left + m_iModifyBeginPoint - m_nModifyFlagWidth/2; int Y = top + 2; Canvas->Draw(X, Y, m_imgBeginPos); } if( m_iModifyEndBar==iBar ){ int X = left + m_iModifyEndPoint - m_nModifyFlagWidth/2; int Y = top + 2; Canvas->Draw(X, Y, m_imgEndPos); } } } //--------------------------------------------------------------------------- void __fastcall RecordPanelUnit::TPanel::DrawBarBkgnd( int iBar, int leftDraw, int topDraw ) { //绘制音频区背景 TRect rectWave; rectWave.left = leftDraw; rectWave.right = rectWave.left + m_nDataWidth; rectWave.top = topDraw; rectWave.bottom = rectWave.top + m_nDataHeight; MELODYBAR *pBV = g_lstMelodyBars[iBar]; if( !pBV->tBarVol.bInvalid ){ if( !m_bShowModifyPos || m_iModifyBeginBar<0 && m_iModifyEndBar<0 || ( m_iModifyEndBar<0 || iBarm_iModifyBeginBar ){ Canvas->Brush->Color = clWhite; Canvas->FillRect( rectWave ); } else if( iBar=0 && iBar>m_iModifyEndBar ){ Canvas->Brush->Color = COLOR_NONRECORD; Canvas->FillRect( rectWave ); } else{ if( iBar==m_iModifyBeginBar && iBar==m_iModifyEndBar ){ if( m_iModifyBeginPoint>0 ){ Canvas->Brush->Color = COLOR_NONRECORD; rectWave.right = leftDraw + m_iModifyBeginPoint; Canvas->FillRect( rectWave ); } Canvas->Brush->Color = clWhite; rectWave.left = leftDraw + m_iModifyBeginPoint; rectWave.right = leftDraw + m_iModifyEndPoint; Canvas->FillRect( rectWave ); if( m_iModifyEndPointBrush->Color = COLOR_NONRECORD; rectWave.left = leftDraw + m_iModifyEndPoint; rectWave.right = leftDraw + m_nDataWidth; Canvas->FillRect( rectWave ); } } else if( iBar==m_iModifyBeginBar ){ if( m_iModifyBeginPoint>0 ){ Canvas->Brush->Color = COLOR_NONRECORD; rectWave.right = leftDraw + m_iModifyBeginPoint; Canvas->FillRect( rectWave ); } if( m_iModifyBeginPointBrush->Color = clWhite; rectWave.left = leftDraw + m_iModifyBeginPoint; rectWave.right = leftDraw + m_nDataWidth; Canvas->FillRect( rectWave ); } } else if( iBar==m_iModifyEndBar ){ if( m_iModifyEndPoint>0 ){ Canvas->Brush->Color = clWhite; rectWave.right = leftDraw + m_iModifyEndPoint; Canvas->FillRect( rectWave ); } if( m_iModifyEndPointBrush->Color = COLOR_NONRECORD; rectWave.left = leftDraw + m_iModifyEndPoint; rectWave.right = leftDraw + m_nDataWidth; Canvas->FillRect( rectWave ); } } } } } //--------------------------------------------------------------------------- void __fastcall RecordPanelUnit::TPanel::DrawBarContext( int iBar, int left, int top ) { TColor clrOld = Canvas->Pen->Color; int mid = top + m_nDataHeight/2; MELODYBAR *pBV = g_lstMelodyBars[iBar]; if( pBV->tBarVol.bInvalid ) return; if( pBV->tBarVol.bRecording ) Canvas->Pen->Color = COLOR_WAVE_NEW; else Canvas->Pen->Color = COLOR_WAVE_OLD; for( int k=0; ktBarVol.aVols[k]>0 && pBV->tBarVol.aVols[k]<0x80000000 ){ DWORD wLeft = LOWORD(pBV->tBarVol.aVols[k]), wRight = HIWORD(pBV->tBarVol.aVols[k]); int yBottom = mid + ((14 * wRight )/0x8000), yTop = mid - ((14 * wLeft )/0x8000); if( yBottom>yTop ){ Canvas->MoveTo( left+k, yTop ); Canvas->LineTo( left+k, yBottom ); } } } Canvas->Pen->Color = clrOld; } //--------------------------------------------------------------------------- bool RecordPanelUnit::TPanel::SetModifyPos( bool bBegin, int iNewBar, int iNewPoint ) { int iBeginBar, iBeginPoint, iEndBar, iEndPoint; bool bSet = false; if( bBegin ){ iBeginBar = iNewBar, iBeginPoint = iNewPoint; iEndBar = m_iModifyEndBar; iEndPoint = m_iModifyEndPoint; int iBPoints = iBeginBar * m_nDataWidth + iBeginPoint, iEPoints = iEndBar * m_nDataWidth + iEndPoint; if( iBPoints<0 ) iBPoints = 0; if( iEPoints<0 ) iEPoints = m_nBarNum * m_nDataWidth - 1; if( iEPoints >= iBPoints ){ if( iEPoints < iBPoints + 15 ){ iBPoints = iEPoints - 15; iBeginBar = iBPoints / m_nDataWidth; iBeginPoint = iBPoints % m_nDataWidth; } m_iModifyBeginBar = iBeginBar; m_iModifyBeginPoint = iBeginPoint; bSet = true; } } else{ iBeginBar = m_iModifyBeginBar; iBeginPoint = m_iModifyBeginPoint; iEndBar = iNewBar; iEndPoint = iNewPoint; int iBPoints = iBeginBar * m_nDataWidth + iBeginPoint, iEPoints = iEndBar * m_nDataWidth + iEndPoint; if( iBPoints<0 ) iBPoints = 0; if( iEPoints<0 ) iEPoints = m_nBarNum * m_nDataWidth - 1; if( iEPoints >= iBPoints ){ if( iEPoints < iBPoints + 15 ){ iEPoints = iBPoints + 15; iEndBar = iEPoints / POINTS_PER_BAR; iEndPoint = iEPoints % POINTS_PER_BAR; } m_iModifyEndBar = iEndBar; m_iModifyEndPoint = iEndPoint; bSet = true; } } Invalidate(); return bSet; } //--------------------------------------------------------------------------- void RecordPanelUnit::TPanel::GetModifyPos( bool bBegin, int& iBar, int& iPoint ) { if( bBegin ){ iBar = m_iModifyBeginBar; iPoint = m_iModifyBeginPoint; } else{ iBar = m_iModifyEndBar; iPoint = m_iModifyEndPoint; } } //--------------------------------------------------------------------------- void RecordPanelUnit::TPanel::ShowModifyPos( bool bShow ) { m_bShowModifyPos = bShow; if( !bShow ){ m_iModifyBeginBar = m_iModifyBeginPoint = m_iModifyEndBar = m_iModifyEndPoint = -1; } Invalidate(); } //---------------------------------------------------------------------------