355 lines
9.5 KiB
C++
355 lines
9.5 KiB
C++
//---------------------------------------------------------------------------
|
|
#include <vcl.h>
|
|
#pragma hdrstop
|
|
|
|
#include "GlobalUnit.h"
|
|
#include "CompletePanelUnit.h"
|
|
//---------------------------------------------------------------------------
|
|
#pragma package(smart_init)
|
|
|
|
|
|
__fastcall CompletePanelUnit::TPanel::TPanel(TComponent* AOwner)
|
|
: TShowBarsPanel(AOwner)
|
|
{
|
|
m_iModifyBeginBar = m_iModifyBeginPoint =
|
|
m_iModifyEndBar = m_iModifyEndPoint = -1;
|
|
m_bShowModifyPos = false;
|
|
m_imgBeginPos = m_imgEndPos = NULL;
|
|
|
|
m_nChordWidth = 40;
|
|
m_nChordHeight = 20;
|
|
}
|
|
//---------------------------------------------------------------------------
|
|
|
|
__fastcall CompletePanelUnit::TPanel::~TPanel()
|
|
{
|
|
if( m_imgBeginPos )
|
|
delete m_imgBeginPos;
|
|
|
|
if( m_imgEndPos )
|
|
delete m_imgEndPos;
|
|
}
|
|
//---------------------------------------------------------------------------
|
|
|
|
void CompletePanelUnit::TPanel::InitialVars()
|
|
{
|
|
//计算总小节数
|
|
int nTotalBarCount = 0;
|
|
for( int i=0; i<g_lstComposeStages.size(); i++ ){
|
|
COMPOSESTAGE* pCStage = g_lstComposeStages[i];
|
|
|
|
nTotalBarCount += pCStage->nStageBars;
|
|
}
|
|
|
|
TShowBarsPanel::InitialVars( nTotalBarCount );
|
|
}
|
|
//---------------------------------------------------------------------------
|
|
|
|
void __fastcall CompletePanelUnit::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;
|
|
}
|
|
}
|
|
//---------------------------------------------------------------------------
|
|
|
|
|
|
void __fastcall CompletePanelUnit::TPanel::SetBarTitle( int iBar, String& strText )
|
|
{
|
|
//
|
|
}
|
|
//---------------------------------------------------------------------------
|
|
|
|
void __fastcall CompletePanelUnit::TPanel::DrawBarOperation( int iBar, int leftDraw, int topDraw )
|
|
{
|
|
if( m_bShowModifyPos ){
|
|
//绘制重录起止标志
|
|
if( m_iModifyBeginBar==iBar ){
|
|
int X = leftDraw + m_iModifyBeginPoint - m_nModifyFlagWidth/2;
|
|
int Y = topDraw + 2;
|
|
Canvas->Draw(X, Y, m_imgBeginPos);
|
|
}
|
|
if( m_iModifyEndBar==iBar ){
|
|
int X = leftDraw + m_iModifyEndPoint - m_nModifyFlagWidth/2;
|
|
int Y = topDraw + 2;
|
|
Canvas->Draw(X, Y, m_imgEndPos);
|
|
}
|
|
}
|
|
}
|
|
//---------------------------------------------------------------------------
|
|
|
|
void __fastcall CompletePanelUnit::TPanel::DrawBarBkgnd( int iBar, int leftDraw, int topDraw )
|
|
{
|
|
TRect rectBar;
|
|
rectBar.left = leftDraw;
|
|
rectBar.right = rectBar.left + m_nDataWidth;
|
|
rectBar.top = topDraw;
|
|
rectBar.bottom = rectBar.top + m_nDataHeight;
|
|
|
|
int iFirstBar, iStage = FindStage( iBar, &iFirstBar );
|
|
|
|
if( iStage<0 ) return;
|
|
|
|
COMPOSESTAGE* pStage = g_lstComposeStages[iStage];
|
|
COLORREF clrNormal, clrDisable;
|
|
if( pStage->iMelodyStage>=COMPOSE_ENDING_1 ){
|
|
clrNormal = g_clrEnding[pStage->iMelodyStage - COMPOSE_ENDING_1];
|
|
clrDisable = g_clrEndingDisable[pStage->iMelodyStage - COMPOSE_ENDING_1];
|
|
}
|
|
else if( pStage->iMelodyStage>=COMPOSE_INTRO_1 ){
|
|
clrNormal = g_clrIntro[pStage->iMelodyStage - COMPOSE_INTRO_1];
|
|
clrDisable = g_clrIntroDisable[pStage->iMelodyStage - COMPOSE_INTRO_1];
|
|
}
|
|
else{
|
|
clrNormal = g_clrStage[pStage->iVar % STAGE_VAR_NUM];
|
|
clrDisable = g_clrStageDisable[pStage->iVar % STAGE_VAR_NUM];
|
|
}
|
|
|
|
if( !m_bShowModifyPos || m_iModifyBeginBar<0 && m_iModifyEndBar<0 ||
|
|
( m_iModifyEndBar<0 || iBar<m_iModifyEndBar ) && iBar>m_iModifyBeginBar){
|
|
Canvas->Brush->Color = clrNormal;
|
|
Canvas->FillRect( rectBar );
|
|
}
|
|
else if( iBar<m_iModifyBeginBar || m_iModifyEndBar>=0 && iBar>m_iModifyEndBar ){
|
|
Canvas->Brush->Color = clrDisable;
|
|
Canvas->FillRect( rectBar );
|
|
}
|
|
else{
|
|
if( iBar==m_iModifyBeginBar && iBar==m_iModifyEndBar ){
|
|
if( m_iModifyBeginPoint>0 ){
|
|
Canvas->Brush->Color = clrDisable;
|
|
rectBar.right = leftDraw + m_iModifyBeginPoint;
|
|
Canvas->FillRect( rectBar );
|
|
}
|
|
|
|
Canvas->Brush->Color = clrNormal;
|
|
rectBar.left = leftDraw + m_iModifyBeginPoint;
|
|
rectBar.right = leftDraw + m_iModifyEndPoint;
|
|
Canvas->FillRect( rectBar );
|
|
|
|
if( m_iModifyEndPoint<m_nDataWidth-1 ){
|
|
Canvas->Brush->Color = clrDisable;
|
|
rectBar.left = leftDraw + m_iModifyEndPoint;
|
|
rectBar.right = leftDraw + m_nDataWidth;
|
|
Canvas->FillRect( rectBar );
|
|
}
|
|
}
|
|
else if( iBar==m_iModifyBeginBar ){
|
|
if( m_iModifyBeginPoint>0 ){
|
|
Canvas->Brush->Color = clrDisable;
|
|
rectBar.right = leftDraw + m_iModifyBeginPoint;
|
|
Canvas->FillRect( rectBar );
|
|
}
|
|
if( m_iModifyBeginPoint<m_nDataWidth-1 ){
|
|
Canvas->Brush->Color = clrNormal;
|
|
rectBar.left = leftDraw + m_iModifyBeginPoint;
|
|
rectBar.right = leftDraw + m_nDataWidth;
|
|
Canvas->FillRect( rectBar );
|
|
}
|
|
}
|
|
else if( iBar==m_iModifyEndBar ){
|
|
if( m_iModifyEndPoint>0 ){
|
|
Canvas->Brush->Color = clrNormal;
|
|
rectBar.right = leftDraw + m_iModifyEndPoint;
|
|
Canvas->FillRect( rectBar );
|
|
}
|
|
if( m_iModifyEndPoint<m_nDataWidth-1 ){
|
|
Canvas->Brush->Color = clrDisable;
|
|
rectBar.left = leftDraw + m_iModifyEndPoint;
|
|
rectBar.right = leftDraw + m_nDataWidth;
|
|
Canvas->FillRect( rectBar );
|
|
}
|
|
}
|
|
}
|
|
}
|
|
//---------------------------------------------------------------------------
|
|
#define COLOR_WAVE_NEW RGB(15,229,226)
|
|
#define COLOR_WAVE_OLD RGB(75,148,147)
|
|
|
|
void __fastcall CompletePanelUnit::TPanel::DrawBarContext( int iBar, int leftDraw, int topDraw )
|
|
{
|
|
//绘制波形
|
|
TColor clrOld = Canvas->Pen->Color;
|
|
int mid = topDraw + m_nDataHeight/2;
|
|
BARVOLS *pBV = g_lstCompleteVols[iBar];
|
|
if( iBar>=g_lstCompleteVols.size() || pBV->bInvalid )
|
|
return;
|
|
|
|
if( pBV->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->aVols[k]!=0 && pBV->aVols[k]!=-1 ){
|
|
DWORD wLeft = LOWORD(pBV->aVols[k]),
|
|
wRight = HIWORD(pBV->aVols[k]);
|
|
|
|
int yTop = mid - ((14 * wLeft )/0x8000),
|
|
yBottom = mid + ((14 * wRight )/0x8000);
|
|
|
|
if( yBottom>yTop ){
|
|
Canvas->MoveTo( leftDraw+k, yTop );
|
|
Canvas->LineTo( leftDraw+k, yBottom );
|
|
}
|
|
}
|
|
}
|
|
|
|
Canvas->Pen->Color = clrOld;
|
|
}
|
|
//---------------------------------------------------------------------------
|
|
|
|
void __fastcall CompletePanelUnit::TPanel::BarPosChanged()
|
|
{
|
|
//
|
|
}
|
|
//---------------------------------------------------------------------------
|
|
|
|
bool CompletePanelUnit::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 CompletePanelUnit::TPanel::GetModifyPos( bool bBegin, int& iBar, int& iPoint )
|
|
{
|
|
if( bBegin ){
|
|
iBar = m_iModifyBeginBar;
|
|
iPoint = m_iModifyBeginPoint;
|
|
}
|
|
else{
|
|
iBar = m_iModifyEndBar;
|
|
iPoint = m_iModifyEndPoint;
|
|
}
|
|
}
|
|
//---------------------------------------------------------------------------
|
|
|
|
void CompletePanelUnit::TPanel::ShowModifyPos( bool bShow )
|
|
{
|
|
m_bShowModifyPos = bShow;
|
|
|
|
if( !bShow ){
|
|
m_iModifyBeginBar = m_iModifyBeginPoint =
|
|
m_iModifyEndBar = m_iModifyEndPoint = -1;
|
|
}
|
|
|
|
Invalidate();
|
|
}
|
|
//---------------------------------------------------------------------------
|
|
|
|
int CompletePanelUnit::TPanel::FindStage( int iBar, int *piFirstBar )
|
|
{
|
|
if( iBar>=0 ){
|
|
int nStageNum = g_lstComposeStages.size();
|
|
int nBarCount = 0;
|
|
for( int i=0; i<nStageNum; i++ ){
|
|
COMPOSESTAGE* pStage = g_lstComposeStages[i];
|
|
|
|
if( piFirstBar )
|
|
*piFirstBar = nBarCount;
|
|
|
|
nBarCount += pStage->nStageBars;
|
|
|
|
if( iBar<nBarCount ){
|
|
return i;
|
|
}
|
|
}
|
|
}
|
|
|
|
return -1;
|
|
}
|
|
//---------------------------------------------------------------------------
|
|
|
|
int CompletePanelUnit::TPanel::FirstBar( int iStage )
|
|
{
|
|
if( iStage>=g_lstComposeStages.size() )
|
|
return -1;
|
|
|
|
int nBarCount = 0;
|
|
for( int i=0; i<iStage; i++ ){
|
|
COMPOSESTAGE* pStage = g_lstComposeStages[i];
|
|
|
|
nBarCount += pStage->nStageBars;
|
|
}
|
|
|
|
return nBarCount;
|
|
}
|
|
//---------------------------------------------------------------------------
|
|
|
|
void CompletePanelUnit::TPanel::InvalidateStage( int iStage, int iArea )
|
|
{
|
|
int iFirstBar = FirstBar( iStage );
|
|
COMPOSESTAGE * pStage = g_lstComposeStages[iStage];
|
|
for( int i=0; i<pStage->nStageBars; i++ ){
|
|
InvalidateBar( iFirstBar+i, 0, m_nBarWidth, iArea );
|
|
}
|
|
}
|
|
//---------------------------------------------------------------------------
|