ファイルの文字列を1行ずつ読み込み、文字列の数字の範囲によって再生する音楽を変えるプログラムを作成していますが、読み込んだ文字列とは無関係に、ループの初めの範囲で指定してある音楽しか再生されません。読み込んだ文字列ごとに再生音楽を変えるにはどうすればいいのでしょうか?分かる方ご教授願います。
環境:WindowsXP, Visual C++ 2008 Express Edition
以下がプログラムのソースの一部です。
LRESULT CALLBACK WndProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam)
{
FILE *fp;
errno_t err;
TCHAR buf[30];
TCHAR *temp;
int m=0, n=0;
switch(msg)
{
case WM_CREATE:
CreateWindow(TEXT("BUTTON"), TEXT("Play"), WS_CHILD | WS_VISIBLE | BS_PUSHBUTTON,120, 100, 70, 70, hWnd, NULL, hInst, NULL);
break;
case WM_COMMAND:
err = _tfopen_s(&fp, TEXT("C:\\Documents and Settings\\m22015\\My Documents\\Visual Studio 2008\\Projects\\process\\process\\Corner.txt"), TEXT("r+"));
if(err != 0)
break;
temp = (TCHAR*)malloc(_tcsclen(buf)+1);
if(temp == NULL){
MessageBox(hWnd, TEXT("Can't secure of memory"), TEXT("Error"), MB_OK);
break;
}
for(int i=0; i<2; i++){
_fgetts(buf, 10, fp);
_tcstok(buf, TEXT("\n"));
}
while(_fgetts(buf, 30, fp) != NULL){
_tcstok(buf, TEXT("\n"));
_tcscpy(temp, buf);
while(_stprintf(buf, _T("- { x:%d, y:%d }"), m, n)!=EOF){
if((m>=0 && m<110)&&(n>=0 && n<200)){
if(mciSendString(_T("play C+1.mid"), NULL, 0, NULL) != 0)
{
MessageBox(hWnd, _T("Can't play C+1.mid"), _T("Error"), MB_OK);
SendMessage(hWnd, WM_CLOSE, 0, 0);
}
return 0;
}else if((m>=110 && m<220)&&(n>=0 && n<200)){
if(mciSendString(_T("play D+1.mid"), NULL, 0, NULL) != 0)
{
MessageBox(hWnd, _T("Can't play D+1.mid"), _T("Error"), MB_OK);
SendMessage(hWnd, WM_CLOSE, 0, 0);
}
return 0;
}else if((m>=220 && m<330)&&(n>=0 && n<200)){
if(mciSendString(_T("play E+1.mid"), NULL, 0, NULL) != 0)
{
MessageBox(hWnd, _T("Can't play E+1.mid"), _T("Error"), MB_OK);
SendMessage(hWnd, WM_CLOSE, 0, 0);
}
return 0;
}else if((m>=330 && m<440)&&(n>=0 && n<200)){
if(mciSendString(_T("play F+1.mid"), NULL, 0, NULL) != 0)
{
MessageBox(hWnd, _T("Can't play F+1.mid"), _T("Error"), MB_OK);
SendMessage(hWnd, WM_CLOSE, 0, 0);
}
return 0;
}else if((m>=440 && m<550)&&(n>=0 && n<200)){
if(mciSendString(_T("play G+1.mid"), NULL, 0, NULL) != 0)
{
MessageBox(hWnd, _T("Can't play G+1.mid"), _T("Error"), MB_OK);
SendMessage(hWnd, WM_CLOSE, 0, 0);
}
return 0;
}else if((m>=550 && m<660)&&(n>=0 && n<200)){
if(mciSendString(_T("play A+1.mid"), NULL, 0, NULL) != 0)
{
MessageBox(hWnd, _T("Can't play A+1.mid"), _T("Error"), MB_OK);
SendMessage(hWnd, WM_CLOSE, 0, 0);
}
return 0;
}else if((m>=660 && m<770)&&(n>=0 && n<200)){
if(mciSendString(_T("play B+1.mid"), NULL, 0, NULL) != 0)
{
MessageBox(hWnd, _T("Can't play B+1.mid"), _T("Error"), MB_OK);
SendMessage(hWnd, WM_CLOSE, 0, 0);
}
return 0;
}else if(mciSendString(_T("play C.mid"), NULL, 0, NULL) != 0)
{
MessageBox(hWnd, _T("Can't play C.mid"), _T("Error"), MB_OK);
SendMessage(hWnd, WM_CLOSE, 0, 0);
}
return 0;
}else if((m>=110 && m<220)&&(n>=200 && n<400)){
if(mciSendString(_T("play D.mid"), NULL, 0, NULL) != 0)
{
MessageBox(hWnd, _T("Can't play D.mid"), _T("Error"), MB_OK);
SendMessage(hWnd, WM_CLOSE, 0, 0);
}
return 0;
以下省略
.
.
.
}else{
break;
}
}
}
free(temp);
fclose(fp);
break;
case WM_CLOSE:
DestroyWindow(hWnd);
break;
case WM_DESTROY:
PostQuitMessage(0);
break;
default:
return (DefWindowProc(hWnd, msg, wParam, lParam));
}
return 0;
}
お礼
遅くなりましたが、回答ありがとうございます。 ファイルは %YAML:1.0 - { x:476, y:36 } - { x:789, y:121 } - { x:546, y:61 } - { x:109, y:300 } - { x:560, y:87 } - { x:462, y:20 } ・ ・ ・ のようになっています。 数値の変化するごとに、mとnで範囲を指定した音楽を再生させたいと考えているのですが・・・。 あと、訂正ですが while(_stprintf(buf, _T("- { x:%d, y:%d }"), m, n)!=EOF){ ではなくて、 while(_stscanf(buf, _T("- { x:%d, y:%d }"), m, n)!=EOF){ です(>_<;) ごめんなさい。 if-elseは簡略化できるんですね!ありがとうございます!!