- ベストアンサー
猫でもわかるWindowsプログラミングの5.2タイピングソフトのプログラムについて
猫でもわかるWindowsプログラミング第3版の5.2タイピングソフトのプログラムなのですが、 本のプログラムをそのまま書くと、タイプミス!の分岐にはいらないんですが、これは本が間違ってるんでしょうか? 付属のCD-ROMのプログラム(本の方とは少し違う)は正しく動いているようですが、 本に書いてある方がなぜ上手くいかないのかが理解できません。 もし本が間違えているなら、どこが間違っているのか教えていただけると助かります。 下のコードは本に書いてあった方のウィンドウプロージャ部を写したものです。 LRESULT CALLBACK WndProc(HWND hWnd, UINT msg, WPARAM wp, LPARAM lp) { HDC hdc; PAINTSTRUCT ps; MMTIME mm; switch (msg) { case WM_CREATE: srand((unsigned)time(NULL)); break; case WM_PAINT: hdc = BeginPaint(hWnd, &ps); TextOut(hdc, 0, 0, szMondai, lstrlen(szMondai)); TextOut(hdc, 0, 40, szInput, lstrlen(szInput)); if(bSeikai) SetTextColor(hdc, RGB(0,0,0)); else SetTextColor(hdc, RGB(255,0,0)); TextOut(hdc,0,80,szCheck,lstrlen(szCheck)); EndPaint(hWnd, &ps); break; case WM_CHAR: if(wp == VK_SPACE && !bStart) { bStart = TRUE; TypeStart(hWnd); break; } if(bStart == FALSE) return DefWindowProc(hWnd, msg, wp, lp); if(wp == VK_ESCAPE) { lstrcpy(szMondai, TEXT("")); lstrcpy(szInput, TEXT("")); lstrcpy(szCheck, TEXT("")); InvalidateRect(hWnd, NULL, TRUE); bStart = FALSE; break; } wsprintf(szInput, TEXT("あなたの入力=\"%c\""), (int)wp); if(szMondai[6] == szInput[14]) { bSeikai = TRUE; mm.wType = TIME_MS; timeGetSystemTime(&mm, sizeof(MMTIME)); dwEnd = mm.u.ms; wsprintf(szCheck, TEXT("反応時間[%dミリ秒]"), dwEnd - dwStart); TypeStart(hWnd); } else { bSeikai = FALSE; MessageBeep(MB_OK); lstrcpy(szCheck, TEXT("タイプミス!")); } InvalidateRect(hWnd, NULL, TRUE); break; case WM_DESTROY: PostQuitMessage(0); break; default: return (DefWindowProc(hWnd, msg, wp,lp)); } return 0; } int TypeStart(HWND hWnd) { int n; MMTIME mm; n = rand() % 26; wsprintf(szMondai, TEXT("問題=\"%c\""), 'a' + n); mm.wType = TIME_MS; timeGetSystemTime(&mm, sizeof(MMTIME)); dwStart = mm.u.ms; InvalidateRect(hWnd, NULL, TRUE); return 0; }
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
この本持ってます。 たしかこれは文字の数え方が間違っていました。 if(szMondai[6] == szInput[14]) を if(szMondai[4] == szInput[8]) としてみて下さい。 UNICODEは1バイト文字も2バイト文字も1文字として数えます。 (例題では2バイト文字を2文字として数えている。) というかそもそも文字列の中の1文字を比較するのが間違いだと思います。 TypeStartの中のnをszMondaiなどと同じくグローバルで宣言し、 if(n+'a' == (int)wp) などにすると間違えにくいのでは。
その他の回答 (2)
- cametan_42
- ベストアンサー率62% (164/264)
と言うか、この手の「特定の書籍」に関する質問は、作者に連絡するとか、サポートサイトを訪れてみる方が確実ですよ。 公式サイトは以下のようで、 猫でもわかるプログラミング: http://homepage2.nifty.com/c_lang/ 一番下に作者へのE-mailのリンクがありますから、著者に伺った方が確実だと思いますよ。
お礼
そうですね・・・ありがとうございます!
- php504
- ベストアンサー率42% (926/2160)
if(szMondai[6] == szInput[14]) { を if(szMondai[8] == szInput[16]) { にするかまたは wsprintf(szInput, TEXT("あなたの入力=\"%c\""), (int)wp); を wsprintf(szInput, TEXT("あなたの入力=%c"), (int)wp); wsprintf(szMondai, TEXT("問題=\"%c\""), 'a' + n); を wsprintf(szMondai, TEXT("問題=%c"), 'a' + n); にすればいいかも それとwsprintf( )使うならTEXT(" ")ではなくてL" "にすべきかな
補足
両方試してみたのですが、だめでした・・・ 結果は変わらず、タイプミス!がでませんでした。
お礼
どうやら文字セットが間違っていたようですね・・・ UNICODEからマルチバイト文字セットに変更してみたら成功しました! ありがとうございました