//--------------------------------------------------------------------------- #include #pragma hdrstop #include #include //add by tj 2013/12/22 #include "GlobalUnit.h" #include "SetupFormUnit.h" #include "MessageFormUnit.h" #include "CommonListboxUnit.h" #define TIME_BROWSE 30 #define BROWSE_LEFT -1 #define BROWSE_PAUSE 0 #define BROWSE_RIGHT 1 #define BROWSE_SPEED 1 #define TAP_NOR 0//add by tj 2014/1/10 #define TAP_FOCUS 1 #define TAP_DOWN 2 const int c_xOriScr = 582, c_yOriScr = 327, c_xPoint = 89, c_yPoint = 0, c_wPoint = 53, c_hPoint = 126, c_rPoint = 114, c_rOuter = 129, c_rInner = 104, c_xDrag = 81, c_yDrag = 10, c_wDrag = 45, // c_hDrag = 80, //add by tj 2013/12/20 c_hDrag = 77, c_xTapPoint = 77, c_yTapPoint = 77, //85, c_wTapPoint = 74, c_hTapPoint = 74, c_iScale0 = 125; static const TCursor crHand0 = 0x55, crHand1 = 0x56; int const nImgStyleNum = 10; int const s_iBrowseStep = 2; //每次加速增量 int const s_iMaxTimes = 4; //加速最大次数 int s_iSpeedDownTimes = 0; //累加次数 bool s_bLeft = false; //左加速键 bool s_bRight= false; //右加速键 //--------------------------------------------------------------------------- #pragma package(smart_init) #pragma link "PNGButton" #pragma link "PNGButton" #pragma resource "*.dfm" USEFORM("MessageFormUnit.cpp", MessageForm); TSetupForm *SetupForm; extern TPNGButton *g_btnFontChange; extern Vcl::Extctrls::TPanel *g_panelFontName; extern CommonListBoxUnit::TListBox *g_lbFontSelect; //--------------------------------------------------------------------------- __fastcall TSetupForm::TSetupForm(TComponent* Owner) : TForm(Owner) { m_pPicBack = new TJPEGImage(); TResourceStream * pResStream = new TResourceStream(int(HInstance), "SetupBackground", RT_RCDATA); m_pPicBack->LoadFromStream(pResStream); delete pResStream; m_imgBk->Picture->Bitmap->Assign(m_pPicBack); // sFont7 = int(7 * 96.0 / g_yDpi + 0.5); } //--------------------------------------------------------------------------- __fastcall TSetupForm::~TSetupForm() { delete m_pPicBack; } //--------------------------------------------------------------------------- void __fastcall TSetupForm::FormCreate(TObject *Sender) { //预览风格相关初始化 // m_pPlayData = NULL; // m_nPlayData = 0; //默认获取44拍所有推荐ID /* m_aStyleNames[0] = "流行"; m_aStyleNames[1] = "民摇"; m_aStyleNames[2] = "摇滚"; m_aStyleNames[3] = "舞曲"; m_aStyleNames[4] = "爵士"; m_aStyleNames[5] = "蓝调"; m_aStyleNames[6] = "桑巴"; m_aStyleNames[7] = "古典"; m_aStyleNames[8] = "圆舞曲"; m_aStyleNames[9] = "独立"; */ //节拍Radio按钮组初始化 // g_iMelodyTimeSignature = 0; //缺省为44拍 m_lstBeat[0] = m_btnBeat44; m_lstBeat[1] = m_btnBeat43; m_lstBeat[2] = m_btnBeat42; m_lstBeat[3] = m_btnBeat86; String strPath = g_strExecutePath.c_str(), strImgFile = strPath + L"Poinor"; m_pGPImgPointerNormal = new Image( strImgFile.c_str() ); strImgFile = strPath + L"Poihov"; m_pGPImgPointerHover = new Image( strImgFile.c_str() ); Gdiplus::RectF gpOuterRect(c_xOriScr-c_rOuter, c_yOriScr-c_rOuter, c_rOuter*2+1, c_rOuter*2+1); Gdiplus::RectF gpInnerRect(c_xOriScr-c_rInner, c_yOriScr-c_rInner, c_rInner*2+1, c_rInner*2+1); Gdiplus::RectF gpPointRect(c_xDrag, c_yDrag, c_wDrag, c_hDrag ); m_pGPRgnDrag = new Region( gpPointRect ); m_pGPRgnClick = new Region( gpOuterRect ); GraphicsPath gpPath; gpPath.AddEllipse(gpOuterRect); m_pGPRgnClick->Intersect(&gpPath); gpPath.Reset(); gpPath.AddEllipse(gpInnerRect); m_pGPRgnClick->Exclude(&gpPath); //add by tj 2013/12/20 strImgFile = strPath + L"tapNor"; m_pGPImgTapNormal = new Image( strImgFile.c_str() ); strImgFile = strPath + L"tapFocus"; m_pGPImgTapMove = new Image( strImgFile.c_str() ); strImgFile = strPath + L"tapDown"; m_pGPImgTapHover = new Image( strImgFile.c_str() ); Gdiplus::RectF gpTapRect(c_xTapPoint, c_yTapPoint, c_wTapPoint, c_hTapPoint ); m_pGPRgnTapClick = new Region( gpTapRect ); m_pTimerTapHint = new TTimer(this); m_pTimerTapHint->Enabled = false; m_pTimerTapHint->Interval = TIME_HINT; m_pTimerTapHint->OnTimer = HintTimerTapProc; m_pTapWnd = new TSkinHintWindow(this); Screen->Cursors[crHand0] = LoadCursor(HInstance, L"OpenHand"); Screen->Cursors[crHand1] = LoadCursor(HInstance, L"CatchHand"); //风格浏览初始化 m_nStyleNum = 0; m_iFirstStyle = 0; m_iSelStyle = m_iHintStyle = -1; m_iDirection = BROWSE_PAUSE; m_pImgSelStyle = NULL; m_pImgCover = new TPngImage(); m_pImgCover->LoadFromResourceName(int(HInstance), "DiskCover"); m_nCoverWidth = m_pImgCover->Width; m_nCoverHeight = m_pImgCover->Height; m_paImgStyles = new PTBitmap[nImgStyleNum]; for( int i=0; i< nImgStyleNum; i++ ){ m_paImgStyles[i] = new TBitmap(); m_paImgStyles[i]->LoadFromResourceName(int(HInstance), "diskab"+IntToStr(i)); } m_nDiskWidth = m_paImgStyles[0]->Width; m_nDiskHeight = m_paImgStyles[0]->Height; m_nTileWidth = m_panBrowse->Width / 4; m_xFirstPos = - m_nDiskWidth / 2; m_xCoverPos = 0; m_pTimerBrowse = new TTimer(this); m_pTimerBrowse->Enabled = false; m_pTimerBrowse->Interval = TIME_BROWSE; m_pTimerBrowse->OnTimer = BrowseTimerProc; m_pTimerHint = new TTimer(this); m_pTimerHint->Enabled = false; m_pTimerHint->Interval = TIME_HINT; m_pTimerHint->OnTimer = HintTimerProc; m_bDiskOpening = m_bSelectMoving = false; m_pStyleInfoWnd = new TSkinHintWindow(this); //test m_iOldSelected = -1; // f_SM_GetStyleRecomInfos( g_iMelodyTimeSignature, m_aPreStyleInfos, &m_nStyleNum); SetTransparent( this ); } //--------------------------------------------------------------------------- void __fastcall TSetupForm::FormDestroy(TObject *Sender) { delete m_pGPImgPointerNormal; delete m_pGPImgPointerHover; delete m_pGPRgnClick; delete m_pGPRgnDrag; if( m_pImgSelStyle ) delete m_pImgSelStyle; delete m_pImgCover; for( int i=0; iFont->Color = RGB(60,43,23); int tmpAngle = (g_nMelodyTempo-c_iScale0)*9/5; if( tmpAngle!=m_nPointerAngle ){ m_nPointerAngle = tmpAngle; // m_labSpeed->Caption = IntToStr( g_nMelodyTempo ); m_panPointer->Invalidate(); } //add by tj 2013/12/20 m_labSpeed->Caption = IntToStr( g_nMelodyTempo ); int iLastBeat = -1; for( int i=0; i<4; i++ ){ if( m_lstBeat[i]->Down ){ iLastBeat = i; break; } } if( iLastBeat!=g_iMelodyTimeSignature ){ if( iLastBeat>=0 ){ m_lstBeat[iLastBeat]->Down = false; } m_lstBeat[g_iMelodyTimeSignature]->Down = true; f_MM_Stop(); m_iSelStyle = -1; m_xCoverPos = 0; m_bDiskOpening = m_bSelectMoving = false; m_pTimerBrowse->Enabled = true; m_iOldSelected = -1; m_nStyleNum = 0; //节拍变换,重新获取推荐ID f_SM_GetStyleRecomInfos( g_iMelodyTimeSignature, m_aPreStyleInfos, &m_nStyleNum); } if( m_nStyleNum==0 ){ f_SM_GetStyleRecomInfos( g_iMelodyTimeSignature, m_aPreStyleInfos, &m_nStyleNum); } m_iTS_Bk = g_iMelodyTimeSignature; m_nTempo_Bk = g_nMelodyTempo; m_idStyle_Bk = g_iSelectedStyleID; HRESULT hResult = f_MM_CreateRealTimeMIDIStream( true ); if (hResult != S_OK) { DebugPrint("Create realtime midi stream error.\n"); } SetFocus(); Invalidate(); } //--------------------------------------------------------------------------- void __fastcall TSetupForm::FormDeactivate(TObject *Sender) { if( Application->ActiveFormHandle!=Application->MainFormHandle ){ return; } if( m_btnBeatPreview1->Visible ){ BeatPreviewClick( m_btnBeatPreview1 ); } f_MM_Stop() ; HRESULT hResult = f_MM_FreeRealTimeMIDIStream(); if (hResult != S_OK) { DebugPrint("Free realtime midi stream error.\n"); } m_pTimerBrowse->Enabled = false; m_pTimerHint->Enabled = false; m_iDirection = BROWSE_PAUSE; m_btnBrowseRight->Down = false; m_btnBrowseLeft->Down = false; m_bDiskOpening = m_bSelectMoving = false; m_iSelStyle = -1; m_xCoverPos = 0; if( m_iHintStyle!=-1 ){ m_iHintStyle = -1; m_pStyleInfoWnd->ReleaseHandle(); } g_bCanStep = true; //速度节拍改变 if( Sender && (g_nMelodyTempo!=m_nTempo_Bk || g_iMelodyTimeSignature!=m_iTS_Bk) ){ if( g_lstMelodyBars.size()>0 && ( g_strProjectName.length()==0 || HasProjectModified( m_idStyle_Bk ))){ String strMsg = "重设"; if( g_nMelodyTempo!=m_nTempo_Bk ){ strMsg += "速度"; if( g_iMelodyTimeSignature!=m_iTS_Bk ){ strMsg += "和节拍"; } } else{ strMsg += "节拍"; } strMsg += ",将创建新的工程。\n是否保存当前工程?"; MessageForm->m_btnYes->Hint = L"保存当前工程并新建工程"; MessageForm->m_btnNo->Hint = L"放弃当前工程并新建工程"; MessageForm->m_btnCancel->Hint = L"恢复当前工程设定"; int mrRet = MessageForm->ShowMessage( strMsg, MB_ICONQUESTION|MB_YESNOCANCEL ); MessageForm->m_btnYes->Hint = ""; MessageForm->m_btnNo->Hint = ""; MessageForm->m_btnCancel->Hint = ""; if( mrRet==mrYes ){ int iTS_Reset = g_iMelodyTimeSignature, nTempo_Reset = g_nMelodyTempo, idStyle_Reset = g_iSelectedStyleID; g_iMelodyTimeSignature = m_iTS_Bk; g_nMelodyTempo = m_nTempo_Bk; g_iSelectedStyleID = m_idStyle_Bk; Application->MainForm->Perform( UM_SAVEPROJECT, 0, 0 ); g_iMelodyTimeSignature = iTS_Reset; g_nMelodyTempo = nTempo_Reset; g_iSelectedStyleID = idStyle_Reset; Application->MainForm->Perform( UM_NEWPROJECT, 0, 0 ); g_bCanStep = false; } if( mrRet==mrYes || mrRet==mrNo ){ Application->MainForm->Perform( UM_NEWPROJECT, 0, 0 ); g_bCanStep = false; } else{ SetMelodyTempo( m_nTempo_Bk ); SetMelodyTS( m_iTS_Bk ); g_iSelectedStyleID = m_idStyle_Bk; PostMessage(Application->MainFormHandle, UM_REFRESH_PAGE_STATE, PAGE_ALL, 0); } } else if( g_strProjectName.length()>0 ){ String strMsg = "重设"; if( g_nMelodyTempo!=m_nTempo_Bk ){ strMsg += "速度"; if( g_iMelodyTimeSignature!=m_iTS_Bk ){ strMsg += "和节拍"; } } else{ strMsg += "节拍"; } strMsg += ",将创建新的工程。\n是否确定新建工程?"; int mrRet = MessageForm->ShowMessage( strMsg, MB_ICONQUESTION|MB_OKCANCEL ); if( mrRet==mrOk ){ Application->MainForm->Perform( UM_NEWPROJECT, 0, 0 ); g_bCanStep = false; } else{ SetMelodyTempo( m_nTempo_Bk ); SetMelodyTS( m_iTS_Bk ); g_iSelectedStyleID = m_idStyle_Bk; PostMessage(Application->MainFormHandle, UM_REFRESH_PAGE_STATE, PAGE_ALL, 0); } } } else if( Sender && g_iSelectedStyleID!=m_idStyle_Bk ){ g_bBaseComposeLoaded = false; g_bComposeLoaded = false; } //如果没进行过播放操作,产生随机风格ID if( g_iSelectedStyleID == -1 ){ SetDefaultStyle(); } //备份得到的风格ID m_idStyle_Bk = g_iSelectedStyleID; //设置音频节拍 f_MM_SetTimeSignature( g_iMelodyTimeSignature ); //显示下一页 } //--------------------------------------------------------------------------- //add by tj 2013/12/20 void __fastcall TSetupForm::BeatClick(TObject *Sender) { TPNGButton * pButton = (TPNGButton*)Sender; if( m_lstBeat[g_iMelodyTimeSignature]!=pButton ){ f_MM_Stop(); m_lstBeat[g_iMelodyTimeSignature]->Down = false; pButton->Down = true ; SetMelodyTS( pButton->Tag ); if( m_btnBeatPreview1->Visible ){ f_MM_Play( Handle, 0, TYPE_BEAT ); } g_lstStyleSelected.clear();//节拍变换,清除风格类型列表 g_iSelectedStyleID=-1; //重置已选的风格ID m_iSelStyle = -1; m_xCoverPos = 0; m_bDiskOpening = m_bSelectMoving = false; m_pTimerBrowse->Enabled = true; m_iOldSelected = -1; m_xFirstPos = - m_nDiskWidth / 2; m_iFirstStyle = 0; //节拍变换,重新获取推荐ID f_SM_GetStyleRecomInfos( g_iMelodyTimeSignature, m_aPreStyleInfos, &m_nStyleNum ); // if( g_iMelodyTimeSignature != m_iTS_Bk) PostMessage(Application->MainFormHandle, UM_REFRESH_PAGE_STATE, PAGE_SETUPRECORD, 0); else PostMessage(Application->MainFormHandle, UM_REFRESH_PAGE_STATE, PAGE_ALL, 0); } } //--------------------------------------------------------------------------- void __fastcall TSetupForm::PointerPanPaint(TObject *Sender) { //以指定的 pt 为中心, 转动Angle角度 Gdiplus::PointF pointOrg( c_rPoint, c_rPoint ); Matrix gpMatrix; gpMatrix.RotateAt( m_nPointerAngle, pointOrg ); Gdiplus::Graphics gpGraphic( m_panPointer->Canvas->Handle ); Gdiplus::Graphics gpGraphicTab(m_panPointer->Canvas->Handle); //add by tj 2013/12/20 gpGraphic.SetTransform( &gpMatrix ); //旋转画布 Gdiplus::RectF gpPointRect(c_xDrag, c_yDrag, c_wDrag, c_hDrag ); m_pGPRgnDrag->MakeEmpty(); m_pGPRgnDrag->Complement( gpPointRect ); m_pGPRgnDrag->Transform( &gpMatrix ); //旋转前图片在canvas中的位置 Gdiplus::RectF rectPoint( c_xPoint, c_yPoint, c_wPoint, c_hPoint ); if( m_bHover ) gpGraphic.DrawImage( m_pGPImgPointerHover, rectPoint ); else gpGraphic.DrawImage( m_pGPImgPointerNormal, rectPoint ); gpGraphic.ResetTransform(); //add by tj 2013/12/20 Gdiplus::RectF rectPointTap( c_xTapPoint, c_yTapPoint, c_wTapPoint, c_hTapPoint ); if( m_nTapClicked==TAP_NOR ) gpGraphicTab.DrawImage( m_pGPImgTapNormal, rectPointTap ); else if( m_nTapClicked==TAP_FOCUS ) gpGraphicTab.DrawImage( m_pGPImgTapMove, rectPointTap ); else gpGraphicTab.DrawImage( m_pGPImgTapHover, rectPointTap ); } //--------------------------------------------------------------------------- void __fastcall TSetupForm::PointerPanMouseDown(TObject *Sender, TMouseButton Button, TShiftState Shift, int X, int Y) { if( Button!=mbLeft ) return; if( Sender==m_panPointer ) { if( m_pGPRgnDrag->IsVisible(X, Y) ) { Screen->Cursor = crHand1; m_bDraging = true; m_bHover = false; m_panPointer->Invalidate(); }else if(m_pGPRgnTapClick->IsVisible(X,Y)){ //add by tj 2013/12/20 m_nTapClicked = TAP_DOWN; HRESULT hRet = f_MM_RealTimeMIDINoteOn( 42 ); //36 static int nDownNums = 0; static DWORD timeIni = 0; static DWORD timeSAverage = 0; DWORD timeCur = timeGetTime(); static DWORD timePre = timeCur; DWORD nCalTime; bool bTempo200 = (timeCur-timePre) < (60000/200)?(timeCur-timePre!=0?1:0):0; //如果距离上次时间 //大于 一拍最慢速度所需时间 //重置 nDownNums和初始时间 if( timeCur-timePre > 60000/50 ) { nDownNums = 0; timeIni = 0; } nDownNums++; if( nDownNums<=3 ) { if( bTempo200 ) nDownNums--; else if(nDownNums != 1) timeIni += timeCur - timePre; } if( nDownNums>=3 && !bTempo200){ if(nDownNums==3){ nCalTime = timeSAverage = timeIni/2; }else{ //平滑处理 nCalTime = timeCur - timePre; nCalTime = (nCalTime + timeSAverage*3)/4; timeSAverage = nCalTime; } int nTempo; if(nCalTime) nTempo = 60000/nCalTime; if( nTempo>=50 && nTempo<=200 ){ m_labSpeed->Caption = IntToStr( nTempo ); int tmpAngle = (nTempo - c_iScale0) * 270.0 / 150.0 +0.5; if( tmpAngle!=m_nPointerAngle ) m_nPointerAngle = tmpAngle; } } timePre = timeCur; m_panPointer->Invalidate(); }else{ X += m_panPointer->Left; Y += m_panPointer->Top; PointerPanMouseDown( m_imgBk, Button, Shift, X, Y ); } } else if( Sender==m_imgBk && m_pGPRgnClick->IsVisible(X, Y)){ MovePointer( X-c_xOriScr, Y-c_yOriScr ); } } //--------------------------------------------------------------------------- void __fastcall TSetupForm::PointerPanMouseUp(TObject *Sender, TMouseButton Button, TShiftState Shift, int X, int Y) { // if(m_pPlayData){ int nTempo = StrToInt(m_labSpeed->Caption); SetMelodyTempo( nTempo ); // } if( Button!=mbLeft ) return; if( m_bDraging ){ Screen->Cursor = crDefault; m_bDraging = false; if( m_pGPRgnDrag->IsVisible(X, Y) ){ m_bHover = true; m_panPointer->Invalidate(); } }else if(m_nTapClicked) { if( m_pGPRgnTapClick->IsVisible(X, Y) ) m_nTapClicked = TAP_FOCUS; else m_nTapClicked = TAP_NOR; m_panPointer->Invalidate(); } } //--------------------------------------------------------------------------- void __fastcall TSetupForm::PointerPanMouseMove(TObject *Sender, TShiftState Shift, int X, int Y) { static bool bTapHint = false; //提示tap //add by tj 2013/12/23 if( m_pGPRgnDrag->IsVisible(X, Y) ){ if( Screen->Cursor==crDefault ) Screen->Cursor = crHand0; if( m_bDraging ){ MovePointer( X-c_rPoint, Y-c_rPoint ); } else if( !m_bHover ){ m_bHover = true; m_panPointer->Invalidate(); } m_pTapWnd->ReleaseHandle(); //add by tj 2013/12/23 bTapHint = false; m_pTimerTapHint->Enabled = false; }else{ if( m_bHover ){ Screen->Cursor = crDefault; m_bHover = false; m_panPointer->Invalidate(); } //提示tap //add by tj 2013/12/23 if(!m_pGPRgnTapClick->IsVisible(X, Y)){ m_pTapWnd->ReleaseHandle(); bTapHint = false; m_pTimerTapHint->Enabled = false; if( m_nTapClicked!=TAP_DOWN ) m_nTapClicked = TAP_NOR; m_panPointer->Invalidate(); } else if(m_pGPRgnTapClick->IsVisible(X, Y) && !bTapHint){ m_pTimerTapHint->Enabled = true; bTapHint = true; if(m_nTapClicked!=TAP_FOCUS) m_nTapClicked = TAP_FOCUS; m_panPointer->Invalidate(); } } } //--------------------------------------------------------------------------- void __fastcall TSetupForm::PointerPanMouseLeave(TObject *Sender) { Screen->Cursor = crDefault; } //--------------------------------------------------------------------------- void TSetupForm::MovePointer( int deltaX, int deltaY ) { double ratio = deltaX/Sqrt(Power(deltaX, (double)2)+Power(deltaY, (double)2)); int tmpAngle = int(ArcSin( ratio ) * 180 / M_PI + 0.5); if( deltaY>0 ) tmpAngle = 180 - tmpAngle; if( tmpAngle>180 ) tmpAngle = tmpAngle - 360; if( tmpAngle!=m_nPointerAngle && tmpAngle>=-135 && tmpAngle<=135 ){ m_nPointerAngle = tmpAngle; m_panPointer->Invalidate(); int nTempo = c_iScale0 + tmpAngle * 150 / 270; m_labSpeed->Caption = IntToStr(nTempo); SetMelodyTempo( nTempo ); } } //--------------------------------------------------------------------------- void __fastcall TSetupForm::SpeedMouseDown(TObject *Sender, TMouseButton Button, TShiftState Shift, int X, int Y) { int scale = StrToInt( m_labSpeed->Caption ); if( Sender==m_btnSpeedUp ) scale++; else scale--; if( scale<=200 && scale>=50 ){ int tmpAngle = (scale - c_iScale0) * 270.0 / 150.0 +0.5; if( tmpAngle!=m_nPointerAngle ){ m_nPointerAngle = tmpAngle; m_panPointer->Invalidate(); } m_labSpeed->Caption = IntToStr(scale); //int nTempo = StrToInt(m_labSpeed->Caption); SetMelodyTempo( scale ); } } //--------------------------------------------------------------------------- void __fastcall TSetupForm::StepClick(TObject *Sender) { PostMessage(Application->MainFormHandle, UM_JUMP_PAGE, WPARAM(1),LPARAM(this)); } //--------------------------------------------------------------------------- void TSetupForm::SetDefaultStyle(int iTS) { if( m_nStyleNum==0 ){ f_SM_GetStyleRecomInfos( g_iMelodyTimeSignature, m_aPreStyleInfos, &m_nStyleNum ); } else if( iTS!=g_iMelodyTimeSignature ){ m_nStyleNum = 0; f_SM_GetStyleRecomInfos( iTS, m_aPreStyleInfos, &m_nStyleNum ); } if( m_nStyleNum>0 ){ srand((unsigned)time(NULL)); int n = rand()%m_nStyleNum; g_iSelectedStyleID = m_aPreStyleInfos[n].idStyle; g_strSelectedStyleName = UTF8ToMBCS( m_aPreStyleInfos[n].detail.strStyleName ); for( int i=0; i=0 ){ g_lstStyleSelected.push_back(m_aPreStyleInfos[n].detail.type[i]) ; g_iSelectedStyleType = 1<< m_aPreStyleInfos[n].detail.type[i]; } } } else{ DebugPrint("获取推荐风格失败"); } g_iSelectedStyleID_SVD = g_iSelectedStyleID; } //--------------------------------------------------------------------------- void __fastcall TSetupForm::BrowsePaint(TObject *Sender) { if( m_nStyleNum>0 ){ if( m_xFirstPos<0 && m_xFirstPos<=-m_nDiskWidth ){ m_xFirstPos += m_nTileWidth; m_iFirstStyle = (m_iFirstStyle+1) % m_nStyleNum; } else if( m_xFirstPos>0 && m_xFirstPos>m_nTileWidth-m_nDiskWidth ){ m_xFirstPos -= m_nTileWidth; m_iFirstStyle = (m_iFirstStyle-1+m_nStyleNum) % m_nStyleNum; } int x = m_xFirstPos, i = m_iFirstStyle,iFontClr; m_panBrowse->Canvas->Brush->Style=bsClear; // m_panBrowse->Canvas->Font->Size = sFont7; while( xWidth ){ if( m_iSelStyle==i && !m_bSelectMoving ){ m_panBrowse->Canvas->Draw(x, 0, m_pImgSelStyle); //无盖子上显示字体,有渐渐打开的效果 m_panBrowse->Canvas->Font->Color = clWhite; m_panBrowse->Canvas->TextOutW(78+x,114,"NO."+IntToStr(i+1)); m_panBrowse->Canvas->Draw(x+m_xCoverPos, 0, m_pImgCover); } else{ int ind = m_aPreStyleInfos[i].detail.type[0]; if( ind>=nImgStyleNum ) ind = nImgStyleNum-1; m_panBrowse->Canvas->Draw(x, 0, m_paImgStyles[ind]); //有盖子顶部显示透明后颜色的字体, m_panBrowse->Canvas->Font->Color = 0x00D1D7DA; m_panBrowse->Canvas->TextOutW(78+x,114,"NO."+IntToStr(i+1)); } x += m_nTileWidth; i = (i+1) % m_nStyleNum; } } } //--------------------------------------------------------------------------- void __fastcall TSetupForm::BrowseMouseDown(TObject *Sender, TMouseButton Button, TShiftState Shift, int X, int Y) { if( m_nStyleNum<=0 ) return; //停止移动 int xPos = m_xFirstPos, iStyle = m_iFirstStyle, iSelect = -1; TRect rectHit( 0, 0, m_nCoverWidth, m_nDiskHeight ); while( xPosWidth ){ rectHit.left = xPos; rectHit.right = rectHit.left+m_nCoverWidth; if( rectHit.PtInRect( TPoint(X, Y )) ){ iSelect = iStyle; break; } xPos += m_nTileWidth; iStyle = (iStyle+1) % m_nStyleNum; } if( iSelect!=-1 && m_iSelStyle!=iSelect ){ if( m_btnBeatPreview1->Visible ){ BeatPreviewClick( m_btnBeatPreview1 ); } if( m_iHintStyle!=-1 ){ m_iHintStyle = -1; m_pStyleInfoWnd->ReleaseHandle(); } m_iSelStyle = iSelect; //得到选择的风格ID g_iSelectedStyleID = m_aPreStyleInfos[iSelect].idStyle; //提取风格名称 g_strSelectedStyleName = UTF8ToMBCS( m_aPreStyleInfos[iSelect].detail.strStyleName ); //添加选择的风格类型 g_lstStyleSelected.clear(); g_iSelectedStyleType = 0; for( int i=0; i=nImgStyleNum ) iType = nImgStyleNum-1; g_iSelectedStyleType |= 1<< iType; } for( int j=0; j<32; j++ ){ if( g_iSelectedStyleType & (1<=nImgStyleNum ){ iImg = nImgStyleNum - 1; } String strImgName = L"diskb"+IntToStr( iImg ); m_pImgSelStyle->LoadFromResourceName(int(HInstance), strImgName); int iSelectPos = (iSelect-m_iFirstStyle+m_nStyleNum) % m_nStyleNum; if( iSelectPos<2 || (iSelectPos==2 && m_xFirstPos<-m_nDiskWidth/2 )){ m_iDirection = BROWSE_RIGHT; } else if( iSelectPos>2 || (iSelectPos==2 && m_xFirstPos>-m_nDiskWidth/2 )){ m_iDirection = BROWSE_LEFT; } m_xCoverPos = 0; m_btnBrowseLeft->Down = false; m_btnBrowseRight->Down = false; m_bDiskOpening = false; m_bSelectMoving = true; m_pTimerBrowse->Enabled = true; if( g_lstMelodyBars.empty() && m_aPreStyleInfos[iSelect].detail.iTempo!=g_nMelodyTempo ){ int iTempo = m_aPreStyleInfos[iSelect].detail.iTempo; if( iTempo>200 ) iTempo = 200; else if( iTempo<50 ) iTempo = 50; int tmpAngle = (iTempo - c_iScale0) * 270.0 / 150.0 +0.5; if( tmpAngle!=m_nPointerAngle ){ m_nPointerAngle = tmpAngle; m_panPointer->Invalidate(); } m_labSpeed->Caption = IntToStr(iTempo); SetMelodyTempo( iTempo ); } } //从头播放或者停止播放 /* if(m_pPlayData) { if(m_iSelStyle==m_iOldSelected) { f_MM_PlayStyleDemo(m_pPlayData,m_nPlayData, 0); } else { m_iOldSelected = m_iSelStyle; f_MM_StopStyleDemo(); delete m_pPlayData; m_pPlayData = NULL; m_nPlayData = 0; } } else{ m_iOldSelected = m_iSelStyle; } */ if( m_iSelStyle!=m_iOldSelected) { f_MM_Stop(); m_iOldSelected = m_iSelStyle; } } //--------------------------------------------------------------------------- void __fastcall TSetupForm::BrowseMouseMove(TObject *Sender, TShiftState Shift, int X, int Y) { //开盒时不显示信息 if( m_bDiskOpening || m_bSelectMoving || m_nStyleNum<=0 ) return; //停止移动 int xPos = m_xFirstPos, iStyle = m_iFirstStyle, iSelect = -1; TRect rectHit( 0, 0, m_nCoverWidth, m_nDiskHeight ); while( xPosWidth ){ rectHit.left = xPos; rectHit.right = rectHit.left+m_nCoverWidth; if( rectHit.PtInRect( TPoint(X, Y )) ){ iSelect = iStyle; break; } xPos += m_nTileWidth; iStyle = (iStyle+1) % m_nStyleNum; } if( iSelect!=-1 ){ if( iSelect!=m_iHintStyle ){ m_pTimerHint->Enabled = true; m_iHintStyle = iSelect; //鼠标停留显示 //HRESULT ret = f_MF_GetStyleInfo(m_aPreStyleIDs[m_iHintStyle][2],&m_tOnShowHit); m_pTimerBrowse->Enabled = false; } } else{ if( m_iHintStyle!=-1 ){ m_iHintStyle = -1; m_pStyleInfoWnd->ReleaseHandle(); } if( m_iDirection!=BROWSE_PAUSE ){ m_pTimerBrowse->Enabled = true; } } } //--------------------------------------------------------------------------- void __fastcall TSetupForm::BrowseMouseLeave(TObject *Sender) { if( m_iHintStyle!=-1 ){ m_iHintStyle = -1; m_pStyleInfoWnd->ReleaseHandle(); } if( m_iDirection!=BROWSE_PAUSE ){ m_pTimerBrowse->Enabled = true; } } //--------------------------------------------------------------------------- void __fastcall TSetupForm::BrowseTimerProc(TObject* Sender) { if( m_bDiskOpening ){ if( m_xCoverPos <= 17-m_nDiskWidth ){ m_pTimerBrowse->Enabled = false; m_bDiskOpening = false; PlayMidiStyle(); return; } m_xCoverPos -= BROWSE_SPEED*2; } else if( m_bSelectMoving ){ if( m_iFirstStyle==(m_iSelStyle-2+m_nStyleNum)%m_nStyleNum && m_xFirstPos<(-m_nDiskWidth/2+BROWSE_SPEED*10) && m_xFirstPos>(-m_nDiskWidth/2-BROWSE_SPEED*10) ){ m_xFirstPos = -m_nDiskWidth/2; m_iDirection = BROWSE_PAUSE; m_bSelectMoving = false; m_bDiskOpening = true; m_panBrowse->Invalidate(); return; } else{ m_xFirstPos += m_iDirection * BROWSE_SPEED*10; } } else{ m_xFirstPos += m_iDirection *BROWSE_SPEED*(s_iSpeedDownTimes==1?1:s_iBrowseStep*s_iSpeedDownTimes); } m_panBrowse->Invalidate(); } //--------------------------------------------------------------------------- void __fastcall TSetupForm::HintTimerProc(TObject* Sender) { m_pTimerHint->Enabled = false; if( m_iHintStyle==-1 ) return; int xPos = m_xFirstPos+(m_iHintStyle-m_iFirstStyle + m_nStyleNum)%m_nStyleNum*m_nTileWidth; if( xPos<=0 ) xPos = 0; TPoint point( xPos, m_panBrowse->Height + 4); point = m_panBrowse->ClientToScreen( point ); String strHint = "风格名称:"; // strHint+=m_tOnShowHit.chName; strHint += UTF8ToMBCS(m_aPreStyleInfos[m_iHintStyle].detail.strStyleName).c_str(); // strHint += "("+IntToStr(m_iHintStyle)+")"; strHint+="\n作 者:"; // strHint+=m_tOnShowHit.chAuthor; strHint += UTF8ToMBCS( m_aPreStyleInfos[m_iHintStyle].detail.strAuthor ).c_str(); strHint+="\n原 速:"; // strHint+= IntToStr(m_tOnShowHit.nSpeed); strHint+= IntToStr( m_aPreStyleInfos[m_iHintStyle].detail.iTempo ); strHint+="\n简 介:"; // strHint+=m_tOnShowHit.chDescription; strHint += UTF8ToMBCS( m_aPreStyleInfos[m_iHintStyle].detail.strDescription ).c_str(); m_pStyleInfoWnd->ShowHintWindow(point, strHint); } //--------------------------------------------------------------------------- void TSetupForm::PlayMidiStyle() { int nSize = 1000000; BYTE* pData = new BYTE[1000000]; int ret = f_SM_GetStyleDemo( nSize, pData, m_aPreStyleInfos[m_iSelStyle].idStyle, -1, -1, -1, -1 ); f_MM_PlayStyleDemo( pData, nSize, g_nMelodyTempo); delete[] pData; } //--------------------------------------------------------------------------- void __fastcall TSetupForm::BtnBrowseMouseDown(TObject *Sender, TMouseButton Button, TShiftState Shift, int X, int Y) { if( m_iSelStyle!=-1 ) f_MM_Stop(); //设置按下状态 ((TPNGButton*)Sender)->SetDown(true); if( Sender==m_btnBrowseLeft ){ m_btnBrowseRight->SetDown(false); m_iDirection = BROWSE_LEFT; if(!s_bLeft) s_iSpeedDownTimes = 0; s_bLeft = true; s_bRight = false; } else{ m_btnBrowseLeft->SetDown(false); m_iDirection = BROWSE_RIGHT; if(!s_bRight) s_iSpeedDownTimes = 0; s_bLeft = false; s_bRight = true; } //左、右键分别为加速、减速 if(Button==mbLeft) s_iSpeedDownTimes++; else s_iSpeedDownTimes--; //超过最大次数回到初值 if(s_iSpeedDownTimes>s_iMaxTimes) s_iSpeedDownTimes = s_iMaxTimes; else if(s_iSpeedDownTimes<1) s_iSpeedDownTimes = 1; m_iSelStyle = -1; m_xCoverPos = 0; if( m_iHintStyle!=-1 ){ m_iHintStyle = -1; m_pStyleInfoWnd->ReleaseHandle(); } m_bDiskOpening = m_bSelectMoving = false; m_pTimerBrowse->Enabled = true; } //--------------------------------------------------------------------------- void __fastcall TSetupForm::FormKeyDown(TObject *Sender, WORD &Key, TShiftState Shift) { switch( Key ){ case VK_F9: if( m_btnNextStep->Enabled ){ StepClick( m_btnNextStep ); } break; case VK_SPACE: //add by tj 2013/12/20 PointerPanMouseDown( m_panPointer, mbLeft, TShiftState(NULL), c_rPoint, c_rPoint ); break; default: Application->MainForm->OnKeyDown( Sender, Key, Shift ); } } //--------------------------------------------------------------------------- void __fastcall TSetupForm::BeatPreviewClick(TObject *Sender) { if( Sender==m_btnBeatPreview0 ){ m_btnBeatPreview0->Hide(); m_btnBeatPreview1->Show(); f_MM_Stop(); m_iSelStyle = -1; m_xCoverPos = 0; m_bDiskOpening = m_bSelectMoving = false; m_pTimerBrowse->Enabled = true; f_MM_Play( Handle, 0, TYPE_BEAT ); } else{ m_btnBeatPreview0->Show(); m_btnBeatPreview1->Hide(); f_MM_Stop(); } } //--------------------------------------------------------------------------- /* void TSetupForm::CleanData() { f_MM_Stop(); if (m_btnBeatPreview1->Visible) { BeatPreviewClick(m_btnBeatPreview1); } m_pTimerBrowse->Enabled = false; m_pTimerHint->Enabled = false; m_iDirection = BROWSE_PAUSE; m_btnBrowseRight->Down = false; m_btnBrowseLeft->Down = false; m_bDiskOpening = m_bSelectMoving = false; m_iSelStyle = -1; m_xCoverPos = 0; } //--------------------------------------------------------------------------- */ bool TSetupForm::IsModifySetInfo() { StepClick(NULL); return true; } //--------------------------------------------------------------------------- void __fastcall TSetupForm::HintTimerTapProc(TObject* Sender) { m_pTimerTapHint->Enabled = false; TPoint point( m_panPointer->Width/2, m_panPointer->Height/2+c_hTapPoint/2); point = m_panPointer->ClientToScreen( point ); String strHint = "Tap: 设置速度\n连续点击鼠标或空格键"; m_pTapWnd->ShowHintWindow(point, strHint); } //---------------------------------------------------------- //add by tj 2013/12/20 void __fastcall TSetupForm::FormKeyUp(TObject *Sender, WORD &Key, TShiftState Shift) { switch( Key ){ case VK_SPACE: //add by tj 2013/12/20 PointerPanMouseUp(NULL, mbLeft, TShiftState(NULL),0 ,0); break; default: break; } } //--------------------------------------------------------------------------- void __fastcall TSetupForm::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 = 460;//m_btnVolAudioSet->Top; g_panelFontName->Top = g_btnFontChange->Top + 1; g_lbFontSelect->Top = g_panelFontName->Top - g_lbFontSelect->Height; g_btnFontChange->Left = 45;//m_panelStyleName->Left + m_panelStyleName->Width + 20; g_panelFontName->Left = g_btnFontChange->Left + g_btnFontChange->Width; g_lbFontSelect->Left = g_panelFontName->Left; } } //--------------------------------------------------------------------------- void __fastcall TSetupForm::UMHidePopControl(TMessage &msg) { if( g_lbFontSelect->Visible ){ g_lbFontSelect->Hide(); g_btnFontChange->Down = false; } } //---------------------------------------------------------------------------