Files
AccompanyCube/SetupFormUnit.cpp
2026-06-13 00:10:11 +08:00

1239 lines
32 KiB
C++

//---------------------------------------------------------------------------
#include <vcl.h>
#pragma hdrstop
#include <System.Math.hpp>
#include <mmsystem.h> //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; i<nImgStyleNum; i++ ){
if( m_paImgStyles[i] )
delete m_paImgStyles[i];
}
if( m_paImgStyles )
delete m_paImgStyles;
delete m_pTimerBrowse;
delete m_pTimerHint;
delete m_pStyleInfoWnd;
SAFE_DELETE(m_pGPImgTapNormal);//add by tj 2013/12/23
SAFE_DELETE(m_pGPImgTapMove);
SAFE_DELETE(m_pGPImgTapHover);
SAFE_DELETE(m_pGPRgnTapClick);
SAFE_DELETE(m_pTimerTapHint);
SAFE_DELETE(m_pTapWnd);
}
//---------------------------------------------------------------------------
void __fastcall TSetupForm::FormActivate(TObject *Sender)
{
if( Sender ){
return;
}
//速度指针初始化
m_bDraging = m_bHover = false;
m_nTapClicked = TAP_NOR;//add by tj 2013/12/20
// m_bDraging = m_bHover = false;
m_labSpeed->Font->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<sizeof(m_aPreStyleInfos[n].detail.type); i++ ){
if( m_aPreStyleInfos[n].detail.type[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( x<m_panBrowse->Width ){
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( xPos<m_panBrowse->Width ){
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<sizeof(m_aPreStyleInfos[iSelect].detail.type); i++ ){
int iType = m_aPreStyleInfos[iSelect].detail.type[i];
if( iType<0 )
break;
else if( iType>=nImgStyleNum )
iType = nImgStyleNum-1;
g_iSelectedStyleType |= 1<< iType;
}
for( int j=0; j<32; j++ ){
if( g_iSelectedStyleType & (1<<j) )
g_lstStyleSelected.push_back(j);
}
if( m_pImgSelStyle!=NULL )
delete m_pImgSelStyle;
m_pImgSelStyle = new TBitmap();
int iImg = m_aPreStyleInfos[iSelect].detail.type[0];
if( iImg>=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( xPos<m_panBrowse->Width ){
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;
}
}
//---------------------------------------------------------------------------