Win32APIでキー入力を用いた簡易タイピングソフトを作成したのですが、うまく実行されません
いつもお世話になっております。
只今、Windows10上でC言語とWin32APIを使用し、VisualStudioでコンパイルしながらWindowsプログラミングを勉強しています。
今回、質問させて頂きたいのは、「猫でもわかるWindowsプログラミング第4版」の第5章簡易タイピングソフトを作るの回で、掲載されてあったコードを実行してみたのですが、ウィンドウが起動しても、真っ白の状態でタイピングの問題が出題されません。
グローバル変数のTCHAR szMondai[32], szInput[32], szCheck[32];あたりが怪しいと思うのですが、アドバイスよろしくお願いいたします。
#pragma comment(lib, "winmm.lib")
#include <windows.h>
#include <time.h>
LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);
ATOM InitApp(HINSTANCE);
BOOL InitInstance(HINSTANCE, int);
int TypeStart(HWND);
TCHAR szClassName[] = TEXT("Key01");
TCHAR szMondai[32], szInput[32], szCheck[32];
int iMon;
DWORD dwStart, dwEnd;
BOOL bStart = FALSE, bSeikai = TRUE;
int WINAPI WinMain(HINSTANCE hCurInst, HINSTANCE hPrevInst, LPSTR lsCmdLine, int nCmdShow) {
MSG msg;
BOOL bRet;
if (!InitApp(hCurInst))
return FALSE;
if (!InitInstance(hCurInst, nCmdShow))
return FALSE;
// メッセージ取得
while ((bRet = GetMessage(&msg, NULL, 0, 0)) != 0) {
if (bRet == -1) {
break;
}
else {
TranslateMessage(&msg); // メッセージ変換
DispatchMessage(&msg); // メッセージを送出
}
}
return (int)msg.wParam;
}
// ウィンドウクラスの登録
ATOM InitApp(HINSTANCE hInst) {
WNDCLASSEX wc;
wc.cbSize = sizeof(WNDCLASSEX); // 構造体のサイズ
wc.style = CS_HREDRAW | CS_VREDRAW; // クラスのスタイル
wc.lpfnWndProc = WndProc; // プロシージャ名
wc.cbClsExtra = 0;
wc.cbWndExtra = 0;
wc.hInstance = hInst; // インスタンス
wc.hIcon = NULL;
wc.hCursor = (HCURSOR)LoadImage(
NULL, MAKEINTRESOURCE(IDC_ARROW),
IMAGE_CURSOR, 0, 0, LR_DEFAULTSIZE | LR_SHARED
);
wc.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH); // 背景ブラシ
wc.lpszMenuName = NULL; // メニュー名
wc.lpszClassName = szClassName; // クラス名
wc.hIconSm = NULL;
return (RegisterClassEx(&wc));
}
BOOL InitInstance(HINSTANCE hInst, int nCmdShow) {
HWND hWnd;
hWnd = CreateWindow(szClassName, // クラス名
TEXT("猫でもわかるKeyプログラム"), // ウインドウ名
WS_OVERLAPPEDWINDOW, // ウィンドウスタイル
CW_USEDEFAULT, // x位置
CW_USEDEFAULT, // y位置
240, // window幅
180, // window高さ
NULL, // 親ウィンドウのハンドル、親を作るときはNULL
NULL,
hInst,
NULL
);
if (!hWnd)
return FALSE;
ShowWindow(hWnd, nCmdShow); // ウィンドウの表示状態を設定
UpdateWindow(hWnd); // ウィンドウを更新
return TRUE;
}
// ウィンドウプロシージャ(コールバック関数)
LRESULT CALLBACK WndProc(HWND hWnd, UINT msg, WPARAM wp, LPARAM lp) {
HDC hdc;
PAINTSTRUCT ps;
static HMENU hMenu;
MMTIME mm;
switch (msg) {
case WM_CREATE:
srand((unsigned int)time(NULL));
hMenu = GetMenu(hWnd);
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 (iMon == (int)wp) {
bSeikai = TRUE;
// システム時刻をミリ秒単位で取得
mm.wType = TIME_MS;
timeGetSystemTime(&mm, sizeof(MMTIME));
dwEnd = mm.u.ms;
wsprintf(szCheck, TEXT(" 反応時間[%d ミリ秒]"), dwEnd - mm.u.ms);
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;
iMon = 'a' + n;
wsprintf(szMondai, TEXT(" 問題 =\"%c\""), iMon);
// システム時刻を取得
mm.wType = TIME_MS;
timeGetSystemTime(&mm, sizeof(MMTIME));
dwStart = mm.u.ms;
InvalidateRect(hWnd, NULL, TRUE);
return 0;
}