//--------------------------------------------------------------------------- #include #pragma hdrstop #include "GlobalUnit.h" #include "ComposeFormUnit.h" #include "MessageFormUnit.h" #include "StyleSelFormUnit.h" #include "CommonListboxUnit.h" //--------------------------------------------------------------------------- #pragma package(smart_init) #pragma link "PNGButton" #pragma resource "*.dfm" TComposeForm *ComposeForm; static const TCursor crDropDisabled = 0x5B, crDeleteStage = 0x5C; extern TPNGButton *g_btnFontChange; extern Vcl::Extctrls::TPanel *g_panelFontName; extern CommonListBoxUnit::TListBox *g_lbFontSelect; //--------------------------------------------------------------------------- __fastcall TComposeForm::TComposeForm(TComponent* Owner) : TBackgroundForm(Owner) { m_iStartBar = m_iLastStartBar = m_nTotalBarNum = 0; m_dblStartPoint = m_dblLastStartPoint = 0; m_tTimer = m_tAccuracy = 0; } //--------------------------------------------------------------------------- void __fastcall TComposeForm::FormCreate(TObject *Sender) { SetTransparent( this ); 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_bmpDeleteNormal = new TBitmap(); m_bmpDeleteNormal->LoadFromResourceName(int(HInstance), L"ImgDeleteStageNormal"); m_bmpDeleteHover = new TBitmap(); m_bmpDeleteHover->LoadFromResourceName(int(HInstance), L"ImgDeleteStageHover"); m_imgDelete->Picture->Bitmap = m_bmpDeleteNormal; //创建拖动跟随图标 m_imgDrag = new TImage(this); m_imgDrag->Width =m_lbResource->Width; m_imgDrag->Height = m_lbResource->ItemHeight; m_imgDrag->Canvas->Font->Name = "黑体"; m_imgDrag->Canvas->Font->Size = m_lblKey->Font->Size;// int(9 * 96.0 / g_yDpi + 0.5); //初始化画布,避免首次复制小图后无法显示大图 m_imgDrag->Canvas->Rectangle( 0, 0, m_imgDrag->Width, m_imgDrag->Height ); m_xImgDrag = m_yImgDrag = 0; m_bDraging = false; m_iDragingIndex = -1; m_lbResource->SetDragImage( m_imgDrag ); m_lbCompose->SetDragImage( m_imgDrag ); m_panelBarsShow->SetDragImage( m_imgDrag ); m_pPopMenu = new TPopMenu(this); Screen->Cursors[crDropDisabled] = LoadCursor(HInstance, L"DisableDropCursor"); Screen->Cursors[crDeleteStage] = LoadCursor(HInstance, L"DeleteStageCur"); m_pTimerHint = new TTimer(this); m_pTimerHint->Enabled = false; m_pTimerHint->Interval = TIME_HINT; m_pTimerHint->OnTimer = HintTimerProc; m_pStageInfoWnd = new TSkinHintWindow(this); m_iHintStage = -1; m_pHintObject = NULL; // m_btnAPR->Enabled = g_bAPRAvaliable; } //--------------------------------------------------------------------------- void __fastcall TComposeForm::FormDestroy(TObject *Sender) { if( m_panelBarsShow->IsPlaying() ) StopClick( NULL ); if( m_pPopMenu ) delete m_pPopMenu; delete m_pTimerHint; delete m_pStageInfoWnd; delete m_bmpDeleteNormal; delete m_bmpDeleteHover; } //--------------------------------------------------------------------------- void __fastcall TComposeForm::FormResize(TObject *Sender) { int wOriClient = 798, hOriClient = 494; m_btnPrevStep->Top = Height - ( hOriClient - 460 ); m_btnNextStep->Top = m_btnPrevStep->Top; m_btnNextStep->Left = ClientWidth - ( wOriClient - 705 ); m_imgBreakH->Width = Width - 28; m_imgBreakI->Left = Width - ( wOriClient - 649 ); m_btnAudioEffect->Left = m_imgBreakI->Left - 60; m_btnVolAudioSet->Top = Height - ( 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_iResListTop = m_panelBarsShow->Top; m_panelAudioVolSet->Top = Height - (hOriClient - 322); m_panelMusicVolSet->Top = m_panelAudioVolSet->Top; m_panelMusicInfo->Left = Width - ( wOriClient - 666 ); int barLeft = m_panelListIcon->Visible ? m_panelListIcon->Width : m_lbCompose->Width; int barWidth = Width - (m_panelListIcon->Visible ? m_panelListIcon->Width : m_lbCompose->Width); m_panelBarsShow->SetBounds( barLeft, m_panelBarsShow->Top, barWidth, Height - 84 ); //计算列表框大小 CalcListSize(); } //--------------------------------------------------------------------------- void __fastcall TComposeForm::FormActivate(TObject *Sender) { if( Sender ){ return; } m_lblBeat->Caption = g_strTimeSignature[g_iMelodyTimeSignature]; m_lblTempo->Caption = IntToStr( g_nMelodyTempo ); //调的显示 if( g_iMelodyKey>=0 ){ m_lblKey->Caption = g_strMelodyKey[g_iMelodyKey]; m_lblDiao->Visible = true; } else{ m_lblKey->Caption = "-"; m_lblDiao->Visible = false; } //风格名、音色库名、音色选择 m_lblStyleName->Caption = g_strSelectedStyleName.data(); // m_btnAPR->Down = g_bAPRActive; if( !g_bBaseComposeLoaded){ ReloadBaseCompose(); // g_bBaseComposeLoaded = false; } //检测风格的变动 bool bStyleChanged = UpdateSegmentBars(); if( m_lbCompose->GetCount() != g_lstComposeStages.size()) { m_lbResource->Clear(); m_lbCompose->Clear(); } if( g_lstComposeStages.size()==0 /*|| m_lbCompose->GetCount() != g_lstComposeStages.size()*/){ g_bkCompose.Clear(); InitComposeStage(); ReloadCompose(); m_lbResource->Clear(); m_lbCompose->Clear(); } else{ //检测前间奏小节数的变动 bool bBarChanged = false; if( bStyleChanged ){ bBarChanged = UpdateStageBars(); if( bBarChanged ){ // m_lbResource->Clear(); // m_lbCompose->Clear(); ClearGlobalVars( LIST_COMPLETEVOLS ); } } //检测和弦的变动 // BOOL bChordModified = m_panelBarsShow->CheckModify(CHECK_CHORD) & CHECK_CHORD; if( bBarChanged || !g_bComposeLoaded ){ g_bkCompose.Clear(); ReloadCompose(); // GenerateCompose( g_iMelodyKey, bBarChanged || !g_bSongNeedSave ); // g_bkCompose.Backup(); // m_panelBarsShow->BackupModify(); m_lbResource->Clear(); m_lbCompose->Clear(); } else{ f_MM_SetStreamVolume( 4, g_fMusicVolume ); f_MM_SetStreamVolume( 5, g_fAudioVolume ); } } // m_panelBarsShow->BackupModify(); // m_btnReload->Enabled = false; //初始化资源列表框 if( m_lbResource->Count==0 ){ InitResourceList(); } //初始化资源列表后计算列表框大小 CalcListSize(); if( m_lbCompose->Count==0 ){ ResetComposeList(); } //段落列表设置后初始化小节显示 m_panelBarsShow->InitialVars(); //显示资源及曲式窗口 if( !m_panelListIcon->Visible ){ m_panelResource->Show(); m_btnResourceMin->Show(); m_btnResourceMax->Hide(); m_btnResourceClose->Hide(); m_lbResource->Invalidate(); m_panelCompose->Show(); m_btnComposeMin->Show(); m_btnComposeMax->Hide(); m_btnComposeClose->Hide(); m_lbCompose->Invalidate(); } m_nTotalBarNum = m_panelBarsShow->ComposeBarCount(); 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_lbResource->ClearSelection(); m_lbCompose->ClearSelection(); SetFocusStage( -1 ); Invalidate(); } //--------------------------------------------------------------------------- void __fastcall TComposeForm::FormDeactivate(TObject *Sender) { if( Application->ActiveFormHandle!=Application->MainFormHandle ){ return; } StopClick( NULL ); g_bCanStep = true; if( Sender ){ if( !g_lstComposeStages.size()){ MessageForm->ShowMessage(L"曲式结构不能为空!", MB_OK | MB_ICONERROR); g_bCanStep = false; }else{ ReloadCompose(); } } if( m_panelAudioVolSet->Visible ){ m_panelAudioVolSet->Hide(); m_btnVolAudioSet->Down = false; } if( m_panelMusicVolSet->Visible ){ m_panelMusicVolSet->Hide(); m_btnVolMusicSet->Down = false; } } //--------------------------------------------------------------------------- void __fastcall TComposeForm::StepClick(TObject *Sender) { PostMessage(Application->MainFormHandle, UM_JUMP_PAGE, Sender==m_btnNextStep?WPARAM(4):WPARAM(2),LPARAM(this)); } //--------------------------------------------------------------------------- void __fastcall TComposeForm::PlayClick(TObject *Sender) { ReloadCompose(); if( g_bRecProtect && g_bShowProtectMsg ){ MessageForm->ShowMessage( "使用收费风格,将可能听到随机杂音\n\n但不会影响保存的歌曲", MB_ICONINFORMATION|MB_OK|MB_UNCHECKED ); g_bShowProtectMsg = !MessageForm->GetCheckState(); Application->MainForm->Update(); } m_nTotalBarNum = m_panelBarsShow->ComposeBarCount(); double dblComposeStartPoint = m_iStartBar + m_dblStartPoint / POINTS_PER_BAR ; HRESULT hr = f_MM_Play( Handle, dblComposeStartPoint, TYPE_SONG_COMPOSE ); if( hr==S_OK && !m_panelBarsShow->IsPlaying() ){ 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 TComposeForm::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 TComposeForm::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 TComposeForm::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 TComposeForm::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 TComposeForm::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( 5, 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( 4, g_fMusicVolume ); } } } //--------------------------------------------------------------------------- void __fastcall TComposeForm::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 TComposeForm::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 TComposeForm::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( 5, g_fAudioVolume ); } else{ m_btnMusicVolPos->Hint = IntToStr(100-m_nMusicVolPos); g_fMusicVolume = (100-m_nMusicVolPos)/100.0; f_MM_SetStreamVolume( 4, g_fMusicVolume ); } } } //--------------------------------------------------------------------------- void __fastcall TComposeForm::BarsShowMouseDown(TObject *Sender, TMouseButton Button, TShiftState Shift, int X, int Y) { m_panelBarsShow->SetFocus(); if( Button!=mbLeft && Button!=mbRight ) return; if( m_iHintStage!=-1 ){ m_iHintStage = -1; m_pHintObject = NULL; m_pTimerHint->Enabled = false; m_pStageInfoWnd->ReleaseHandle(); } if( m_panelAudioVolSet->Visible ){ m_panelAudioVolSet->Hide(); m_btnVolAudioSet->Down = false; } if( m_panelMusicVolSet->Visible ){ m_panelMusicVolSet->Hide(); m_btnVolMusicSet->Down = false; } // if( !m_btnReload->Down ){ int iHitType = -1; DWORD dwHit = m_panelBarsShow->HitTest( X, Y, iHitType ); int iHitBar = LOWORD(dwHit), iHitPoint = HIWORD(dwHit); if( iHitType==2 || iHitType==0 && Sender!=m_panelBarsShow ){ int iStage = m_panelBarsShow->FindStage( iHitBar ); //设置选中段 m_lbResource->ClearSelection(); m_lbCompose->ItemIndex = iStage; SetFocusStage( iStage ); } else if( iHitType!=1 ){ m_lbResource->ClearSelection(); m_lbCompose->ClearSelection(); SetFocusStage( -1 ); } CheckOperationState(); if( iHitType>0 && Button==mbLeft && Sender==m_panelBarsShow ){ BarsLButtonDown( iHitType, iHitBar, iHitPoint, X, Y ); } else if( Button==mbRight && ( 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 TComposeForm::InitResourceList() { m_lbResource->Clear(); m_lbResource->Items->BeginUpdate(); String strText; for( int i=0; i0 ){ strText.printf( L"(%d小节)", g_arrIntroBarNum[i] ); m_lbResource->AddItem( g_strIntro[i]+strText, (TObject*)(COMPOSE_INTRO_1 + i) ); } } for( int i=0; iiVar]); m_lbResource->AddItem( strText, (TObject*)(MAKELONG(i, pMStage->iVar)) ); } for( int i=0; i0 ){ strText.printf( L"(%d小节)", g_arrEndingBarNum[i] ); m_lbResource->AddItem( g_strEnding[i]+strText, (TObject*)(COMPOSE_ENDING_1 + i) ); } } m_lbResource->Items->EndUpdate(); m_lbResource->Invalidate(); } //--------------------------------------------------------------------------- void TComposeForm::ResetComposeList() { m_lbCompose->Clear(); m_lbCompose->Items->BeginUpdate(); for( int i=0; iiMelodyStage>=COMPOSE_ENDING_1 ){ int iEnding = pCStage->iMelodyStage - COMPOSE_ENDING_1; strText.printf( L"(%d小节)", pCStage->nStageBars ); m_lbCompose->AddItem( g_strEnding[iEnding]+strText, (TObject*)pCStage->iMelodyStage ); } else if( pCStage->iMelodyStage>=COMPOSE_INTRO_1 ){ int iIntro = pCStage->iMelodyStage - COMPOSE_INTRO_1; strText.printf( L"(%d小节)", pCStage->nStageBars ); m_lbCompose->AddItem( g_strIntro[iIntro]+strText, (TObject*)pCStage->iMelodyStage ); } else{ strText = String(GetStageName( pCStage->iMelodyStage ).c_str()) + L"段 " + String(g_strStageVar[pCStage->iVar]); m_lbCompose->AddItem( strText, (TObject*)(MAKELONG(pCStage->iMelodyStage, pCStage->iVar)) ); } } m_lbCompose->Items->EndUpdate(); m_lbCompose->Invalidate(); } //--------------------------------------------------------------------------- /* bool TComposeForm::Compose(bool bCombineSong) { if( m_panelBarsShow->IsPlaying() ){ StopClick( NULL ); } bool bRet = GenerateCompose( g_iMelodyKey, bCombineSong ); // m_btnReload->Enabled = !bRet; return bRet; } //--------------------------------------------------------------------------- */ void TComposeForm::ShowPlayTime() { char strTime[10]; GetPlayTime( m_iStartBar, m_dblStartPoint, strTime ); m_lblPlayTime->Caption = strTime; } //--------------------------------------------------------------------------- void TComposeForm::BarsLButtonDown( int iHitType, int iHitBar, int iHitPoint, int X, int Y ) { 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() ){ ReloadCompose(); double dblComposeStartPoint = m_iStartBar + m_dblStartPoint / POINTS_PER_BAR ; f_MM_Play( Handle, dblComposeStartPoint, TYPE_SONG_COMPOSE ); SetPlayTimer( true, m_tTimer, m_tAccuracy, Handle ); } } else if( iHitType==2 ){ //开始拖动 int iStage = m_panelBarsShow->FindStage( iHitBar ); DrawDragImg( m_lbCompose, iStage ); SetCapture( m_panelBarsShow->Handle ); m_xImgDrag = - m_imgDrag->Width/2; m_yImgDrag = - m_imgDrag->Height/2; m_lbResource->SetDragState( true ); m_lbCompose->SetDragState( true ); m_panelBarsShow->SetDragState( true ); m_lbCompose->SetDragStage( false, iStage ); m_panelBarsShow->SetDragStage( false, iStage ); m_iDragingIndex = iStage; m_bDraging = true; m_btnAdd->ShowHint = false; m_btnMoveUp->ShowHint = false; m_btnMoveDown->ShowHint = false; } } //--------------------------------------------------------------------------- void TComposeForm::BarsRButtonDown( int iHitType, int iHitBar, int iHitPoint, int X, int Y ) { m_pPopMenu->ClearMenuItem(); if( iHitType==0 || iHitType==2 ){ //设置段落伴奏类型 int iStage = m_panelBarsShow->FindStage( iHitBar ); COMPOSESTAGE* pCStage = g_lstComposeStages[iStage]; if( pCStage->iMelodyStageiVar; for( int i=0; iCreateCustomMenuItem( strText, OnSelectStageVar, -1, true, bChecked, i|SHOW_STAGE_VAR ); } m_pPopMenu->CreateCustomMenuItem( "-" ); } if( pCStage->idStyle!=g_iSelectedStyleID ){ String strText = "全局风格 - "; strText += g_strSelectedStyleName.c_str(); m_pPopMenu->CreateCustomMenuItem( strText, OnSetStageStyle, -1, true, false, g_iSelectedStyleID ); } m_pPopMenu->CreateCustomMenuItem( "选择风格...", OnSetStageStyle ); m_pPopMenu->CreateCustomMenuItem( "-" ); m_pPopMenu->CreateCustomMenuItem( "移除段落", OnDeleteStage ); m_pPopMenu->Tag = iStage; } else if( iHitType==1 ){ //设置加花类型 int iFirstBar, iStage = m_panelBarsShow->FindStage( iHitBar, & iFirstBar ); COMPOSESTAGE* pCStage = g_lstComposeStages[iStage]; if( pCStage->iMelodyStageaFills.size(); i++ ){ int iPos = LOWORD(pCStage->aFills[i]), iType = HIWORD(pCStage->aFills[i]); if( iPos==iHitBar-iFirstBar ){ iFill = iType; break; } } for( int i=0; iCreateCustomMenuItem( strText, OnSelectBarFill, -1, true, bChecked, i ); } m_pPopMenu->Tag = iHitBar; } } m_pPopMenu->Popup(X, Y); } //--------------------------------------------------------------------------- void __fastcall TComposeForm::OnSelectStageVar( TObject* Sender ) { TMenuItem* pItem = (TMenuItem*)Sender; if( !pItem->Checked ){ int iSetStage = m_pPopMenu->Tag; int iVar = pItem->Tag & 0xFFFF; m_panelBarsShow->SetStageVar( iSetStage, iVar ); COMPOSESTAGE* pCStage = g_lstComposeStages[iSetStage]; String strText = String(GetStageName( pCStage->iMelodyStage ).c_str()) + L"段 " + String(g_strStageVar[pCStage->iVar]); m_lbCompose->Items->Strings[iSetStage] = strText; m_lbCompose->Items->Objects[iSetStage] = (TObject*)(MAKELONG(pCStage->iMelodyStage, iVar)); m_lbCompose->Invalidate(); } } //--------------------------------------------------------------------------- void __fastcall TComposeForm::OnSetStageStyle( TObject* Sender ) { TMenuItem* pItem = (TMenuItem*)Sender; int iSetStage = m_pPopMenu->Tag; int idStyle = pItem->Tag; StopClick(NULL); if( idStyle<=0 ){ PostMessage( Handle, UM_SELECTSTYLE, 0, 0 ); } else{ int iMelodyStage = g_lstComposeStages[iSetStage]->iMelodyStage; g_lstComposeStages[iSetStage]->idStyle = g_iSelectedStyleID; g_lstComposeStages[iSetStage]->strStyleName = ""; m_lblStyleName->Caption = g_strSelectedStyleName.c_str(); bool bBarChanged = UpdateStageBars(); if( bBarChanged ) g_bkCompose.Clear(); ReloadCompose(); // Compose( bBarChanged || !g_bSongNeedSave ); // m_panelBarsShow->BackupModify(); // m_btnReload->Enabled = false; //重置曲式列表框 if( bBarChanged ){ m_panelBarsShow->InitialVars(); int iSelIndex = m_lbCompose->ItemIndex; ResetComposeList(); m_lbCompose->ItemIndex = iSelIndex; m_nTotalBarNum = m_panelBarsShow->ComposeBarCount(); } Application->MainForm->Update(); } } //--------------------------------------------------------------------------- void __fastcall TComposeForm::OnSelectBarFill( TObject* Sender ) { TMenuItem* pItem = (TMenuItem*)Sender; int iSetBar = m_pPopMenu->Tag; int iFill = pItem->Tag; if( pItem->Checked )//取消原状态 iFill = -1; m_panelBarsShow->SetBarFill( iSetBar, iFill ); } //--------------------------------------------------------------------------- void __fastcall TComposeForm::OnAddStage( TObject* Sender ) { DWORD dwItemData = DWORD(m_lbResource->Items->Objects[m_pPopMenu->Tag]); AddStage( LOWORD(dwItemData) ); CheckOperationState(); } //--------------------------------------------------------------------------- void __fastcall TComposeForm::OnDeleteStage( TObject* Sender ) { DeleteStage( m_pPopMenu->Tag ); CheckOperationState(); } //--------------------------------------------------------------------------- void __fastcall TComposeForm::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 ){ if( iBar==m_nTotalBarNum ){ StopClick(NULL); return; } m_panelBarsShow->SetPlayPoint( iBar, (int)dblStartPoint ); } m_iStartBar = iBar; m_dblStartPoint = dblStartPoint; ShowPlayTime(); } //--------------------------------------------------------------------------- void __fastcall TComposeForm::UMReload(TMessage &msg) { if( msg.WParam ){ StopClick( NULL ); } if( m_panelBarsShow->IsPlaying() ){ SetPlayTimer( false, m_tTimer, m_tAccuracy ); f_MM_Stop(); } BOOL bModified = g_bkCompose.CheckModified(); if( bModified & CHECK_STAGE || bModified & CHECK_POS ){ ClearGlobalVars( LIST_COMPLETEVOLS ); g_bSongNeedSave = false; } ReloadCompose(); m_nTotalBarNum = m_panelBarsShow->ComposeBarCount(); if( m_panelBarsShow->IsPlaying() ){ double dblComposeStartPoint = m_iStartBar + m_dblStartPoint / POINTS_PER_BAR ; f_MM_Play( Handle, dblComposeStartPoint, TYPE_SONG_COMPOSE ); SetPlayTimer( true, m_tTimer, m_tAccuracy, Handle ); } } //--------------------------------------------------------------------------- /* void __fastcall TComposeForm::UMEnableReload(TMessage &Message) { if( g_lstComposeStages.size()==0 ){ // m_btnReload->Enabled = false; m_btnPlay->Enabled = false; } else{ // m_btnReload->Enabled = Message.WParam; if( !m_btnPlay->Enabled ) m_btnPlay->Enabled = true; if( ( Message.WParam & CHECK_POS || Message.WParam & CHECK_STAGE ) && m_panelBarsShow->IsPlaying() ){ StopClick( NULL ); m_iStartBar = m_iLastStartBar = 0; m_dblStartPoint = m_dblLastStartPoint = 0; m_panelBarsShow->SetPlayPoint( 0, 0 ); ShowPlayTime(); } } } //--------------------------------------------------------------------------- */ void TComposeForm::AddStage( int iMelodyStage ) { StopClick( NULL ); m_iStartBar = m_iLastStartBar = 0; m_dblStartPoint = m_dblLastStartPoint = 0; m_panelBarsShow->SetPlayPoint( 0, 0 ); ShowPlayTime(); m_lbCompose->AddStage( iMelodyStage ); m_panelBarsShow->AddStage( iMelodyStage ); } //--------------------------------------------------------------------------- void TComposeForm::DeleteStage( int iComposeStage ) { if( g_lstComposeStages.size()==1 ){ MessageForm->ShowMessage(L"曲式结构不能为空!", MB_OK | MB_ICONERROR); return; } StopClick( NULL ); m_iStartBar = m_iLastStartBar = 0; m_dblStartPoint = m_dblLastStartPoint = 0; m_panelBarsShow->SetPlayPoint( 0, 0 ); ShowPlayTime(); m_lbCompose->DeleteStage( iComposeStage ); m_panelBarsShow->DeleteStage( iComposeStage ); // UpdateGlobalStyle(); // m_lblStyleName->Caption = g_strSelectedStyleName.c_str(); } //--------------------------------------------------------------------------- void TComposeForm::DrawDragImg( TObject* Sender, int iSelIndex ) { TSkinListBox* pLBSender = (TSkinListBox*)Sender; TRect rcSel = pLBSender->ItemRect(iSelIndex); m_imgDrag->Width = rcSel.Width()-4; m_imgDrag->Height = rcSel.Height()-2; TRect rcDraw( 0, 0, m_imgDrag->Width, m_imgDrag->Height ); //绘制底色 COLORREF rColor; DWORD dwItemData = DWORD(pLBSender->Items->Objects[iSelIndex]); WORD iVar = HIWORD( dwItemData ); int iInd = LOWORD( dwItemData ); if( iInd>=COMPOSE_ENDING_1 ){ rColor = g_clrEnding[iInd-COMPOSE_ENDING_1]; } else if( iInd>=COMPOSE_INTRO_1 ){ rColor = g_clrIntro[iInd-COMPOSE_INTRO_1]; } else{ rColor = g_clrStage[iVar]; } m_imgDrag->Canvas->Brush->Color = rColor; m_imgDrag->Canvas->FillRect( rcDraw ); //绘制列表项文字 m_imgDrag->Canvas->Brush->Style = bsClear; String strText = pLBSender->Items->Strings[iSelIndex]; int nTextWidth = m_imgDrag->Canvas->TextWidth( strText ), nTextHeight = m_imgDrag->Canvas->TextHeight( strText ); if( nTextWidth>rcDraw.Width()-4 ){ strText = strText.SubString(0, 8) + "..."; nTextWidth = m_imgDrag->Canvas->TextWidth( strText ); } int x = rcDraw.left + ( rcDraw.Width() - nTextWidth ) / 2, y = rcDraw.top + ( rcDraw.Height() - nTextHeight ) / 2 + 1; m_imgDrag->Canvas->TextOut( x, y, strText ); } //--------------------------------------------------------------------------- void __fastcall TComposeForm::ListBoxMouseDown(TObject *Sender, TMouseButton Button, TShiftState Shift, int X, int Y) { if( m_iHintStage!=-1 ){ m_iHintStage = -1; m_pHintObject = NULL; m_pTimerHint->Enabled = false; m_pStageInfoWnd->ReleaseHandle(); } if( Sender==m_lbCompose ){ m_lbResource->ClearSelection(); } else{ m_lbCompose->ClearSelection(); SetFocusStage( -1 ); } ComposeListBoxUnit::TListBox *pLBSender = (ComposeListBoxUnit::TListBox *)Sender; int iSelIndex = pLBSender->ItemAtPos(TPoint(X,Y),true); if( iSelIndex==-1 ){ pLBSender->ItemIndex = -1; if( pLBSender==m_lbCompose ){ SetFocusStage( -1 ); } CheckOperationState(); return; } if(Button==mbLeft){ if( Shift.Contains(ssDouble) ){ if( Sender==m_lbResource ){ //双击添加 DWORD dwItemData = DWORD(pLBSender->Items->Objects[iSelIndex]); AddStage( LOWORD(dwItemData) ); //m_lbResource->ClearSelection(); } } else{ //开始拖动 DrawDragImg( Sender, iSelIndex ); TRect rcSel = pLBSender->ItemRect(iSelIndex); m_xImgDrag = rcSel.left + 1 - X; m_yImgDrag = rcSel.top + 1 - Y; SetCapture( pLBSender->Handle ); m_lbResource->SetDragState( true ); m_lbCompose->SetDragState( true ); m_panelBarsShow->SetDragState( true ); if( pLBSender==m_lbCompose ){ //设置选中段 SetFocusStage( iSelIndex ); m_lbCompose->SetDragStage( false, iSelIndex ); m_panelBarsShow->SetDragStage( false, iSelIndex ); m_iDragingIndex = iSelIndex; } else{ DWORD dwItemData = DWORD(pLBSender->Items->Objects[iSelIndex]); m_lbCompose->SetDragStage( true, LOWORD(dwItemData) ); m_panelBarsShow->SetDragStage( true, LOWORD(dwItemData) ); m_iDragingIndex = LOWORD( dwItemData ); } m_bDraging = true; m_btnAdd->ShowHint = false; m_btnMoveUp->ShowHint = false; m_btnMoveDown->ShowHint = false; CheckOperationState(); } } else if(Button==mbRight){ //右键菜单 m_pPopMenu->ClearMenuItem(); pLBSender->ItemIndex = iSelIndex; if( pLBSender==m_lbCompose ){ SetFocusStage( iSelIndex ); COMPOSESTAGE* pCStage = g_lstComposeStages[iSelIndex]; if( pCStage->iMelodyStageiVar; for( int i=0; iCreateCustomMenuItem( strText, OnSelectStageVar, -1, true, bChecked, i|SHOW_STAGE_VAR ); } m_pPopMenu->CreateCustomMenuItem( "-" ); } m_pPopMenu->CreateCustomMenuItem( "移除段落", OnDeleteStage ); } else{ m_pPopMenu->CreateCustomMenuItem( "添加段落", OnAddStage ); } CheckOperationState(); m_pPopMenu->Tag = iSelIndex; TPoint point(X,Y); point = pLBSender->ClientToScreen(point); m_pPopMenu->Popup(point.x, point.y); } } //--------------------------------------------------------------------------- void __fastcall TComposeForm::StageMouseMove(TObject *Sender, TShiftState Shift, int X, int Y) { if( m_bDraging ){ //显示拖动 TWinControl* pSender = (TWinControl*)Sender; TPoint ptClient(X, Y), ptScreen = pSender->ClientToScreen( ptClient ); bool bInDropArea = false; ptClient = m_lbCompose->ScreenToClient( ptScreen ); if( ptClient.x>0 && ptClient.xWidth && ptClient.y>0 && ptClient.yHeight ){ m_panelBarsShow->SetDragingPoint( -1, -1 ); if( m_lbCompose->SetDragingPoint( ptClient.x, ptClient.y ) ) Screen->Cursor = crDefault; else Screen->Cursor = crDropDisabled; bInDropArea = true; } ptClient = m_panelBarsShow->ScreenToClient( ptScreen ); if( ptClient.x>0 && ptClient.xWidth && ptClient.y>0 && ptClient.yHeight ){ m_lbCompose->SetDragingPoint( -1, -1 ); if( m_panelBarsShow->SetDragingPoint( ptClient.x, ptClient.y ) ) Screen->Cursor = crDefault; else Screen->Cursor = crDropDisabled; bInDropArea = true; } ptClient = m_imgDelete->ScreenToClient( ptScreen ); if( Sender!=m_lbResource && ptClient.x>0 && ptClient.xWidth && ptClient.y>0 && ptClient.yHeight ){ Screen->Cursor = crDeleteStage; m_imgDelete->Picture->Bitmap = m_bmpDeleteHover; bInDropArea = true; } else{ m_imgDelete->Picture->Bitmap = m_bmpDeleteNormal; } if( !bInDropArea ){ Screen->Cursor = crDropDisabled; m_panelBarsShow->SetDragingPoint( -1, -1 ); m_lbCompose->SetDragingPoint( -1, -1 ); } int xImgDrag = ptScreen.x+m_xImgDrag, yImgDrag = ptScreen.y+m_yImgDrag; m_lbResource->SetDragImgPos( xImgDrag, yImgDrag ); m_lbCompose->SetDragImgPos( xImgDrag, yImgDrag ); m_panelBarsShow->SetDragImgPos( xImgDrag, yImgDrag ); } else{ //显示段落信息 int iHintStage = -1; if( Sender==m_panelBarsShow ){ int iHitType = -1; DWORD dwHit = m_panelBarsShow->HitTest( X, Y, iHitType ); int iHitBar = LOWORD(dwHit); if( iHitType==2 ){ iHintStage = m_panelBarsShow->FindStage( iHitBar ); } } else{ TSkinListBox * pLBSender = (TSkinListBox *)Sender; iHintStage = pLBSender->ItemAtPos(TPoint(X,Y),true); } if( iHintStage>=0 ){ if( iHintStage!=m_iHintStage || Sender!=m_pHintObject ){ m_pStageInfoWnd->ReleaseHandle(); m_pTimerHint->Enabled = true; m_iHintStage = iHintStage; m_pHintObject = Sender; } } else{ if( m_iHintStage!=-1 ){ m_iHintStage = -1; m_pHintObject = NULL; m_pTimerHint->Enabled = false; m_pStageInfoWnd->ReleaseHandle(); } } } } //--------------------------------------------------------------------------- void __fastcall TComposeForm::StageMouseUp(TObject *Sender, TMouseButton Button, TShiftState Shift, int X, int Y) { if( m_bDraging ){ ReleaseCapture(); TWinControl* pSender = (TWinControl*)Sender; TPoint ptClient(X, Y), ptScreen = pSender->ClientToScreen( ptClient ); ptClient = m_lbCompose->ScreenToClient( ptScreen ); if( ptClient.x>0 && ptClient.xWidth && ptClient.y>0 && ptClient.yHeight ){ int iInsertPos = m_lbCompose->SetDropPoint( ptClient.x, ptClient.y ); if( iInsertPos>=0 ){ if( Sender==m_lbResource ){ m_panelBarsShow->InsertStage( m_iDragingIndex, iInsertPos ); } else{ m_panelBarsShow->MoveStage( m_iDragingIndex, iInsertPos ); } } } ptClient = m_panelBarsShow->ScreenToClient( ptScreen ); if( ptClient.x>0 && ptClient.xWidth && ptClient.y>0 && ptClient.yHeight ){ int iInsertPos = m_panelBarsShow->SetDropPoint( ptClient.x, ptClient.y ); if( iInsertPos>=0 ){ if( Sender==m_lbResource ){ m_lbCompose->InsertStage( m_iDragingIndex, iInsertPos ); } else{ m_lbCompose->MoveStage( m_iDragingIndex, iInsertPos ); } } } ptClient = m_imgDelete->ScreenToClient( ptScreen ); if( Sender!=m_lbResource && ptClient.x>0 && ptClient.xWidth && ptClient.y>0 && ptClient.yHeight ){ DeleteStage( m_iDragingIndex ); } m_imgDelete->Picture->Bitmap = m_bmpDeleteNormal; m_lbResource->SetDragState( false ); m_lbCompose->SetDragState( false ); m_panelBarsShow->SetDragState( false ); m_iDragingIndex = -1; m_bDraging = false; Screen->Cursor = crDefault; m_btnAdd->ShowHint = false; m_btnMoveUp->ShowHint = false; m_btnMoveDown->ShowHint = false; CheckOperationState(); } } //--------------------------------------------------------------------------- /* void __fastcall TComposeForm::LBFontSelectMouseDown(TObject *Sender, TMouseButton Button, TShiftState Shift, int X, int Y) { if( X>=0 && X < m_lbFontSelect->Width && Y>=0 && YHeight ){ // if( X>m_lbFontSelect->Width - 19 ) //滚动条位置 // return; 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 ); } //--------------------------------------------------------------------------- void TComposeForm::HidePopList(CommonListBoxUnit::TListBox* pList) { pList->Hide(); m_panelBarsShow->SetFocus(); } //--------------------------------------------------------------------------- void __fastcall TComposeForm::BtnFontChangeClick(TObject *Sender) { if( m_iHintStage!=-1 ){ m_iHintStage = -1; m_pHintObject = NULL; m_pTimerHint->Enabled = false; m_pStageInfoWnd->ReleaseHandle(); } m_lbResource->ClearSelection(); m_lbCompose->ClearSelection(); SetFocusStage( -1 ); 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 TComposeForm::HintTimerProc(TObject* Sender) { m_pTimerHint->Enabled = false; if( m_iHintStage==-1 ) return; String strHint; if( m_pHintObject==m_panelBarsShow ){ strHint = GetElementInfo( m_iHintStage, LIST_COMPOSESTAGES ).c_str(); } else{ strHint = ((TSkinListBox*)m_pHintObject)->Items->Strings[m_iHintStage]; } TPoint point = Mouse->CursorPos; point.y -= 16; m_pStageInfoWnd->ShowHintWindow( point, strHint); } //--------------------------------------------------------------------------- void __fastcall TComposeForm::StageMouseLeave(TObject *Sender) { if( m_iHintStage!=-1 ){ m_pTimerHint->Enabled = false; m_iHintStage = -1; m_pHintObject = NULL; m_pStageInfoWnd->ReleaseHandle(); } } //--------------------------------------------------------------------------- void __fastcall TComposeForm::BtnListMinClick(TObject *Sender) { if( Sender==m_btnComposeMin ){ m_panelCompose->Height = 16; m_panelCompose->Top = m_panelBarsShow->Top + m_panelBarsShow->Height - m_panelCompose->Height; m_btnComposeMin->Visible = false; m_btnComposeMax->Visible = true; m_panelResource->Height = m_panelCompose->Top - m_panelResource->Top; m_lbResource->Height = m_panelResource->Height - m_panelCompose->Height - 1; m_btnResourceMin->Visible = false; m_btnResourceClose->Visible = true; m_lbResource->Invalidate(); m_lbResource->SetFocus(); } else{ m_panelResource->Height = 17; m_btnResourceMin->Visible = false; m_btnResourceMax->Visible = true; m_panelCompose->Top = m_panelResource->Top + m_panelResource->Height; m_panelCompose->Height = m_panelBarsShow->Height - m_panelResource->Height; m_lbCompose->Height = m_panelCompose->Height - 31; m_panelComposeBottom->Top = m_panelCompose->Height - 15; m_btnComposeMin->Visible = false; m_btnComposeClose->Visible = true; m_lbCompose->Invalidate(); m_lbCompose->SetFocus(); } } //--------------------------------------------------------------------------- void __fastcall TComposeForm::BtnListMaxClick(TObject *Sender) { if( Sender==m_btnComposeMax ){ m_panelCompose->Top = m_iComListTop; m_panelCompose->Height = m_nComListHeight; m_btnComposeMax->Visible = false; m_btnComposeMin->Visible = true; m_lbCompose->Hide(); m_lbCompose->Height = m_nComListHeight - 31; m_lbCompose->Show(); m_panelComposeBottom->Top = m_nComListHeight - 15; m_lbCompose->SetFocus(); m_panelResource->Height = m_panelCompose->Top - m_panelResource->Top; m_btnResourceClose->Visible = false; m_btnResourceMin->Visible = true; m_lbResource->Hide(); m_lbResource->Height = m_panelResource->Height - 17; m_lbResource->Show(); } else{ m_panelResource->Height = m_nResListHeight; m_btnResourceMax->Visible = false; m_btnResourceMin->Visible = true; m_lbResource->Hide(); m_lbResource->Height = m_panelResource->Height - 17; m_lbResource->Show(); m_lbResource->SetFocus(); m_panelCompose->Height = m_nComListHeight; m_panelCompose->Top = m_iComListTop; m_btnComposeClose->Visible = false; m_btnComposeMin->Visible = true; m_lbCompose->Hide(); m_lbCompose->Height = m_nComListHeight - 31; m_lbCompose->Show(); m_panelComposeBottom->Top = m_nComListHeight - 15; } } //--------------------------------------------------------------------------- void TComposeForm::CalcListSize() { int hItem = m_lbCompose->ItemHeight, hTotal = m_panelBarsShow->Height, hResFull = (m_lbResource->Count+1)*hItem + 17, hResPartial = hTotal * 4 / 9, hResShow = hResFull<=hResPartial ? hResFull : hResPartial; m_nComListHeight = ((hTotal - hResShow - 31)/hItem+1)*hItem + 31; m_nResListHeight = hTotal - m_nComListHeight; m_iComListTop = m_iResListTop + m_nResListHeight; m_panelResource->Height = m_nResListHeight; m_lbResource->Height = m_nResListHeight - 17; m_panelCompose->Top = m_iComListTop; m_panelCompose->Height = m_nComListHeight; m_lbCompose->Height = m_nComListHeight - 31; m_panelComposeBottom->Top = m_nComListHeight - 15; } //--------------------------------------------------------------------------- void __fastcall TComposeForm::BtnListCloseClick(TObject *Sender) { //填充左侧背景 this->FillLeftSide( m_panelListIcon->Top + m_panelListIcon->Height ); //关闭资源及曲式窗口 m_panelResource->Hide(); m_panelCompose->Hide(); m_panelListIcon->Show(); m_panelBarsShow->Left = m_panelListIcon->Width; m_panelBarsShow->Width = Width - m_panelListIcon->Width; m_panelBarsShow->SetFocus(); } //--------------------------------------------------------------------------- void __fastcall TComposeForm::BtnListShowClick(TObject *Sender) { //取消左侧背景填充 this->FillLeftSide(-1); m_panelListIcon->Hide(); //打开列表框 m_panelResource->Show(); m_panelCompose->Show(); if( Sender==m_btnResourceOpen ){ m_panelCompose->Height = 16; m_panelCompose->Top = m_panelBarsShow->Top + m_panelBarsShow->Height - 16; m_btnComposeMin->Visible = false; m_btnComposeMax->Visible = true; m_btnComposeClose->Visible = false; m_panelResource->Height = m_panelCompose->Top - m_panelResource->Top; m_lbResource->Height = m_panelResource->Height - 17; m_btnResourceMax->Visible = false; m_btnResourceMin->Visible = false; m_btnResourceClose->Visible = true; m_lbResource->SetFocus(); } else{ m_panelResource->Height = 17; m_btnResourceMin->Visible = false; m_btnResourceMax->Visible = true; m_btnResourceClose->Visible = false; m_panelCompose->Top = m_panelResource->Top + 17; m_panelCompose->Height = m_panelBarsShow->Height - 17; m_lbCompose->Height = m_panelCompose->Height - 31; m_panelComposeBottom->Top = m_panelCompose->Height - 15; m_btnComposeMax->Visible = false; m_btnComposeMin->Visible = false; m_btnComposeClose->Visible = true; m_lbCompose->SetFocus(); } m_panelBarsShow->Left = m_lbResource->Width; m_panelBarsShow->Width = Width - m_lbResource->Width; } //--------------------------------------------------------------------------- void TComposeForm::CheckOperationState() { m_btnAdd->Enabled = m_lbResource->ItemIndex>=0; bool bCanMoveUp = false, bCanMoveDown = false; int iSel = m_lbCompose->ItemIndex; if( iSel>=0 ){ int iStage = LOWORD(DWORD(m_lbCompose->Items->Objects[iSel])); if( iStage0 ){ bCanMoveUp = true; } if( iSelCount-2 ){ bCanMoveDown = true; } else{ int iLastStage = LOWORD(DWORD(m_lbCompose->Items->Objects[m_lbCompose->Count-1])); if( iSel==m_lbCompose->Count-2 && iLastStageEnabled = bCanMoveUp; m_btnMoveDown->Enabled = bCanMoveDown; } //--------------------------------------------------------------------------- void __fastcall TComposeForm::BtnAddClick(TObject *Sender) { int iSel = m_lbResource->ItemIndex; if( iSel>=0 ){ int iMelodyStage = LOWORD(DWORD(m_lbResource->Items->Objects[iSel])); AddStage( iMelodyStage ); } CheckOperationState(); } //--------------------------------------------------------------------------- void __fastcall TComposeForm::BtnMoveClick(TObject *Sender) { int iSel = m_lbCompose->ItemIndex, iInsPos = iSel + ( Sender==m_btnMoveDown? 2 : -1 ); if( iSel>=0 && iInsPos>=0 ){ m_lbCompose->MoveStage( iSel, iInsPos ); m_panelBarsShow->MoveStage( iSel, iInsPos ); } CheckOperationState(); } //--------------------------------------------------------------------------- void __fastcall TComposeForm::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 VK_DELETE: break; case VK_UP: case VK_DOWN: if( ActiveControl==(TWinControl*)m_panelBarsShow ){ } break; case VK_RETURN: break; case VK_ESCAPE: if( m_panelAudioVolSet->Visible ){ m_panelAudioVolSet->Hide(); m_btnVolAudioSet->Down = false; } if( m_panelMusicVolSet->Visible ){ m_panelMusicVolSet->Hide(); m_btnVolMusicSet->Down = false; } break; case ' ': if( m_btnPause->Visible && m_btnPause->Enabled ){ PauseClick( NULL ); } else if( m_btnPlay->Visible && m_btnPlay->Enabled ){ PlayClick( NULL ); } break; case 'W': if( m_panelBarsShow->IsPlaying() ){ StopClick( NULL ); } if( m_nTotalBarNum>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; } } //--------------------------------------------------------------------------- void __fastcall TComposeForm::BtnStyleChangeClick(TObject *Sender) { StopClick(NULL); PostMessage( Handle, UM_SELECTSTYLE, 0, 0 ); } //--------------------------------------------------------------------------- void __fastcall TComposeForm::UMSelectStyle(TMessage &msg) { bool bStyleChanged = false; bool bBarChanged = false; int iSegNo = -1; StyleSelForm = new TStyleSelForm(this); StyleSelForm->m_bBase = false; int iSelStage = m_lbCompose->ItemIndex; if( iSelStage>=0 ){ StyleSelForm->m_idSelected = g_lstComposeStages[iSelStage]->idStyle; StyleSelForm->m_iSelStage = iSelStage; if( StyleSelForm->m_idSelected==g_iSelectedStyleID ){ StyleSelForm->m_strName = g_strSelectedStyleName; } else{ StyleSelForm->m_strName = g_lstComposeStages[iSelStage]->strStyleName; } int iMelodyStage = g_lstComposeStages[iSelStage]->iMelodyStage; if( iMelodyStage>=0x110 ){ StyleSelForm->m_iSegType = 2; StyleSelForm->m_iSegNo = iSegNo = iMelodyStage - 0x110; for( int i=iSelStage-1; i>=0; i-- ){ if( g_lstComposeStages[i]->iMelodyStage<0x100 ){ MELODYSTAGE *pMStage = g_lstMelodyStages[g_lstComposeStages[i]->iMelodyStage]; if( g_lstMelodyBars[pMStage->iLastBar]->iChords[1]!=-1 ){ StyleSelForm->m_iChordType = ( g_lstMelodyBars[pMStage->iLastBar]->iChords[1] % CHORD_TYPE_NUM ) % 2; } else{ StyleSelForm->m_iChordType = ( g_lstMelodyBars[pMStage->iLastBar]->iChords[0] % CHORD_TYPE_NUM ) % 2; } break; } } } else if( iMelodyStage>=0x100 ){ StyleSelForm->m_iSegType = 1; StyleSelForm->m_iSegNo = iSegNo = iMelodyStage - 0x100; //后向搜索 for( int i=iSelStage+1; iiMelodyStage<0x100 ){ MELODYSTAGE *pMStage = g_lstMelodyStages[g_lstComposeStages[i]->iMelodyStage]; StyleSelForm->m_iChordType = ( g_lstMelodyBars[pMStage->iFirstBar]->iChords[0] % CHORD_TYPE_NUM ) % 2; break; } } if( StyleSelForm->m_iChordType==-1 ){ //前向搜索 for( int i=iSelStage-1; i>=0; i-- ){ if( g_lstComposeStages[i]->iMelodyStage<0x100 ){ MELODYSTAGE *pMStage = g_lstMelodyStages[g_lstComposeStages[i]->iMelodyStage]; if( g_lstMelodyBars[pMStage->iLastBar]->iChords[1]!=-1 ){ StyleSelForm->m_iChordType = ( g_lstMelodyBars[pMStage->iLastBar]->iChords[1] % CHORD_TYPE_NUM ) % 2; } else{ StyleSelForm->m_iChordType = ( g_lstMelodyBars[pMStage->iLastBar]->iChords[0] % CHORD_TYPE_NUM ) % 2; } break; } } } } else{ StyleSelForm->m_iSegType = 0; StyleSelForm->m_iSegNo = iSegNo = g_lstComposeStages[iSelStage]->iVar; MELODYSTAGE *pMStage = g_lstMelodyStages[iMelodyStage]; StyleSelForm->m_iChordType = ( g_lstMelodyBars[pMStage->iFirstBar]->iChords[0] % CHORD_TYPE_NUM ) % 2; } } else{ StyleSelForm->m_idSelected = g_iSelectedStyleID; StyleSelForm->m_strName = g_strSelectedStyleName; for( int i=0; iiMelodyStage<0x100 ){ MELODYSTAGE *pMStage = g_lstMelodyStages[g_lstComposeStages[i]->iMelodyStage]; StyleSelForm->m_iChordType = ( g_lstMelodyBars[pMStage->iFirstBar]->iChords[0] % CHORD_TYPE_NUM ) % 2; break; } } } StyleSelForm->ShowModal(); if( iSelStage>=0 ){ if( g_lstComposeStages[iSelStage]->idStyle!=StyleSelForm->m_idSelected || g_lstComposeStages[iSelStage]->iVar!=StyleSelForm->m_iSegNo ){ int iMelodyStage = g_lstComposeStages[iSelStage]->iMelodyStage; g_lstComposeStages[iSelStage]->idStyle = StyleSelForm->m_idSelected; g_lstComposeStages[iSelStage]->strStyleName = StyleSelForm->m_strName; if( iMelodyStage>=0x100 ){ if( iMelodyStage>=0x110 ){ iMelodyStage = 0x110 + StyleSelForm->m_iSegNo; } else{ iMelodyStage = 0x100 + StyleSelForm->m_iSegNo; } g_lstComposeStages[iSelStage]->iMelodyStage = iMelodyStage; int nBarNum = f_SM_GetSegmentBarNum( iMelodyStage, StyleSelForm->m_idSelected ); if( g_lstComposeStages[iSelStage]->nStageBars!=nBarNum ){ g_lstComposeStages[iSelStage]->nStageBars = nBarNum; bBarChanged = true; ClearGlobalVars( LIST_COMPLETEVOLS ); } } else{ g_lstComposeStages[iSelStage]->iVar = StyleSelForm->m_iSegNo; } bStyleChanged = true; } if( g_lstComposeStages[iSelStage]->idStyle!=g_iSelectedStyleID ){ m_lblStyleName->Caption = g_lstComposeStages[iSelStage]->strStyleName.c_str(); // UpdateGlobalStyle(); } else{ m_lblStyleName->Caption = g_strSelectedStyleName.c_str(); } } else if( g_iSelectedStyleID!=StyleSelForm->m_idSelected ){ g_iSelectedStyleID = StyleSelForm->m_idSelected; g_strSelectedStyleName = StyleSelForm->m_strName; m_lblStyleName->Caption = g_strSelectedStyleName.c_str(); bStyleChanged = UpdateSegmentBars(); bBarChanged = UpdateStageBars(); if( bBarChanged ){ m_lbResource->Clear(); //m_lbCompose->Clear(); ClearGlobalVars( LIST_COMPLETEVOLS ); } } delete StyleSelForm; //Compose only as Select Style Id has changed /* bool bCombineSong = m_panelBarsShow->CheckModify( CHECK_STAGE | CHECK_POS ); if( bCombineSong ){ ClearGlobalVars( LIST_COMPLETEVOLS ); g_bSongNeedSave = false; } */ if( bStyleChanged || bBarChanged ){ g_bkCompose.Clear(); } ReloadCompose(); // m_panelBarsShow->BackupModify(); m_panelBarsShow->InitialVars(); // m_btnReload->Enabled = false; //初始化资源列表框 if( m_lbResource->Count==0 ){ InitResourceList(); } //计算列表框大小 CalcListSize(); //重置曲式列表框 int iSelIndex = m_lbCompose->ItemIndex; ResetComposeList(); m_lbCompose->ItemIndex = iSelIndex; m_nTotalBarNum = m_panelBarsShow->ComposeBarCount(); Application->MainForm->Update(); } //--------------------------------------------------------------------------- void __fastcall TComposeForm::AudioEffectClick(TObject *Sender) { StopClick( NULL ); PostMessage(Application->MainFormHandle, UM_AUDIOEFFECT, WPARAM(0),LPARAM(0)); } //--------------------------------------------------------------------------- void TComposeForm::SetFocusStage( int iSelIndex ) { if( iSelIndex==-1 || g_lstComposeStages[iSelIndex]->idStyle==g_iSelectedStyleID ){ m_lblStyleName->Caption = g_strSelectedStyleName.c_str(); } else{ m_lblStyleName->Caption = g_lstComposeStages[iSelIndex]->strStyleName.c_str(); } m_panelBarsShow->SetFocusStage( iSelIndex ); } //--------------------------------------------------------------------------- void __fastcall TComposeForm::ChangeChordMode( bool bAlpha ) { g_iShowType = bAlpha; m_panelBarsShow->Invalidate(); } //--------------------------------------------------------------------------- void __fastcall TComposeForm::MicSetClick(TObject *Sender) { PostMessage(Application->MainFormHandle, UM_MICSETTING, WPARAM(0),LPARAM(0)); } //--------------------------------------------------------------------------- void __fastcall TComposeForm::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 = 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 TComposeForm::UMHidePopControl(TMessage &msg) { if( g_lbFontSelect->Visible ){ g_lbFontSelect->Hide(); g_btnFontChange->Down = false; } } //---------------------------------------------------------------------------