302 lines
8.2 KiB
C++
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();
|
|
}
|
|
//---------------------------------------------------------------------------
|
|
|