Files
2026-06-13 00:10:11 +08:00

1474 lines
38 KiB
C++

//---------------------------------------------------------------------------
#include <vcl.h>
#pragma hdrstop
#include "GlobalUnit.h"
#include "BaseFormUnit.h"
#include "StyleSelFormUnit.h"
#include "MessageFormUnit.h"
//#include "ComposeFormUnit.h"
static const TCursor crApart = 0x59,
crCombine = 0x5A;
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma link "PNGButton"
#pragma resource "*.dfm"
//USEFORM("MessageFormUnit.cpp", MessageForm);
TBaseForm *BaseForm;
extern TPNGButton *g_btnFontChange;
extern Vcl::Extctrls::TPanel *g_panelFontName;
extern CommonListBoxUnit::TListBox *g_lbFontSelect;
//---------------------------------------------------------------------------
__fastcall TBaseForm::TBaseForm(TComponent* Owner)
: TBackgroundForm(Owner)
{
m_bCanErase = false;
m_iStartBar = m_iLastStartBar = 0;
m_dblStartPoint = m_dblLastStartPoint = 0;
m_tTimer = m_tAccuracy = 0;
}
//---------------------------------------------------------------------------
void __fastcall TBaseForm::FormCreate(TObject *Sender)
{
SetTransparent( this );
m_lstMainKeys[0] = m_btnMainKey0;
m_lstMainKeys[1] = m_btnMainKey1;
m_lstMainKeys[2] = m_btnMainKey2;
m_lstMainKeys[3] = m_btnMainKey3;
m_lstMainKeys[4] = m_btnMainKey4;
m_lstMainKeys[5] = m_btnMainKey5;
m_lstMainKeys[6] = m_btnMainKey6;
for(int i = 0; i < 7; i++ ){
m_lstMainKeys[i]->Tag = i;
String sk = "BaseKey";
m_aImagKeyLM[i] = new TPngImage();
m_aImagKeyEG[i] = new TPngImage();
m_aImagKeyLM[i]->LoadFromResourceName(int(HInstance), sk + IntToStr(i));
char ch = 'A' + ( i+2 ) % 7;
sk += ch;
m_aImagKeyEG[i]->LoadFromResourceName(int(HInstance),sk);
}
m_lblPlayTime->Font->Color = RGB(60,43,23);
m_lblBeat->Font->Color = RGB(60,43,23);
m_lblTempo->Font->Color = RGB(60,43,23);
m_lblKey->Font->Color = RGB(60,43,23);
m_lblStyleName->Font->Color = RGB(60,43,23);
m_lstAjustKeys[0] = m_btnAjustKey0;
m_lstAjustKeys[1] = m_btnAjustKey1;
m_lstChordTypes[0] = m_btnChordType0;
m_lstChordTypes[1] = m_btnChordType1;
m_lstChordTypes[2] = m_btnChordType2;
Screen->Cursors[crApart] = LoadCursor(HInstance, L"ApartCursor");
Screen->Cursors[crCombine] = LoadCursor(HInstance, L"CombineCursor");
m_pPopMenu = new TPopMenu(this);
// m_btnAPR->Enabled = g_bAPRAvaliable;
}
//---------------------------------------------------------------------------
void __fastcall TBaseForm::FormDestroy(TObject *Sender)
{
if( m_panelBarsShow->IsPlaying() )
StopClick( NULL );
if( m_pPopMenu )
delete m_pPopMenu;
for(int i = 0; i < 7; i++)
delete m_aImagKeyLM[i];
for(int i = 0; i < 7; i++)
delete m_aImagKeyEG[i];
}
//---------------------------------------------------------------------------
void __fastcall TBaseForm::FormResize(TObject *Sender)
{
int wOriClient = 798,
hOriClient = 494;
m_btnPrevStep->Top = Height - DPIY( hOriClient - 460 );
m_btnNextStep->Top = m_btnPrevStep->Top;
m_btnNextStep->Left = ClientWidth - DPIX( wOriClient - 705 );
m_imgBreakH->Width = Width - 28;
m_imgBreakI->Left = Width - DPIX( wOriClient - 649 );
m_btnAudioEffect->Left = m_imgBreakI->Left - DPIX(60);
m_btnVolAudioSet->Top = Height - DPIY( hOriClient - 455 );
m_btnVolMusicSet->Top = m_btnVolAudioSet->Top;
m_btnMicSet->Top = m_btnVolAudioSet->Top;
m_btnStyleChange->Top = m_btnVolAudioSet->Top;
m_panelStyleName->Top = m_btnVolAudioSet->Top + 1;
m_panelAudioVolSet->Top = Height - DPIY(hOriClient - 322);
m_panelMusicVolSet->Top = m_panelAudioVolSet->Top;
m_panelMusicInfo->Left = Width - DPIX( wOriClient - 666 );
m_lbKeySelect->Left = m_panelMusicInfo->Left + m_btnKeyChange->Left - m_lbKeySelect->Width;
m_panelBarsShow->SetBounds( m_panelBarsShow->Left,
m_panelBarsShow->Top,
Width,
Height - DPIY(84) );
// m_lbKeySelect->Left = Width - 62;
// m_lbKeySelect->Top = m_imgMusicInfoBk->Top + m_imgMusicInfoBk->Height;
}
//---------------------------------------------------------------------------
void __fastcall TBaseForm::FormActivate(TObject *Sender)
{
if( Sender ){
return;
}
m_btnApart->Down = false;
m_btnCombine->Down = false;
// m_btnA->Down = g_bAPRActive;
OnChangeChordMode(NULL);
m_bCanErase = false;
m_panelBarsShow->SetFocusCell( -1, 0 );
EnableChordModify( false, -1, 0, 0 );
m_lblBeat->Caption = g_strTimeSignature[g_iMelodyTimeSignature];
m_lblTempo->Caption = IntToStr( g_nMelodyTempo );
if( g_iMelodyKey>=0 ){
m_lblKey->Caption = g_strMelodyKey[g_iMelodyKey];
}
else{
m_lblKey->Caption = "-";
}
m_lblStyleName->Caption = g_strSelectedStyleName.data();
if( !g_bBaseComposeLoaded ){//自动编曲
g_bkMelody.Clear();
ReloadBaseCompose();
}
else{
f_MM_SetStreamVolume( 3, g_fMusicVolume );
}
// m_btnReload->Enabled = false;
f_MM_SetStreamVolume( 2, g_fAudioVolume );
m_nAudioVolPos = 100 - g_fAudioVolume * 100;
m_nMusicVolPos = 100 - g_fMusicVolume * 100;
m_btnAudioVolPos->Top = 5 + m_nAudioVolPos;
m_btnMusicVolPos->Top = 5 + m_nMusicVolPos;
m_btnAudioVolPos->Hint = IntToStr(100-m_nAudioVolPos);
m_btnMusicVolPos->Hint = IntToStr(100-m_nMusicVolPos);
m_iStartBar = m_iLastStartBar = 0;
m_dblStartPoint = m_dblLastStartPoint = 0;
m_panelBarsShow->SetPlayPoint( 0, 0 );
ShowPlayTime();
m_panelBarsShow->SetFocus();
m_panelBarsShow->InitialVars();
Invalidate();
}
//---------------------------------------------------------------------------
void __fastcall TBaseForm::FormDeactivate(TObject *Sender)
{
if( Application->ActiveFormHandle!=Application->MainFormHandle ){
return;
}
StopClick( NULL );
g_bCanStep = true;
if( Sender ){
ReloadBaseCompose();
}
m_btnApart->Down = false;
m_btnCombine->Down = false;
m_panelBarsShow->SetFocusCell( -1, 0 );
EnableChordModify( false, -1, 0, 0 );
HidePopControls();
}
//---------------------------------------------------------------------------
void __fastcall TBaseForm::StepClick(TObject *Sender)
{
PostMessage(Application->MainFormHandle, UM_JUMP_PAGE, Sender==m_btnNextStep?WPARAM(3):WPARAM(1),LPARAM(this));
}
//---------------------------------------------------------------------------
void __fastcall TBaseForm::PlayClick(TObject *Sender)
{
double dblComposeStartPoint = m_iStartBar + m_dblStartPoint / POINTS_PER_BAR ;
ReloadBaseCompose();
HRESULT hr = f_MM_Play( Handle, dblComposeStartPoint, TYPE_AUDIO_BASECOMPOSE );
if( hr==S_OK ){
SetPlayTimer( true, m_tTimer, m_tAccuracy, Handle );
m_panelBarsShow->Play( true );
m_btnPlay->Visible = false;
m_btnPlay->Down = true;
m_btnPause->Visible = true;
m_btnStop->Enabled = true;
}
}
//---------------------------------------------------------------------------
void __fastcall TBaseForm::StopClick(TObject *Sender)
{
if( m_panelBarsShow->IsPlaying() ){
SetPlayTimer( false, m_tTimer, m_tAccuracy );
f_MM_Stop();
m_panelBarsShow->Play( false );
}
m_btnStop->Enabled = false;
m_btnPlay->Down = false;
m_btnPlay->Visible = true;
m_btnPause->Visible = false;
m_iStartBar = m_iLastStartBar;
m_dblStartPoint = m_dblLastStartPoint;
m_panelBarsShow->SetPlayPoint( m_iStartBar, (int)m_dblStartPoint );
ShowPlayTime();
}
//---------------------------------------------------------------------------
void __fastcall TBaseForm::PauseClick(TObject *Sender)
{
if( m_panelBarsShow->IsPlaying() ){
SetPlayTimer( false, m_tTimer, m_tAccuracy );
f_MM_Stop();
m_panelBarsShow->Play( false );
}
m_btnPlay->Visible = true;
m_btnPlay->Down = false;
m_btnPause->Visible = false;
}
//---------------------------------------------------------------------------
void __fastcall TBaseForm::PlayTimeClick(TObject *Sender)
{
g_bShowPlayTick = !g_bShowPlayTick;
if( m_lblPlayTime->Caption.Compare("--:--:---")!=0 )
ShowPlayTime();
if( g_bShowPlayTick ){
m_lblPlayTime->Hint = "当前位置(节拍)";
}
else{
m_lblPlayTime->Hint = "当前位置(时间)";
}
}
//---------------------------------------------------------------------------
void __fastcall TBaseForm::BtnKeyChangeClick(TObject *Sender)
{
HidePopControls();
if( !m_lbKeySelect->Visible ){
m_btnKeyChange->Down = true;
if( m_lbKeySelect->ItemIndex != g_iMelodyKey )
m_lbKeySelect->ItemIndex = g_iMelodyKey;
m_lbKeySelect->Show();
m_lbKeySelect->SetFocus();
}
}
//---------------------------------------------------------------------------
void __fastcall TBaseForm::LBKeySelectMouseDown(TObject *Sender, TMouseButton Button, TShiftState Shift, int X, int Y)
{
if( X>=0 && X < m_lbKeySelect->Width && Y>=0 && Y<m_lbKeySelect->Height ){
int iKey = m_lbKeySelect->ItemIndex;
if( iKey>=0 && iKey!=g_iMelodyKey ){
if( m_panelBarsShow->IsPlaying() ){
StopClick(NULL);
}
g_iMelodyKey = iKey;
m_lblKey->Caption = g_strMelodyKey[g_iMelodyKey];
if( g_bPredefine ){
g_bComposeLoaded = false;
}
else{
SetWavNotes();
ClearGlobalVars( LIST_MELODYCHORDS | LIST_MELODYSTAGES |
LIST_COMPOSESTAGES | LIST_COMPLETEVOLS );
}
ReloadBaseCompose();
//切换调要调整
if( g_iShowType ) {
OnChangeChordMode(NULL);//ChangeBtnTag();
}
g_iComposeKey = g_iMelodyKey;
m_panelBarsShow->SetFocusCell( -1, 0 );
EnableChordModify( false, -1, 0, 0 );
m_panelBarsShow->InitialVars();
// m_btnReload->Enabled = false;
}
}
HidePopList( m_lbKeySelect );
}
//---------------------------------------------------------------------------
void TBaseForm::HidePopList(CommonListBoxUnit::TListBox* pList)
{
if( pList==m_lbKeySelect )
m_btnKeyChange->Down = false;
pList->Hide();
m_panelBarsShow->SetFocus();
}
//---------------------------------------------------------------------------
void __fastcall TBaseForm::BtnVolSetClick(TObject *Sender)
{
if( Sender==m_btnVolAudioSet ){
if( m_panelAudioVolSet->Visible ){
m_panelAudioVolSet->Hide();
m_btnVolAudioSet->Down = false;
}
else{
m_panelAudioVolSet->Show();
m_btnVolAudioSet->Down = true;
}
}
else if( Sender==m_btnVolMusicSet ){
if( m_panelMusicVolSet->Visible ){
m_panelMusicVolSet->Hide();
m_btnVolMusicSet->Down = false;
}
else{
m_panelMusicVolSet->Show();
m_btnVolMusicSet->Down = true;
}
}
}
//---------------------------------------------------------------------------
void __fastcall TBaseForm::ImgVolSetMouseDown(TObject *Sender, TMouseButton Button, TShiftState Shift, int X, int Y)
{
if( Button==mbLeft && X>8 && X<24 && Y>=16 && Y<=116 ){
int yPos = Y - 16;
if( Sender==m_imgAudioVolSet ){
m_nAudioVolPos = yPos;
m_btnAudioVolPos->Top = yPos + 5;
m_btnAudioVolPos->Hint = IntToStr(100-m_nAudioVolPos);
g_fAudioVolume = (100-m_nAudioVolPos)/100.0;
f_MM_SetStreamVolume( 2, g_fAudioVolume );
}
else{
m_nMusicVolPos = yPos;
m_btnMusicVolPos->Top = yPos + 5;
m_btnMusicVolPos->Hint = IntToStr(100-m_nMusicVolPos);
g_fMusicVolume = (100-m_nMusicVolPos)/100.0;
f_MM_SetStreamVolume( 3, g_fMusicVolume );
}
}
}
//---------------------------------------------------------------------------
void __fastcall TBaseForm::BtnVolPosMouseDown(TObject *Sender, TMouseButton Button, TShiftState Shift, int X,
int Y)
{
if( Button==mbLeft ){
m_bPosDraging = true;
m_yPosDragBegin = Y;
((TPNGButton*)Sender)->Hint = "";
}
}
//---------------------------------------------------------------------------
void __fastcall TBaseForm::BtnVolPosMouseMove(TObject *Sender, TShiftState Shift, int X, int Y)
{
if( m_bPosDraging==true ){
int yPos = (Sender==m_btnAudioVolPos)?m_nAudioVolPos:m_nMusicVolPos;
yPos += Y - m_yPosDragBegin;
if( yPos<0 )
yPos = 0;
else if( yPos>100 )
yPos = 100;
if( Sender==m_btnAudioVolPos ){
m_nAudioVolPos = yPos;
m_btnAudioVolPos->Top = yPos + 5;
}
else{
m_nMusicVolPos = yPos;
m_btnMusicVolPos->Top = yPos + 5;
}
}
}
//---------------------------------------------------------------------------
void __fastcall TBaseForm::BtnVolPosMouseUp(TObject *Sender, TMouseButton Button, TShiftState Shift, int X, int Y)
{
if( Button==mbLeft && m_bPosDraging ){
m_bPosDraging = false;
if( Sender==m_btnAudioVolPos ){
m_btnAudioVolPos->Hint = IntToStr(100-m_nAudioVolPos);
g_fAudioVolume = (100-m_nAudioVolPos)/100.0;
f_MM_SetStreamVolume( 2, g_fAudioVolume );
}
else{
m_btnMusicVolPos->Hint = IntToStr(100-m_nMusicVolPos);
g_fMusicVolume = (100-m_nMusicVolPos)/100.0;
f_MM_SetStreamVolume( 3, g_fMusicVolume );
}
}
}
//---------------------------------------------------------------------------
void __fastcall TBaseForm::ApartClick(TObject *Sender)
{
HidePopControls();
m_btnApart->Down = !m_btnApart->Down;
m_btnCombine->Down = false;
m_panelBarsShow->SetFocusCell( -1, 0 );
EnableChordModify( false, -1, 0, 0 );
}
//---------------------------------------------------------------------------
void __fastcall TBaseForm::CombineClick(TObject *Sender)
{
HidePopControls();
m_btnApart->Down = false;
m_btnCombine->Down = !m_btnCombine->Down;
m_panelBarsShow->SetFocusCell( -1, 0 );
EnableChordModify( false, -1, 0, 0 );
}
//---------------------------------------------------------------------------
void __fastcall TBaseForm::BarsShowMouseDown(TObject *Sender, TMouseButton Button, TShiftState Shift, int X, int Y)
{
if( m_panelAudioVolSet->Visible ){
m_panelAudioVolSet->Hide();
m_btnVolAudioSet->Down = false;
}
if( m_panelMusicVolSet->Visible ){
m_panelMusicVolSet->Hide();
m_btnVolMusicSet->Down = false;
}
if( m_lbKeySelect->Visible ){
m_lbKeySelect->Hide();
m_btnKeyChange->Down = false;
}
// if( !m_btnReload->Down ){
if( m_btnApart->Enabled && m_btnApart->Down || m_btnCombine->Enabled && m_btnCombine->Down ){
X += 11;
Y += 7;
}
int iHitType = -1;
DWORD dwHit = m_panelBarsShow->HitTest( X, Y, iHitType );
int iHitBar = LOWORD(dwHit),
iHitPoint = HIWORD(dwHit);
if( iHitType==2 && !m_btnApart->Down && !m_btnCombine->Down ){ //选中和弦
m_bCanErase = (g_iMelodyTimeSignature==0) && (iHitPoint>POINTS_PER_BAR/2);
if( m_panelBarsShow->SetFocusCell( iHitBar, m_bCanErase ) ){
int iMainKey, iAjustKey, iChordType;
m_panelBarsShow->GetFocusChord(iMainKey, iAjustKey, iChordType);
EnableChordModify( true, iMainKey, iAjustKey, iChordType );
m_dwOriginChord = MAKELONG( iMainKey, MAKEWORD( iAjustKey, iChordType ) );
}
}
else{
m_bCanErase = false;
m_panelBarsShow->SetFocusCell( -1, 0 );
EnableChordModify( false, -1, 0, 0 );
}
if( iHitType>0 && Button==mbLeft && Sender==m_panelBarsShow ){
BarsLButtonDown( iHitType, iHitBar, iHitPoint );
}
else if( Button==mbRight && !m_btnApart->Down && !m_btnCombine->Down &&
( iHitType>0 || iHitType==0 && Sender!=m_panelBarsShow )){
TPoint point(X,Y);
point = m_panelBarsShow->ClientToScreen(point);
BarsRButtonDown( iHitType, iHitBar, iHitPoint, point.x, point.y );
}
// }
}
//---------------------------------------------------------------------------
void __fastcall TBaseForm::BarsShowMouseMove(TObject *Sender, TShiftState Shift, int X, int Y)
{
bool bHitTest = false;
if( m_btnApart->Enabled && m_btnApart->Down ){
m_panelBarsShow->Cursor = crApart;
bHitTest = true;
}
else if( m_btnCombine->Enabled && m_btnCombine->Down ){
m_panelBarsShow->Cursor = crCombine;
bHitTest = true;
}
else if( m_panelBarsShow->Cursor!=crDefault ){
m_panelBarsShow->Cursor = crDefault;
}
if( bHitTest ){
X += 11;
Y += 7;
int iHitType = -1;
DWORD dwHit = m_panelBarsShow->HitTest( X, Y, iHitType );
if( iHitType>0 ){
int iHitBar = LOWORD(dwHit),
iHitPoint = HIWORD(dwHit);
if( m_btnApart->Down ){
m_panelBarsShow->SetApartPos( iHitBar, iHitPoint, true );
}
else{
m_panelBarsShow->SetCombinePos( iHitBar, iHitPoint, true );
}
}
else{
if( m_btnApart->Down ){
m_panelBarsShow->SetApartPos( -1, 0, true );
}
else{
m_panelBarsShow->SetCombinePos( -1, 0, true );
}
}
}
}
//---------------------------------------------------------------------------
void __fastcall TBaseForm::BtnMainKeyClick(TObject *Sender)
{
int iMainKey=-1, iChordType=0, iAjustKey=0; //得到要修改的和弦
TPNGButton * pBtn = (TPNGButton *)Sender;
if( pBtn->Down ){
if( !m_bCanErase )
return;
}
else{
iMainKey = pBtn->Tag;
}
pBtn->Down = !pBtn->Down;
if( iMainKey>=0 ){
int iMain = iMainKey;
if( g_iShowType ){
int iKey = iMain<3 ? iMain * 2 : iMain * 2 -1 ;
iKey -= g_iMelodyKey;
if( iKey<0 ) iKey += 12;
switch( iKey ){
case 1 : case 3 : case 6 : case 8 : case 10:
if( iMainKey==3 )
iKey++;
else if( iMainKey==1 || iMainKey==2 || iMainKey==5 || iMainKey==6 )
iKey--;
break;
}
switch( iKey ){
case 0 : iMain = 0; break;
case 1 : iAjustKey = -1;
case 2: iMain = 1; break;
case 3 : iAjustKey = -1;
case 4: iMain = 2; break;
case 6: iAjustKey = 1;
case 5 : iMain = 3; break;
case 7 : iMain = 4; break;
case 8 : iAjustKey = -1;
case 9: iMain = 5; break;
case 10: iAjustKey = -1;
case 11:iMain = 6; break;
}
}
switch( iMain ){
case 1: case 2: case 5: if( iAjustKey==0 ) iChordType = 1; break;
case 6: if( iMainKey!=0 && iMainKey!=3 && iMainKey!=4 ) iAjustKey = -1;
default : iChordType = 0; break;
}
iMainKey = iMain;
}
SetSelectKey( iMainKey, iAjustKey );
SetChordType( iChordType );
m_panelBarsShow->SetFocusChord( iMainKey, iAjustKey, iChordType );
}
//---------------------------------------------------------------------------
void __fastcall TBaseForm::BtnAjustKeyClick(TObject *Sender)
{
TPNGButton * pBtn = (TPNGButton *)Sender;
pBtn->Down = !pBtn->Down;
int iAjustKey = pBtn->Down ? pBtn->Tag : 0,
iMainKey = GetMainKey();
if( g_iShowType ){
int iKey = iMainKey<3 ? iMainKey * 2 : iMainKey * 2 - 1;
iKey += iAjustKey - g_iMelodyKey;
if( iKey>11 ) iKey -= 12;
else if( iKey<0 ) iKey += 12;
iMainKey = 0, iAjustKey = 0;
switch( iKey ){
case 1 : iAjustKey = -1;
case 2: iMainKey = 1;
break;
case 3 : iAjustKey = -1;
case 4: iMainKey = 2;
break;
case 6: iAjustKey = 1;
case 5 : iMainKey = 3;
break;
case 7 : iMainKey = 4;
break;
case 8 : iAjustKey = -1;
case 9: iMainKey = 5;
break;
case 10: iAjustKey = -1;
case 11:iMainKey = 6;
break;
}
}
m_panelBarsShow->SetFocusChord( iMainKey, iAjustKey, GetChordType() );
}
//---------------------------------------------------------------------------
void __fastcall TBaseForm::BtnChordTypeClick(TObject *Sender)
{
int iChordType=0;
TPNGButton * pBtn = (TPNGButton *)Sender;
pBtn->Down = !pBtn->Down;
if( pBtn->Down ) iChordType = pBtn->Tag;
for( int i=0; i<3; i++ ){
m_lstChordTypes[i]->Down = iChordType==m_lstChordTypes[i]->Tag;
}
int iMainKey=-1, iAjustKey=0;
GetSelectKey( iMainKey, iAjustKey );
m_panelBarsShow->SetFocusChord( iMainKey, iAjustKey, iChordType );
}
//---------------------------------------------------------------------------
/*
bool TBaseForm::BaseCompose()
{
bool bRet = GenerateBaseCompose( Handle );
// m_btnReload->Enabled = false;
// m_btnApart->Enabled = g_lstMelodyStages.size()<g_lstMelodyBars.size();
// m_btnCombine->Enabled = g_lstMelodyStages.size()>1;
return bRet;
}
//---------------------------------------------------------------------------
*/
void TBaseForm::ShowPlayTime()
{
char strTime[10];
GetPlayTime( m_iStartBar, m_dblStartPoint, strTime );
m_lblPlayTime->Caption = strTime;
}
//---------------------------------------------------------------------------
void TBaseForm::EnableChordModify( bool bEnable, int iMainKey, int iAjustKey, int iChordType )
{
for( int i=0; i<7; i++ ){
m_lstMainKeys[i]->Enabled = bEnable;
m_lstMainKeys[i]->Down = false;//(bEnable && i==iMainKey);
}
for( int i=0; i<3; i++ ){
m_lstChordTypes[i]->Enabled = bEnable;
m_lstChordTypes[i]->Down = bEnable && iChordType==m_lstChordTypes[i]->Tag;
}
if( iMainKey<0 ){
for( int i=0; i<2; i++ ){
m_lstAjustKeys[i]->Enabled = false;
m_lstAjustKeys[i]->Down = false;
}
}
else{
SetSelectKey( iMainKey, iAjustKey );
}
}
//---------------------------------------------------------------------------
int TBaseForm::GetMainKey()
{
int ret = -1;
for( int i=0; i<7; i++ ){
if( m_lstMainKeys[i]->Down ){
ret = i;
break;
}
}
return ret;
}
//---------------------------------------------------------------------------
int TBaseForm::GetAjustKey()
{
int ret = 0;
for( int i=0; i<2; i++ ){
if( m_lstAjustKeys[i]->Down ){
ret = m_lstAjustKeys[i]->Tag;
}
}
return ret;
}
//---------------------------------------------------------------------------
int TBaseForm::GetChordType()
{
int ret = 0;
for( int i=0; i<3; i++ ){
if( m_lstChordTypes[i]->Down ){
ret = m_lstChordTypes[i]->Tag;
break;
}
}
return ret;
}
//---------------------------------------------------------------------------
void TBaseForm::SetChordType( int iType )
{
for( int i=0; i<3; i++ ){
m_lstChordTypes[i]->Down = m_lstChordTypes[i]->Tag==iType;
}
}
//---------------------------------------------------------------------------
void TBaseForm::BarsLButtonDown( int iHitType, int iHitBar, int iHitPoint )
{
m_panelBarsShow->SetFocus();
if( m_btnApart->Enabled && m_btnApart->Down ){
if( m_panelBarsShow->SetApartPos( iHitBar, iHitPoint ) ){
m_btnApart->Enabled = g_lstMelodyStages.size()<g_lstMelodyBars.size();
m_btnCombine->Enabled = g_lstMelodyStages.size()>1;
m_btnApart->Down = false;
Perform( UM_RELOAD, 0, 0 );
}
}
else if( m_btnCombine->Enabled && m_btnCombine->Down ){
if( m_panelBarsShow->SetCombinePos( iHitBar, iHitPoint ) ){
m_btnApart->Enabled = g_lstMelodyStages.size()<g_lstMelodyBars.size();
m_btnCombine->Enabled = g_lstMelodyStages.size()>1;
m_btnCombine->Down = false;
Perform( UM_RELOAD, 0, 0 );
}
}
else if( iHitType==1 ){ //设置播放位置
if( m_panelBarsShow->IsPlaying() ){
SetPlayTimer( false, m_tTimer, m_tAccuracy );
f_MM_Stop();
}
m_iLastStartBar = m_iStartBar = iHitBar;
m_dblLastStartPoint = m_dblStartPoint = iHitPoint;
m_panelBarsShow->SetPlayPoint( m_iStartBar, (int)m_dblStartPoint );
ShowPlayTime();
if( m_panelBarsShow->IsPlaying() ){
ReloadBaseCompose();
double dblComposeStartPoint = m_iStartBar + m_dblStartPoint / POINTS_PER_BAR ;
f_MM_Play( Handle, dblComposeStartPoint, TYPE_AUDIO_BASECOMPOSE );
SetPlayTimer( true, m_tTimer, m_tAccuracy, Handle );
}
}
}
//---------------------------------------------------------------------------
void TBaseForm::BarsRButtonDown( int iHitType, int iHitBar, int iHitPoint, int X, int Y )
{
m_pPopMenu->ClearMenuItem();
m_pPopMenu->Tag = MAKELONG( iHitBar, iHitPoint );
if( iHitType==0 ){ //设置段落伴奏类型
int iStage = m_panelBarsShow->FindStage( iHitBar );
MELODYSTAGE* pStage = g_lstMelodyStages[iStage];
int iVar = pStage->iVar;
for( int i=0; i<STAGE_VAR_NUM; i++ ){
bool bChecked = false;
if( iVar==i ) bChecked = true;
String strText = "伴奏类型 " + IntToStr( i+1 );
m_pPopMenu->CreateCustomMenuItem( strText, OnSelectStageVar, -1, true, bChecked, i|SHOW_STAGE_VAR );
}
}
else if( iHitType==1 ){ //设置加花类型
MELODYBAR *pBar = g_lstMelodyBars[iHitBar];
int iFill = pBar->iFill;
for( int i=0; i<COMPOSE_FILL_NUM; i++ ){
bool bChecked = false;
if( iFill==i ) bChecked = true;
String strText = "加花-" + IntToStr( i+1 );
m_pPopMenu->CreateCustomMenuItem( strText, OnSelectBarFill, -1, true, bChecked, i );
}
}
else if( iHitType==2 ){ //选中和弦,提示删除和弦
bool bEnabled = false;
if( g_iMelodyTimeSignature==0 && iHitPoint>POINTS_PER_BAR/2 ){
int iMainKey, iAjustKey, iChordType;
if( m_panelBarsShow->GetFocusChord( iMainKey, iAjustKey, iChordType )>=0 )
bEnabled = true;
}
m_pPopMenu->CreateCustomMenuItem( "删除和弦", OnDeleteChord, -1, bEnabled, false, 0 );
bEnabled = !g_bPredefine && m_panelBarsShow->HasChordSet();
m_pPopMenu->CreateCustomMenuItem( "重置全部和弦", OnDeleteChord, -1, bEnabled, false, 1 );
m_pPopMenu->CreateCustomMenuItem( "-" );
m_pPopMenu->CreateCustomMenuItem( "罗马数字显示", OnChangeChordMode, -1,
true, !g_iShowType, 2);
m_pPopMenu->CreateCustomMenuItem( "英文字母显示", OnChangeChordMode, -1,
true, g_iShowType, 3 );
}
m_pPopMenu->Popup(X, Y);
}
//---------------------------------------------------------------------------
void __fastcall TBaseForm::OnSelectStageVar( TObject* Sender )
{
TMenuItem* pItem = (TMenuItem*)Sender;
if( !pItem->Checked ){
int iSetBar = LOWORD( m_pPopMenu->Tag );
int iSetStage = m_panelBarsShow->FindStage( iSetBar );
m_panelBarsShow->SetStageVar( iSetStage, pItem->Tag & 0xFFFF );
}
}
//---------------------------------------------------------------------------
void __fastcall TBaseForm::OnSelectBarFill( TObject* Sender )
{
TMenuItem* pItem = (TMenuItem*)Sender;
int iSetBar = LOWORD( m_pPopMenu->Tag );
int iFill = pItem->Tag;
if( pItem->Checked )//取消原状态
iFill = -1;
m_panelBarsShow->SetBarFill( iSetBar, iFill );
}
//---------------------------------------------------------------------------
void __fastcall TBaseForm::OnDeleteChord( TObject* Sender )
{
TMenuItem* pItem = (TMenuItem*)Sender;
if( pItem && pItem->Tag>0 ){
m_panelBarsShow->DeleteAllChord();
}
else{
m_panelBarsShow->SetFocusChord( -1, 0, 0 );
EnableChordModify( true, -1, 0, 0 );
}
}
//---------------------------------------------------------------------------
void __fastcall TBaseForm::OnChangeChordMode( TObject* Sender )
{
int iMain = -1, iAdjust = 0;
if( Sender ){
TPopMenu* ptp = (TPopMenu*)Sender;
if( !g_iShowType && ptp->Tag == 2)
return ;
if( g_iShowType && ptp->Tag == 3 )
return ;
GetSelectKey( iMain, iAdjust );
g_iShowType = !g_iShowType;
}
TPngImage **pimg = g_iShowType ? m_aImagKeyEG : m_aImagKeyLM;
//切换图片
for(int i = 0; i < 7 ; i++){
m_lstMainKeys[i]->SetPngImg(pimg[i]);
}
SetSelectKey( iMain, iAdjust );
//刷新和弦、刷新KEY
for( int i = 0; i < 7; i++ )
m_lstMainKeys[i]->Invalidate();
m_panelBarsShow->Invalidate();
}
//---------------------------------------------------------------------------
void __fastcall TBaseForm::ChangeChordMode( bool bAlpha )
{
int iMain = -1, iAdjust = 0;
GetSelectKey( iMain, iAdjust );
g_iShowType = bAlpha;
TPngImage **pimg = g_iShowType ? m_aImagKeyEG : m_aImagKeyLM;
//切换图片
for(int i = 0; i < 7 ; i++){
m_lstMainKeys[i]->SetPngImg(pimg[i]);
}
SetSelectKey( iMain, iAdjust );
//刷新和弦、刷新KEY
for( int i = 0; i < 7; i++ )
m_lstMainKeys[i]->Invalidate();
m_panelBarsShow->Invalidate();
}
//---------------------------------------------------------------------------
void TBaseForm::SetSelectKey( int iMain, int iAdjust )
{
if( iMain<0 ){
for( int i=0; i<2; i++ ){
m_lstAjustKeys[i]->Enabled = false;
m_lstAjustKeys[i]->Down = false;
}
}
else if( !g_iShowType ){
if( iMain==0 || iMain==4 ){
m_lstAjustKeys[0]->Enabled = false;
m_lstAjustKeys[1]->Enabled = false;
}
else if( iMain==3 ){
m_lstAjustKeys[0]->Enabled = true;
m_lstAjustKeys[1]->Enabled = false;
}
else{
m_lstAjustKeys[0]->Enabled = false;
m_lstAjustKeys[1]->Enabled = true;
}
}
else{
int iKey = iMain < 3 ? iMain * 2 : iMain * 2 - 1;
iKey += iAdjust + g_iMelodyKey;
if( iKey>11 ) iKey -= 12;
if( iKey==0 || iKey==7 ){
m_lstAjustKeys[0]->Enabled = false;
m_lstAjustKeys[1]->Enabled = false;
}
else if( iKey==5 || iKey==6 ){
m_lstAjustKeys[0]->Enabled = true;
m_lstAjustKeys[1]->Enabled = false;
}
else{
m_lstAjustKeys[0]->Enabled = false;
m_lstAjustKeys[1]->Enabled = true;
}
iMain = 0;
switch( iKey ){
case 1 : case 2: iMain = 1;break;
case 3 : case 4: iMain = 2;break;
case 5 : case 6: iMain = 3;break;
case 7 : iMain = 4;break;
case 8 : case 9: iMain = 5;break;
case 10: case 11:iMain = 6;break;
}
iAdjust = 0;
switch( iKey ){
case 1: case 3: case 8: case 10: iAdjust = -1; break;
case 6: iAdjust = 1; break;
}
}
for( int i=0; i<7; i++ ){
m_lstMainKeys[i]->Down = ( i==iMain );
}
for( int i=0; i<2; i++ ){
m_lstAjustKeys[i]->Down = ( m_lstAjustKeys[i]->Tag==iAdjust );
}
}
//---------------------------------------------------------------------------
void TBaseForm::GetSelectKey( int& iMain, int& iAdjust )
{
iMain = -1, iAdjust = 0;
for( int i=0; i<7; i++ ){
if( m_lstMainKeys[i]->Down ){
iMain = i;
break;
}
}
for( int i=0; i<2; i++ ){
if( m_lstAjustKeys[i]->Down ){
iAdjust = m_lstAjustKeys[i]->Tag;
break;
}
}
if( g_iShowType && iMain>=0 ){
int iKey = iMain<3 ? iMain * 2 : iMain * 2 -1;
iKey += iAdjust - g_iMelodyKey;
if( iKey<0 ) iKey += 12;
iMain = 0;
switch( iKey ){
case 1 : case 2: iMain = 1;break;
case 3 : case 4: iMain = 2;break;
case 5 : case 6: iMain = 3;break;
case 7 : iMain = 4;break;
case 8 : case 9: iMain = 5;break;
case 10: case 11:iMain = 6;break;
}
iAdjust = 0;
switch( iKey ){
case 1: case 3: case 8: case 10: iAdjust = -1; break;
case 6: iAdjust = 1; break;
}
}
}
//---------------------------------------------------------------------------
void __fastcall TBaseForm::UMMediaTime(TMessage &Message)
{
if( !m_panelBarsShow->IsPlaying() )
return;
int iBar = m_iStartBar;
double dblStartPoint = m_dblStartPoint + g_dblStep;
if( dblStartPoint>=(double)POINTS_PER_BAR ){
dblStartPoint -= POINTS_PER_BAR;
iBar++;
}
int iCurrPoint = (int)dblStartPoint;
if( iBar!=m_iStartBar || iCurrPoint!=(int)m_dblStartPoint ){
m_panelBarsShow->SetPlayPoint( iBar, (int)dblStartPoint );
if( iBar==g_lstMelodyBars.size() ){
StopClick(NULL);
return;
}
}
m_iStartBar = iBar;
m_dblStartPoint = dblStartPoint;
ShowPlayTime();
}
//---------------------------------------------------------------------------
/*
void __fastcall TBaseForm::UMEnableReload(TMessage &Message)
{
// m_btnReload->Enabled = Message.WParam;
}
//---------------------------------------------------------------------------
void __fastcall TBaseForm::BtnFontChangeClick(TObject *Sender)
{
if( m_btnApart->Down ){
m_btnApart->Down = false;
}
else if( m_btnCombine->Down ){
m_btnCombine->Down = false;
}
if( m_lbKeySelect->Visible ){
HidePopList( m_lbKeySelect );
}
if( !m_lbFontSelect->Visible ){
m_btnFontChange->Down = true;
if( m_lbFontSelect->ItemIndex != g_idFont )
m_lbFontSelect->ItemIndex = g_idFont;
m_lbFontSelect->Show();
m_lbFontSelect->SetFocus();
SetCapture( m_lbFontSelect->Handle );
}
else{
HidePopList( m_lbFontSelect );
}
}
//---------------------------------------------------------------------------
void __fastcall TBaseForm::LBFontSelectMouseDown(TObject *Sender, TMouseButton Button, TShiftState Shift, int X, int Y)
{
if( X>=0 && X < m_lbFontSelect->Width && Y>=0 && Y<m_lbFontSelect->Height ){
int iSel = m_lbFontSelect->ItemIndex;
if( iSel>=0 ){
if( iSel!=g_idFont ){
m_lblFontName->Caption = g_lstFonts[iSel]->strFontName;
if( f_MM_SetFont( g_lstFonts[iSel]->strFileName )==S_OK ){
g_idFont = iSel;
g_strFontFile = ExtractFileName(g_lstFonts[iSel]->strFileName).c_str();
}
}
}
}
HidePopList( m_lbFontSelect );
}
//---------------------------------------------------------------------------
*/
int TBaseForm::HidePopControls()
{
int iCount = 0;
if( m_btnApart->Down ){
m_btnApart->Down = false;
}
else if( m_btnCombine->Down ){
m_btnCombine->Down = false;
}
if( m_lbKeySelect->Visible ){
HidePopList( m_lbKeySelect );
iCount++;
}
if( m_panelMusicVolSet->Visible ){
m_panelMusicVolSet->Hide();
m_btnVolMusicSet->Down = false;
iCount++;
}
if( m_panelAudioVolSet->Visible ){
m_panelAudioVolSet->Hide();
m_btnVolAudioSet->Down = false;
iCount++;
}
if( g_lbFontSelect->Visible ){
g_lbFontSelect->Hide();
g_btnFontChange->Down = false;
iCount++;
}
return iCount;
}
//---------------------------------------------------------------------------
void __fastcall TBaseForm::FormKeyDown(TObject *Sender, WORD &Key, TShiftState Shift)
{
switch( Key ){
case VK_F9:
if( m_btnNextStep->Enabled ){
StepClick( m_btnNextStep );
}
break;
case VK_F8:
if( m_btnPrevStep->Enabled ){
StepClick( m_btnPrevStep );
}
break;
case ' ':
if( m_btnPause->Visible && m_btnPause->Enabled ){
PauseClick( NULL );
}
else if( m_btnPlay->Visible && m_btnPlay->Enabled ){
PlayClick( NULL );
}
break;
case VK_DELETE:
if( m_bCanErase ){
OnDeleteChord( NULL );
}
break;
case VK_UP: case VK_DOWN:
break;
case VK_RETURN:
if( m_lbKeySelect->Visible ){
int iSel = m_lbKeySelect->ItemIndex;
if( iSel>=0 && iSel!=g_iMelodyKey ){
if( m_panelBarsShow->IsPlaying() ){
StopClick(NULL);
}
g_iMelodyKey = iSel;
// m_panelBarsShow->SetMelodyKey( iSel );
m_lblKey->Caption = g_strMelodyKey[g_iMelodyKey];
SetWavNotes();
ClearGlobalVars( LIST_MELODYCHORDS | LIST_MELODYSTAGES |
LIST_COMPOSESTAGES | LIST_COMPLETEVOLS );
ReloadBaseCompose();
//切换调要调整
if( g_iShowType ) {
OnChangeChordMode(NULL);//ChangeBtnTag();
}
g_iComposeKey = g_iMelodyKey;
m_panelBarsShow->SetFocusCell( -1, 0 );
EnableChordModify( false, -1, 0, 0 );
m_panelBarsShow->InitialVars();
}
HidePopList( m_lbKeySelect );
}
break;
case VK_ESCAPE:
if( m_btnApart->Down ){
m_btnApart->Down = false;
}
else if( m_btnCombine->Down ){
m_btnCombine->Down = false;
}
else if( HidePopControls()==0 && m_btnMainKey0->Enabled ){
m_bCanErase = false;
m_panelBarsShow->SetFocusChord( LOWORD(m_dwOriginChord),
LOBYTE(HIWORD(m_dwOriginChord)),
HIBYTE(HIWORD(m_dwOriginChord)));
m_panelBarsShow->SetFocusCell( -1, 0 );
EnableChordModify( false, -1, 0, 0 );
}
break;
case 'W':
if( m_panelBarsShow->IsPlaying() ){
StopClick( NULL );
}
if( g_lstMelodyBars.size()>0 ){
m_iStartBar = m_iLastStartBar = 0;
m_dblStartPoint = m_dblLastStartPoint = 0;
m_panelBarsShow->SetPlayPoint( 0, 0 );
ShowPlayTime();
}
break;
case 'T':
if( m_btnStyleChange->Enabled ){
BtnStyleChangeClick( NULL );
}
break;
case 'K':
if( m_btnKeyChange->Enabled ){
BtnKeyChangeClick( NULL );
}
break;
case 'S':
if( m_btnApart->Enabled ){
ApartClick( NULL );
}
break;
case 'D':
if( m_btnCombine->Enabled ){
CombineClick( NULL );
}
break;
case '1': case '2': case '3': case '4': case '5': case '6': case '7':
{
TPNGButton * pBtn = m_lstMainKeys[Key-'1'];
if( pBtn->Enabled ){
BtnMainKeyClick( pBtn );
}
}
break;
case VK_NUMPAD1: case VK_NUMPAD2: case VK_NUMPAD3: case VK_NUMPAD4:
case VK_NUMPAD5: case VK_NUMPAD6: case VK_NUMPAD7:
{
TPNGButton * pBtn = m_lstMainKeys[Key-VK_NUMPAD1];
if( pBtn->Enabled ){
BtnMainKeyClick( pBtn );
}
}
break;
default:
break;
}
}
//---------------------------------------------------------------------------
void __fastcall TBaseForm::BtnStyleChangeClick(TObject *Sender)
{
StopClick((TObject*) m_btnStop);
HidePopControls();
if( m_btnApart->Down ){
m_btnApart->Down = false;
}
else if( m_btnCombine->Down ){
m_btnCombine->Down = false;
}
PostMessage( Handle, UM_SELECTSTYLE, 0, 0 );
}
//---------------------------------------------------------------------------
void __fastcall TBaseForm::UMSelectStyle(TMessage &msg)
{
StyleSelForm = new TStyleSelForm(this);
StyleSelForm->m_idSelected = g_iSelectedStyleID;
StyleSelForm->m_strName = g_strSelectedStyleName;
StyleSelForm->m_bBase = true;
StyleSelForm->m_iChordType = ( g_lstMelodyBars[0]->iChords[0] % CHORD_TYPE_NUM ) % 2;
StyleSelForm->ShowModal();
if( g_iSelectedStyleID!=StyleSelForm->m_idSelected ){
g_iSelectedStyleID = StyleSelForm->m_idSelected;
g_strSelectedStyleName = StyleSelForm->m_strName;
GenerateBaseCompose();
}
delete StyleSelForm;
m_lblStyleName->Caption = g_strSelectedStyleName.c_str();
Application->MainForm->Update();
}
//---------------------------------------------------------------------------
void __fastcall TBaseForm::UMReload(TMessage &msg)
{
if( m_panelBarsShow->IsPlaying() ){
SetPlayTimer( false, m_tTimer, m_tAccuracy );
f_MM_Stop();
}
BOOL bModified = g_bkMelody.CheckModified();
if( bModified & CHECK_BAR || bModified & CHECK_STAGE || bModified & CHECK_POS ){
ClearGlobalVars( LIST_COMPOSESTAGES | LIST_COMPLETEVOLS );
g_bComposeLoaded = false;
}
ReloadBaseCompose();
if( msg.WParam ){
int iMainKey, iAjustKey, iChordType;
int ret = m_panelBarsShow->GetFocusChord(iMainKey, iAjustKey, iChordType);
EnableChordModify( true, iMainKey, iAjustKey, iChordType );
m_dwOriginChord = MAKELONG( iMainKey, MAKEWORD( iAjustKey, iChordType ) );
}
if( m_panelBarsShow->IsPlaying() ){
double dblComposeStartPoint = m_iStartBar + m_dblStartPoint / POINTS_PER_BAR ;
f_MM_Play( Handle, dblComposeStartPoint, TYPE_AUDIO_BASECOMPOSE );
SetPlayTimer( true, m_tTimer, m_tAccuracy, Handle );
}
}
//---------------------------------------------------------------------------
void __fastcall TBaseForm::AudioEffectClick(TObject *Sender)
{
StopClick( NULL );
PostMessage(Application->MainFormHandle, UM_AUDIOEFFECT, WPARAM(0),LPARAM(0));
}
//---------------------------------------------------------------------------
void __fastcall TBaseForm::MicSetClick(TObject *Sender)
{
PostMessage(Application->MainFormHandle, UM_MICSETTING, WPARAM(0),LPARAM(0));
}
//---------------------------------------------------------------------------
void __fastcall TBaseForm::UMSetFontPosition(TMessage &msg)
{
if( g_btnFontChange && g_panelFontName && g_lbFontSelect ){
g_btnFontChange->Parent = this;
g_panelFontName->Parent = this;
g_lbFontSelect->Parent = this;
g_btnFontChange->Top = m_btnVolAudioSet->Top;
g_panelFontName->Top = g_btnFontChange->Top + 1;
g_lbFontSelect->Top = g_btnFontChange->Top - g_lbFontSelect->Height;
g_btnFontChange->Left = DPIX(451);//m_panelStyleName->Left + m_panelStyleName->Width + 20;
g_panelFontName->Left = g_btnFontChange->Left + g_btnFontChange->Width;
g_lbFontSelect->Left = g_panelFontName->Left;
}
}
//---------------------------------------------------------------------------
void __fastcall TBaseForm::UMHidePopControl(TMessage &msg)
{
HidePopControls();
}
//---------------------------------------------------------------------------