ファイルの文字列を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;
}
No.1ベストアンサー
- 回答日時:
>読み込んだ文字列とは無関係に、ループの初めの範囲で指定してある音楽しか再生されません。
>読み込んだ文字列ごとに再生音楽を変えるにはどうすればいいのでしょうか?
読み込んだ「文字列」を、範囲指定で用いている? m n へ「関係」付けている部分が見あたりませんが・・???
文字列の仕様と、「関係」付けている部分(「以下省略」部分?)を補足していただければ、「回答」がつくと思われます。
+++++++++++++++++++++++++++++++++++++++
現状では、
・読み込まれる文字列をテーブル化し、m n と関係付ける。
・文字列に「数」が2つ、そのものズバリ含まれるのなら、数値化する関数( atoi() 等)を用い m n へ代入する。
としか・・。
蛇足
if((m>=0 && m<110)&&(n>=0 && n<200)){
・(略)
return 0;
}else if((m>=110 && m<220)&&(n>=0 && n<200)){
・(略)
・(略)
return 0;
}else if((m>=660 && m<770)&&(n>=0 && n<200)){
・(略)
return 0;
}
この50行は、( m n は負ではないと仮定)
・char cTitle[ 8 ] = { "CDEFGAB" }; と異なる部分を配列にし、
・共通部分( n >= 0 && n < 200 )を大外に、
if( n < 200 ){
for( i = 0; i < 7; i++ ){
if( m < ( 110 * ( 1 + i ) ) ){ // 110,220,330,・・770
・(略:メッセージ?文字列作成等)
return( 0 );
}
}
}
と簡略化できますよ。もちろん else 「なんて」そもそもから不要です。
遅くなりましたが、回答ありがとうございます。
ファイルは
%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は簡略化できるんですね!ありがとうございます!!
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- C言語・C++・C# c言語の問題の説明、各所ごとに 5 2023/07/26 11:03
- C言語・C++・C# プログラミングの授業の課題です 1 2023/01/17 22:15
- C言語・C++・C# c言語の問題です 3 2023/01/10 16:15
- FX・外国為替取引 mql4のコンパイルエラー箇所の修正お願いします。 1 2023/03/15 16:14
- C言語・C++・C# バイナリファイルをコピーするのにかかる時間を測りたいのですが実行するとFatel error:gli 2 2022/11/03 01:10
- JavaScript clear機能を失わずにファイルアップロード機能を作成したい 3 2023/06/10 16:12
- PHP php エラー 2 2022/10/23 16:43
- JavaScript 画像の表示位置 3 2022/12/23 08:25
- MySQL php テーブルを作れない 2 2022/11/17 18:22
- PHP php テーブルが作成できない 1 2022/11/17 23:41
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
Win32APIにて、ウィンドウ全体...
-
音量調節
-
C++のcase文の書き方
-
Win32APIでウィンドウを中央に...
-
トラックのループの仕方
-
LoadImageとSetCursorについて
-
C言語のfor文です。 繰り返しの...
-
2÷3などの余りについて
-
信頼区間の1.96や1.65ってどこ...
-
Enterキーを押されたら次の処理...
-
*をユーザーが入力した数字の数...
-
fgetsなどのときのstdinのバッ...
-
C言語で%を使わない余りの出し方
-
C言語
-
プログラムでの数字につく”f”の...
-
break文でループを一気に抜ける...
-
マイナスからプラスへ転じた時...
-
#define _CRT_SECURE_NO_WARNIN...
-
既定のコンストラクタがありま...
-
ある商品のロス率を5%見込み、...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
エディットボックスの背景の色...
-
ダイアログプログラムでEnterキ...
-
C言語win32api、エディットボッ...
-
音量調節
-
エディットコントロール入力時...
-
プログラミングでエラーが出ま...
-
エラー Run-Time Check Failur...
-
キャレットの現在位置の表示 (W...
-
LoadImageとSetCursorについて
-
コンソールアプリケーションの...
-
画像を表示したいのですが……
-
ボタンの色(WINAPI)
-
COMPORTマルチスレッドで例外発生
-
C++のcase文の書き方
-
Win32APIでウィンドウを中央に...
-
PeekMessageについて
-
CTreeCtrlのCreate関数でエラー...
-
オーバーレイみたいな処理がしたい
-
この列挙体でsysjanの関数はあ...
-
DirectInputについて再
おすすめ情報