//--------------------------------------------------------------------------- #include #pragma hdrstop #include "PredefineProjectFormUnit.h" #include "GlobalUnit.h" //--------------------------------------------------------------------------- #pragma package(smart_init) #pragma link "PNGButton" #pragma resource "*.dfm" TPredefineProjectForm *PredefineProjectForm; const BYTE u_arrPredefChords[3][2][8][8] = { //预设和弦 //主歌 { { { 0, 37, 20, 28, 0, 37, 20, 30 }, // 1 6 4 5 1 6 4 5 { 0, 17, 37, 28, 0, 17, 37, 30 }, // 1 3 6 5 1 3 6 5 { 0, 37, 20, 17, 37, 20, 28, 0 }, // 1 6 4 3 6 4 5 1 { 0, 17, 37, 28, 20, 17, 9, 30 }, // 1 3 6 5 4 3 2 5 { 0, 28, 37, 28, 0, 28, 37, 30 }, // 1 5 6 5 1 5 6 5 { 0, 37, 28, 20, 17, 9, 28, 0 }, // 1 6 5 4 3 2 5 1 { 0, 9, 28, 0, 0, 9, 28, 0 }, // 1 2 5 1 1 2 5 1 { 0, 20, 28, 0, 0, 20, 28, 0 } // 1 4 5 1 1 4 5 1 }, { {37, 9, 17, 37, 37, 9, 17, 37 }, // 6 2 3 6 6 2 3 6 {37, 28, 20, 17, 37, 28, 20, 19 }, // 6 5 4 3 6 5 4 3 {37, 28, 17, 37, 37, 28, 17, 37 }, // 6 5 3 6 6 5 3 6 {37, 20, 9, 17, 37, 20, 9, 19 }, // 6 4 2 3 6 4 2 3 {37, 17, 37, 28, 37, 17, 37, 30 }, // 6 3 6 5 6 3 6 5 {37, 9, 20, 28, 37, 9, 20, 30 }, // 6 2 4 5 6 2 4 5 {37, 9, 28, 37, 37, 9, 28, 37 }, // 6 2 5 6 6 2 5 6 {37, 20, 9, 37, 37, 20, 9, 37 } // 6 4 2 6 6 4 2 6 } }, //副歌 { { { 0, 37, 20, 17, 37, 20, 28, 0 }, // 1 6 4 3 6 4 5 1 { 0, 37, 28, 20, 17, 9, 28, 0 }, // 1 6 5 4 3 2 5 1 { 0, 9, 28, 0, 0, 9, 28, 0 }, // 1 2 5 1 1 2 5 1 { 0, 20, 28, 0, 0, 20, 28, 0 }, // 1 4 5 1 1 4 5 1 {20, 28, 37, 37, 20, 28, 0, 0 }, // 4 5 6 6 4 5 1 1 { 9, 28, 0, 28, 37, 9, 28, 0 }, // 2 5 1 5 6 2 5 1 {20, 28, 17, 37, 20, 9, 28, 0 }, // 4 5 3 6 4 2 5 1 { 9, 28, 20, 28, 0, 20, 28, 0 } // 2 5 4 5 1 4 5 1 }, { {37, 9, 17, 37, 37, 9, 17, 37 }, // 6 2 3 6 6 2 3 6 {37, 28, 17, 37, 37, 28, 17, 37 }, // 6 5 3 6 6 5 3 6 {37, 9, 28, 37, 37, 9, 28, 37 }, // 6 2 5 6 6 2 5 6 {37, 20, 9, 37, 37, 20, 9, 37 }, // 6 4 2 6 6 4 2 6 { 9, 17, 28, 37, 9, 17, 28, 37 }, // 2 3 5 6 2 3 5 6 {37, 9, 28, 17, 37, 9, 28, 37 }, // 6 2 5 3 6 2 5 6 {20, 28, 0, 0, 20, 28, 37, 37 }, // 4 5 1 1 4 5 6 6 {17, 37, 9, 28, 17, 37, 17, 37 } // 3 6 2 5 3 6 3 6 } }, //桥 { { { 9, 20, 28, 17, 9, 20, 28, 0 }, // 2 4 5 3 2 4 5 1 { 9, 28, 0, 28, 37, 28, 0, 30 }, // 2 5 1 5 6 5 1 5 {20, 17, 9, 28, 0, 17, 9, 30 }, // 4 3 2 5 1 3 2 5 {17, 9, 37, 17, 9, 28, 0, 30 }, // 3 2 6 3 2 5 1 5 {20, 0, 20, 0, 20, 0, 20, 30 }, // 4 1 4 1 4 1 4 5 {20, 28, 0, 0, 20, 28, 0, 0 }, // 4 5 1 1 4 5 1 1 {20, 17, 9, 0, 20, 17, 9, 0 }, // 4 3 2 1 4 3 2 1 {28, 20, 28, 20, 0, 28, 20, 30 } // 5 4 5 4 1 5 4 5 }, { { 9, 17, 28, 37, 9, 17, 28, 37 }, // 2 3 5 6 2 3 5 6 {17, 37, 28, 37, 9, 17, 20, 19 }, // 3 6 5 6 2 3 4 3 {20, 0, 28, 37, 20, 0, 37, 19 }, // 4 1 5 6 4 1 6 3 {20, 28, 0, 28, 20, 28, 0, 30 }, // 4 5 1 5 4 5 1 5 { 9, 17, 37, 17, 20, 37, 0, 37 }, // 2 3 6 3 4 6 1 6 { 9, 37, 9, 37, 9, 37, 9, 19 }, // 2 6 2 6 2 6 2 3 { 9, 37, 9, 17, 9, 37, 20, 30 }, // 2 6 2 3 2 6 4 5 {17, 9, 17, 37, 20, 9, 17, 37 } // 3 2 3 6 4 2 3 6 } } }; //--------------------------------------------------------------------------- //--------------------------------------------------------------------------- __fastcall TPredefineProjectForm::TPredefineProjectForm(TComponent* Owner) : TForm(Owner) { m_Ts = g_iMelodyTimeSignature; m_Tempo = g_nMelodyTempo; m_Key = 0; m_KeyType = 0; m_RavStage = 2; mLordSong = rand() % 8; mBridge = rand() % 8; mRefrain = rand() % 8; mPaintBoxFlag = true; mIsPreSetShow = false; } //--------------------------------------------------------------------------- __fastcall TPredefineProjectForm::~TPredefineProjectForm() { if(mPreChordSet) { delete mPreChordSet; mPreChordSet = NULL; } } //--------------------------------------------------------------------------- void __fastcall TPredefineProjectForm::WMNCHitTest(TWMNCHitTest &Message) { TForm::Dispatch(&Message); if( Message.Result==HTCLIENT && Message.YPosBoundsRect.Contains(TPoint(Message.XPos - Left, Message.YPos - Top))) { Message.Result = HTCAPTION; } } } //--------------------------------------------------------------------------- void __fastcall TPredefineProjectForm::DoFormCreate(TObject *Sender) { HRGN hRgn = CreateRoundRectRgn(0, 0, Width+1, Height+1, 16, 16); SetWindowRgn(Handle, hRgn, false); DeleteObject(hRgn); int ChordWidth = mChordsBox->Width / 8; int ChordLeft; int ChordTop = 1; int ChordRight; int ChordBottom = 27; for(int i = 0; i < 8; i++) { ChordLeft = i * ChordWidth; ChordRight = ChordLeft + ChordWidth; mChordRect[i] = TRect(ChordLeft, ChordTop, ChordRight, ChordBottom); } mChordRect[0].Left++; mChordRect[7].Right--; mTSComboBox->ItemIndex = m_Ts; mTempoSpinEdit->Value = m_Tempo; } //--------------------------------------------------------------------------- void __fastcall TPredefineProjectForm::DoChordPaint(TObject *Sender) { TPaintBox *PaintBox = (TPaintBox *)Sender; TRect cRect = PaintBox->ClientRect; cRect.Right--; cRect.Left++; cRect.Top++; cRect.Bottom--; PaintBox->Canvas->Brush->Color = TColor(0xC8F0FF); PaintBox->Canvas->Pen->Color = TColor(0x4673A4); PaintBox->Canvas->RoundRect(cRect, 5, 5); int Preset = 0; int Stage = mStageSetComboBox->ItemIndex; if(mStageComboBox->ItemIndex == 2) { if(mStageSetComboBox->ItemIndex == 0) { Preset = mLordSong; } else if(mStageSetComboBox->ItemIndex == 1) { Preset = mBridge; Stage = 2; } else if(mStageSetComboBox->ItemIndex == 2){ Preset = mRefrain; Stage = 1; } } else { if(mStageSetComboBox->ItemIndex == 0) { Preset = mLordSong; } else if(mStageSetComboBox->ItemIndex == 1) { Preset = mRefrain; } } BYTE *Chord = (BYTE *)u_arrPredefChords[Stage][m_KeyType][Preset]; for(int i = 0; i < 8; i++) { TRect Rect = mChordRect[i]; int ch = Chord[i]; int type = ch & 0x03; int key = (ch >> 2) + m_Key; if( key>11 ) key -= 12; DrawChord(PaintBox->Canvas, Rect, key, type); if(i != 7) { PaintBox->Canvas->MoveTo(Rect.Right - 1, Rect.Top); PaintBox->Canvas->LineTo(Rect.Right - 1, Rect.Bottom); } } } //--------------------------------------------------------------------------- void __fastcall TPredefineProjectForm::DoPaintBoxMouseLeave(TObject *Sender) { mPresetMouseOver = false; } //--------------------------------------------------------------------------- void __fastcall TPredefineProjectForm::DoPaintBoxMouseEnter(TObject *Sender) { mPresetMouseOver = true; } //--------------------------------------------------------------------------- void __fastcall TPredefineProjectForm::DoPresetChordShow(TObject *Sender) { mIsPreSetShow = true; } //--------------------------------------------------------------------------- void __fastcall TPredefineProjectForm::DoPresetChordHide(TObject *Sender) { if(mStageComboBox->ItemIndex == 2) { if(mStageSetComboBox->ItemIndex == 0) { mLordSong = mPreChordSet->SelectedIndex; } else if(mStageSetComboBox->ItemIndex == 1) { mBridge = mPreChordSet->SelectedIndex; } else if(mStageSetComboBox->ItemIndex == 2){ mRefrain = mPreChordSet->SelectedIndex; } } else { if(mStageSetComboBox->ItemIndex == 0) { mLordSong = mPreChordSet->SelectedIndex; } else if(mStageSetComboBox->ItemIndex == 1) { mRefrain = mPreChordSet->SelectedIndex; } } if(GetActiveWindow() != Handle) { mPaintBoxFlag = true; } if(!mPresetMouseOver) mPaintBoxFlag = true; mIsPreSetShow = false; mChordsBox->Repaint(); } //--------------------------------------------------------------------------- void TPredefineProjectForm::DrawChord(TCanvas *Canvas, TRect Rect, int iKey, int iType) { int iMainKey, iAjustKey; //调级数、升降 TPrefineProjectSet::GetChordDisplayKey(iKey, m_Key, iMainKey, iAjustKey); UniDrawChord(Canvas, Rect, iMainKey, iAjustKey, iType); } //--------------------------------------------------------------------------- void __fastcall TPredefineProjectForm::DoStageCountChange(TObject *Sender) { mStageSetComboBox->Clear(); for(int i = 0; i <= mStageComboBox->ItemIndex; i++) { mStageSetComboBox->AddItem(IntToStr(i + 1), NULL); } mStageSetComboBox->ItemIndex = 0; DoStageSetChange(NULL); m_RavStage = mStageComboBox->ItemIndex + 1; mChordsBox->Repaint(); } //--------------------------------------------------------------------------- void __fastcall TPredefineProjectForm::DoStageSetChange(TObject *Sender) { // if(m_RavStage == 3 && mStageSetComboBox->ItemIndex == 1) // mSelectedStage = 2; // else if(m_RavStage == 3 && mStageSetComboBox->ItemIndex == 2) // mSelectedStage = 1; // else // mSelectedStage = mStageSetComboBox->ItemIndex; // mChordsBox->Repaint(); } //--------------------------------------------------------------------------- void __fastcall TPredefineProjectForm::DoKeyChange(TObject *Sender) { TComboBox *Combo = (TComboBox *)Sender; m_Key = Combo->ItemIndex; mChordsBox->Repaint(); } //--------------------------------------------------------------------------- void __fastcall TPredefineProjectForm::DoKeyTypeChange(TObject *Sender) { TComboBox *Combo = (TComboBox *)Sender; m_KeyType = Combo->ItemIndex; mChordsBox->Repaint(); } //--------------------------------------------------------------------------- void __fastcall TPredefineProjectForm::DoTsChange(TObject *Sender) { TComboBox *Combo = (TComboBox *)Sender; m_Ts = Combo->ItemIndex; } //--------------------------------------------------------------------------- void __fastcall TPredefineProjectForm::DoPaintBoxMouseDown(TObject *Sender, TMouseButton Button, TShiftState Shift, int X, int Y) { if(mPaintBoxFlag) { if(mPreChordSet) { delete mPreChordSet; mPreChordSet = NULL; } mPreChordSet = new TPrefineProjectSet(NULL); mPreChordSet->Parent = this; int Preset = 0; int Stage = mStageSetComboBox->ItemIndex; if(mStageComboBox->ItemIndex == 2) { if(mStageSetComboBox->ItemIndex == 0) { Preset = mLordSong; } else if(mStageSetComboBox->ItemIndex == 1) { Preset = mBridge; Stage = 2; } else if(mStageSetComboBox->ItemIndex == 2){ Preset = mRefrain; Stage = 1; } } else { if(mStageSetComboBox->ItemIndex == 0) { Preset = mLordSong; } else if(mStageSetComboBox->ItemIndex == 1) { Preset = mRefrain; } } for(int i = 0; i < 8; i++) { BYTE *Chord = (BYTE *)u_arrPredefChords[Stage][m_KeyType][i]; TPrefineProjectSetItem *Item = new TPrefineProjectSetItem(mPreChordSet); Item->Key = m_Key; Item->Index = i; memcpy(Item->PredefChord, Chord, 8 * sizeof(BYTE)); mPreChordSet->AddItem(Item); } mPreChordSet->SelectedIndex = Preset; TPoint posClient(0, mChordsBox->Height); mPreChordSet->OnShow = DoPresetChordShow; mPreChordSet->OnHide = DoPresetChordHide; TPoint pos = mChordsBox->ClientToScreen(posClient); mPreChordSet->Top = pos.Y; mPreChordSet->Left = pos.X + 1; mPreChordSet->Width = mChordsBox->Width - 2; mPreChordSet->Height = 200; mPreChordSet->Show(); } mPaintBoxFlag = !mPaintBoxFlag; } //--------------------------------------------------------------------------- void __fastcall TPredefineProjectForm::OnTempoEditChange(TObject *Sender) { TSpinEdit *Edit = (TSpinEdit *)Sender; if(Edit->Value == 55) { mTempoComboBox->ItemIndex = 0; } else if(Edit->Value == 65){ mTempoComboBox->ItemIndex = 1; } else if(Edit->Value == 80) { mTempoComboBox->ItemIndex = 2; } else if(Edit->Value == 110) { mTempoComboBox->ItemIndex = 3; } else if(Edit->Value == 120) { mTempoComboBox->ItemIndex = 4; } else { mTempoComboBox->ItemIndex = 5; } m_Tempo = Edit->Value; } //--------------------------------------------------------------------------- void __fastcall TPredefineProjectForm::DoTempoComboChange(TObject *Sender) { TComboBox *Combo = (TComboBox *)Sender; if(Combo->ItemIndex == 0) { mTempoSpinEdit->Value = 55; } else if(Combo->ItemIndex == 1){ mTempoSpinEdit->Value = 65; } else if(Combo->ItemIndex == 2) { mTempoSpinEdit->Value = 80; } else if(Combo->ItemIndex == 3) { mTempoSpinEdit->Value = 110; } else if(Combo->ItemIndex == 4) { mTempoSpinEdit->Value = 120; } } //--------------------------------------------------------------------------- int __fastcall TPredefineProjectForm::ShowModal() { int ret = TForm::ShowModal(); m_Preset[0] = mLordSong; if(mStageComboBox->ItemIndex == 2) { m_Preset[1] = mBridge; m_Preset[2] = mRefrain; } else { m_Preset[1] = mRefrain; m_Preset[2] = 0; } return ret; } void __fastcall TPredefineProjectForm::DoFormActivate(TObject *Sender) { if(mStageComboBox->ItemIndex != (mStageSetComboBox->Items->Count - 1)) { DoStageCountChange(NULL); } } //---------------------------------------------------------------------------