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

302 lines
8.2 KiB
C++

//---------------------------------------------------------------------------
#include <vcl.h>
#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 || iBar<m_iModifyEndBar ) && iBar>m_iModifyBeginBar ){
Canvas->Brush->Color = clWhite;
Canvas->FillRect( rectWave );
}
else if( iBar<m_iModifyBeginBar || m_iModifyEndBar>=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_iModifyEndPoint<m_nDataWidth-1 ){
Canvas->Brush->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_iModifyBeginPoint<m_nDataWidth-1 ){
Canvas->Brush->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_iModifyEndPoint<m_nDataWidth-1 ){
Canvas->Brush->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; k<POINTS_PER_BAR; k++ ){
if( pBV->tBarVol.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();
}
//---------------------------------------------------------------------------