//--------------------------------------------------------------------------- #include #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 && YHeight ){ 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()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()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()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; iCreateCustomMenuItem( 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; iCreateCustomMenuItem( 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 && YHeight ){ 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(); } //---------------------------------------------------------------------------