猫でもわかる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;
}
お礼
回答ありがとうございます。 画像付の説明恐れ入ります。イベントハイドラについてはそういうのがあるということは知っていましたが作ったことは無かったので参考になりました。 早速実装してみたところ、正常にデバッグが終了いたしました。 ウィンドウプロシージャがいけないようですね。 ですが私が今後実装したいと考えているプログラムは、グローバルフックを使い他のプログラム(FireFoxなど)のWM_MOVEを取得したいと考えています。 そのため今回はメッセージの扱いを学ぶためにウィンドウプロシージャを使用しました。 今後もこの分野で何度か質問をさせていただく事があると思います。その時はまたぜひ助けていただければ幸いです。 今回は本当にありがとうございます。