52545


いつもお世話になっております。  
只今、Windows10上でC言語とWin32APIを使用し、VisualStudioでコンパイルしながらWindowsプログラミングを勉強しています。

今回、質問させて頂きたいのは、「猫でもわかるWindowsプログラミング第4版」の第5章簡易タイピングソフトを作るの回で、掲載されてあったコードを実行してみたのですが、ウィンドウが起動しても、真っ白の状態でタイピングの問題が出題されません。  
グローバル変数のTCHAR szMondai[32], szInput[32],
szCheck[32];あたりが怪しいと思うのですが、アドバイスよろしくお願いいたします。

[code]

    #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;
    }
    
[/code]


CC BY-SA 4.0
2019-02-04T15:39:07.150
52544
2019-02-04T17:57:53.167
2019-02-04T17:53:25.580
3605
32026
question
c visual-studio windows-10 winapi visual-c++
Win32APIでキー入力を用いた簡易タイピングソフトを作成したのですが、うまく実行されません


ウィンドウプロシージャの中の`case
WM_CHAR:`のところを見ると、スペースキーを押して初めて問題が表示されるようになっています。試しにウィンドウが開いたら、スペースキーを押してみてください。


CC BY-SA 4.0
2019-02-04T17:57:53.167
52545
2019-02-04T17:57:53.167
3605
52544
answer