//--------------------------------------------------------------------------- #include #include #pragma hdrstop #include "GlobalUnit.h" #include "ChordPanel.h" #define COL_HEIGHT 40 #define COL_GAP 10 #define MAINKEY_WIDTH 50 #define ADJKEY_WIDTH 40 #define CHORDTYPE_WIDTH 96 String u_strChordType[] = { "大三 Maj", "小三 Min", "大小七 7", "小七 Min7", "挂二 Sus2", "挂四 Sus4", "挂六 Sus6", "大七 Maj7" }; //--------------------------------------------------------------------------- #pragma package(smart_init) __fastcall TChordPanel::TChordPanel(TComponent* AOwner) : TToolpalPanel(AOwner) { m_iType = TPTYPE_CHORD; m_nTextHeight = 40; m_iMelodyKey = 0; m_iMainKey = m_iChordType = -1; m_iAdjustKey = 0; m_bEnable = false; m_lblName = NULL; m_lblType = NULL; m_strTitle = "和弦设置"; AddToolBtn( 3, "imgAlphaChord", KeyModeClick, "显示英文和弦" ); } //--------------------------------------------------------------------------- void __fastcall TChordPanel::CreateWnd(void) { TToolpalPanel::CreateWnd(); m_lblName = new TLabel(this); m_lblName->Parent = this; m_lblName->Alignment = taCenter; m_lblName->Layout = tlCenter; m_lblName->AutoSize = false; m_lblName->SetBounds( LEFT_BOUND + COL_GAP, m_nTitleHeight + COL_GAP, MAINKEY_WIDTH + ADJKEY_WIDTH + COL_GAP, m_nTextHeight - COL_GAP ); m_lblName->Font->Name = g_strTxtFontName; // m_lblName->Font->Size = g_szFont9; m_lblName->Font->Color = RGB(156, 170, 189); m_lblName->Caption = g_bAlphaKey ? L"和弦调号" : L"和弦级数"; m_lblType = new TLabel(this); m_lblType->Parent = this; m_lblType->Alignment = taCenter; m_lblType->Layout = tlCenter; m_lblType->AutoSize = false; m_lblType->SetBounds( m_lblName->Left + m_lblName->Width + 16, m_nTitleHeight + COL_GAP, CHORDTYPE_WIDTH, m_nTextHeight - COL_GAP ); m_lblType->Font->Name = g_strTxtFontName; // m_lblType->Font->Size = g_szFont9; m_lblType->Font->Color = RGB(156, 170, 189); m_lblType->Caption = L"和弦类型"; for( int i = 0; i < 7; i++ ){ m_aMainKeys[i] = new TTextButton(this); m_aMainKeys[i]->Parent = this; m_aMainKeys[i]->Enabled = false; m_aMainKeys[i]->OnClick = MainKeyClick; m_aMainKeys[i]->Tag = MainKeyTag( i ); m_aMainKeys[i]->Text = g_bAlphaKey ? g_strAlphaTable[i] : g_strTable[i]; m_aMainKeys[i]->FontName = g_strTxtFontName; m_aMainKeys[i]->FontSize = g_szFont12; m_aMainKeys[i]->SetBounds( LEFT_BOUND + COL_GAP, m_nTitleHeight + m_nTextHeight + i*COL_HEIGHT, MAINKEY_WIDTH, COL_HEIGHT ); } for( int i=0; i<2; i++ ){ m_aAdjustKeys[i] = new TTextButton(this); m_aAdjustKeys[i]->Parent = this; m_aAdjustKeys[i]->Enabled = false; m_aAdjustKeys[i]->OnClick = AdjustKeyClick; m_aAdjustKeys[i]->Tag = i==0 ? 1 : -1; m_aAdjustKeys[i]->Text = i==0 ? "#" : "b"; m_aAdjustKeys[i]->FontName = g_strTxtFontName; m_aAdjustKeys[i]->FontSize = g_szFont12; m_aAdjustKeys[i]->SetBounds( m_aMainKeys[0]->Left + m_aMainKeys[0]->Width + COL_GAP, m_nTitleHeight + m_nTextHeight + i*COL_HEIGHT, ADJKEY_WIDTH, COL_HEIGHT ); } for( int i=0; iParent = this; m_aChordTypes[i]->Enabled = false; m_aChordTypes[i]->OnClick = ChordTypeClick; m_aChordTypes[i]->Tag = i; m_aChordTypes[i]->Text = u_strChordType[i]; m_aChordTypes[i]->FontName = g_strTxtFontName; m_aChordTypes[i]->FontSize = g_szFont12; int h = i; if( i==7 ) h = 4; else if( i>=4 ) h++; m_aChordTypes[i]->SetBounds( m_aAdjustKeys[0]->Left + m_aAdjustKeys[0]->Width + 16, m_nTitleHeight + m_nTextHeight + h*COL_HEIGHT, CHORDTYPE_WIDTH, COL_HEIGHT ); } m_lstBtnTools[0]->Down = g_bAlphaKey; } //--------------------------------------------------------------------------- __fastcall TChordPanel::~TChordPanel() { for( int i = 0; i < 7; i++ ){ SAFE_DELETE( m_aMainKeys[i] ); } for( int i=0; i<2; i++ ){ SAFE_DELETE( m_aAdjustKeys[i] ); m_aAdjustKeys[i] = NULL; } for( int i=0; i=0 ) m_aMainKeys[m_iMainKey]->SetDown( false ); if( iMainKey>=0 ) m_aMainKeys[iMainKey]->SetDown( true ); m_iMainKey = iMainKey; } EnableAdjustKey( iMainKey, iAdjustKey ); EnableChordType( iMainKey ); m_iAdjustKey = iAdjustKey; if( m_iChordType!=iChordType ){ if( m_iChordType>=0 ) m_aChordTypes[m_iChordType]->SetDown(false); if( iChordType>=0 ) m_aChordTypes[iChordType]->SetDown(true); m_iChordType = iChordType; } } //--------------------------------------------------------------------------- void __fastcall TChordPanel::MainKeyClick( TObject* Sender ) { int iSeries = ((TTextButton*)Sender)->Tag, iAdjustKey = 0, iChordType = 0; if( iSeries==1 || iSeries==2 || iSeries==5 ) iChordType = 1; else if( iSeries==6 ) iAdjustKey = -1; if( g_bAlphaKey ){ int iKey = (iSeries<3) ? (iSeries*2) : (iSeries*2 - 1); iKey += m_iMelodyKey + iAdjustKey; if( iKey<0 ) iKey += 12; else if( iKey>11 ) iKey -= 12; if( iKey==1 || iKey==3 || iKey==8 || iKey==10 ) iAdjustKey = -1; else if( iKey==6 ) iAdjustKey = 1; } int iMainKey = -1; for( int i=0; i<7; i++ ){ if( m_aMainKeys[i]==Sender ){ iMainKey = i; break; } } if( iMainKey!=m_iMainKey || iAdjustKey!=m_iAdjustKey || iChordType!=m_iChordType ){ SetChord( iMainKey, iAdjustKey, iChordType ); m_pContentPanel->SetSelectChord( GetChordKey(), iChordType ); } } //--------------------------------------------------------------------------- void __fastcall TChordPanel::AdjustKeyClick( TObject* Sender ) { TTextButton* pAdjust = (TTextButton*)Sender; int iAdjustKey = pAdjust->Down ? 0 : pAdjust->Tag; if( iAdjustKey!=m_iAdjustKey ){ SetChord( m_iMainKey, iAdjustKey, m_iChordType ); m_pContentPanel->SetSelectChord( GetChordKey(), m_iChordType ); } } //--------------------------------------------------------------------------- void __fastcall TChordPanel::ChordTypeClick( TObject* Sender ) { int iChordType = ((TTextButton*)Sender)->Tag; if( iChordType!=m_iChordType ){ SetChord( m_iMainKey, m_iAdjustKey, iChordType ); m_pContentPanel->SetSelectChord( GetChordKey(), iChordType ); } } //--------------------------------------------------------------------------- void __fastcall TChordPanel::EnableChordModify( bool bEnable, int iBarKey, int iChordKey, int iChordType ) { SetMelodyKey( iBarKey ); int iMainKey, iAdjustKey; m_pContentPanel->GetChordDispalyKey( iChordKey, iBarKey, iMainKey, iAdjustKey ); if( bEnable!=m_bEnable ){ for( int i=0; i<7; i++ ){ TTextButton * pBtn = m_aMainKeys[i]; pBtn->Enabled = bEnable; pBtn->SetDown( bEnable && i==iMainKey ); } for( int i=0; iEnabled = bEnable; pBtn->SetDown( bEnable && i==iChordType ); } EnableAdjustKey( bEnable ? iMainKey : 0, iAdjustKey ); EnableChordType( bEnable ? iMainKey : -1 ); m_bEnable = bEnable; m_iMainKey = iMainKey; m_iAdjustKey = iAdjustKey; m_iChordType = iChordType; } else if( bEnable ){ SetChord( iMainKey, iAdjustKey, iChordType ); } } //--------------------------------------------------------------------------- void TChordPanel::EnableAdjustKey( int iMainKey, int iAdjustKey ) { switch( iMainKey ){ case -1: case 0: case 4: m_aAdjustKeys[0]->Enabled = false; m_aAdjustKeys[1]->Enabled = false; break; case 3: m_aAdjustKeys[0]->Enabled = true; m_aAdjustKeys[1]->Enabled = false; break; default: m_aAdjustKeys[0]->Enabled = false; m_aAdjustKeys[1]->Enabled = true; break; } m_aAdjustKeys[0]->SetDown( iAdjustKey>0 ); m_aAdjustKeys[1]->SetDown( iAdjustKey<0 ); } //--------------------------------------------------------------------------- void TChordPanel::EnableChordType( int iMainKey ) { for( int i=0; iEnabled = iMainKey>=0; } } //--------------------------------------------------------------------------- int TChordPanel::MainKeyTag( int index ) { int iTag = index; if( g_bAlphaKey && m_iMelodyKey>0 ){ int iOffset = 0; switch( m_iMelodyKey ){ case 1: case 2: iOffset = 1; break; case 3: case 4: iOffset = 2; break; case 5: case 6: iOffset = 3; break; case 7: iOffset = 4; break; case 8: case 9: iOffset = 5; break; case 10: case 11: iOffset = 6; break; } iTag -= iOffset; if( iTag<0 ) iTag += 7; } return iTag; } //--------------------------------------------------------------------------- void __fastcall TChordPanel::SetMelodyKey( int iKey ) { if( m_iMelodyKey!=iKey ){ m_iMelodyKey = iKey; if( iKey>0 ){ for( int i=0; i<7; i++ ){ if( m_aMainKeys[i] ) m_aMainKeys[i]->Tag = MainKeyTag( i ); } } } } //--------------------------------------------------------------------------- int TChordPanel::GetChordKey() { int iKey = m_iMainKey; switch( m_iMainKey ){ case 1: case 2: iKey = m_iMainKey * 2; if( m_iAdjustKey!=0 ) iKey += m_iAdjustKey; break; case 3: iKey = 5; if( m_iAdjustKey!=0 ) iKey += m_iAdjustKey; break; case 4: iKey = 7; break; case 5: case 6: iKey = m_iMainKey * 2 - 1; if( m_iAdjustKey!=0 ) iKey += m_iAdjustKey; break; } if( iKey>=0 && !g_bAlphaKey ){ iKey += m_iMelodyKey; if( iKey>11 ) iKey -= 12; } return iKey; } //--------------------------------------------------------------------------- void __fastcall TChordPanel::KeyModeClick(TObject *Sender) { TPNGButton* pBtn = (TPNGButton*)Sender; // pBtn->Down = !pBtn->Down; SetKeyMode( !pBtn->Down ); } //--------------------------------------------------------------------------- void TChordPanel::SetKeyMode( bool bAlpha ) { if( g_bAlphaKey!= bAlpha ){ if( m_lblName ){ int iChordKey = GetChordKey(); g_bAlphaKey = bAlpha; for( int i = 0; i < 7; i++ ){ m_aMainKeys[i]->Text = g_bAlphaKey ? g_strAlphaTable[i] : g_strTable[i]; m_aMainKeys[i]->Tag = MainKeyTag( i ); if( Visible ) m_aMainKeys[i]->Repaint(); } if( Visible ){ int iMainKey, iAdjustKey; m_pContentPanel->GetChordDispalyKey( iChordKey, m_iMelodyKey, iMainKey, iAdjustKey ); SetChord( iMainKey, iAdjustKey, m_iChordType ); } m_lblName->Caption = g_bAlphaKey ? L"和弦调号" : L"和弦级数"; m_lstBtnTools[0]->Down = bAlpha; } else{ g_bAlphaKey = bAlpha; } m_pContentPanel->InvalidateShowBars( BAR_DATA ); } } //---------------------------------------------------------------------------