Win32APIにて、簡易タイピングソフトを作成したのですが、うまく実行されません。
いつもお世話になっております。
小生、只今、WinXPSP3上でC言語とWin32APIを使用し、BCC5.5.1でコンパイルしながらWindowsプログラミングを勉強しています。
今回、質問させて頂きたいのは、「猫でもわかるWindowsプログラミング第2版」の第5章簡易タイピングソフトを作るの回で、掲載されてあったコードを自分なりに改造して、実行してみたのですが、ウィンドウが起動しても、真っ白の状態でタイピングの問題が出題されないようになってしまいました。
以下にコードを掲載致します。
※文字数制限にひっかかったので、改造した部分だけを掲載させて頂きます。
#include <windows.h>
#include <time.h>
#pragma comment(lib, "winmm.lib")
LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);
ATOM InitApp(HINSTANCE, LPCSTR);
BOOL InitInstance(HINSTANCE, int, LPCSTR);
DWORD TypeStart(HWND, char*);
//ウィンドウの生成
BOOL InitInstance(HINSTANCE hInst, int nCmdShow, LPCSTR szClassName)
{
HWND hWnd;
hWnd = CreateWindow(
szClassName,
"EasyTyping",
WS_OVERLAPPEDWINDOW,
CW_USEDEFAULT,
CW_USEDEFAULT,
200,
200,
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;
MMTIME mm;
char szMondai[32] = {0};
char szInput[32] = {0};
char szCheck[32] = {0};
DWORD dwStart, dwEnd;
BOOL bStart = FALSE, bSeikai = TRUE;
switch(msg){
case WM_CREATE:
srand((unsigned)time(NULL));
break;
case WM_PAINT:
hdc = BeginPaint(hWnd, &ps);
TextOut(hdc, 0, 0, szMondai, (int)strlen(szMondai));
TextOut(hdc, 0, 40, szInput, (int)strlen(szInput));
if(bSeikai == TRUE){
SetTextColor(hdc, RGB(0, 0, 0));
}
else{
SetTextColor(hdc, RGB(255, 0, 0));
}
TextOut(hdc, 0, 80, szCheck, (int)strlen(szCheck));
EndPaint(hWnd, &ps);
break;
case WM_CHAR:
if(wp == VK_SPACE && !bStart){
bStart = TRUE;
dwStart = TypeStart(hWnd, szMondai);
break;
}
if(bStart == FALSE){
return DefWindowProc(hWnd, msg, wp, lp);
}
if(wp == VK_ESCAPE){
strcpy(szMondai, "");
strcpy(szInput, "");
strcpy(szCheck, "");
InvalidateRect(hWnd, NULL, TRUE);
bStart = FALSE;
break;
}
wsprintf(szInput, "あなたの入力 = \"%c\"", (int)wp);
if(szMondai[6] == szInput[14]){
bSeikai = TRUE;
mm.wType = TIME_MS;
timeGetSystemTime(&mm, sizeof(MMTIME));
dwEnd = mm.u.ms;
wsprintf(szCheck, "反応時間[%dミリ秒]", dwEnd - dwStart);
dwStart = TypeStart(hWnd, szMondai);
}
else{
bSeikai = FALSE;
MessageBeep(MB_OK);
strcpy(szCheck, "タイプミス!");
}
InvalidateRect(hWnd, NULL, TRUE);
break;
case WM_DESTROY:
PostQuitMessage(0);
break;
default:
return DefWindowProc(hWnd, msg, wp, lp);
}
return 0;
}
DWORD TypeStart(HWND hWnd, char *p_szMondai)
{
int n;
MMTIME mm;
n = rand() % 26;
wsprintf(p_szMondai, "問題 = \"%c\"", 'a' + n);
mm.wType = TIME_MS;
timeGetSystemTime(&mm, sizeof(MMTIME));
InvalidateRect(hWnd, NULL, TRUE);
return mm.u.ms;
}
#endif
以上です。
掲載されているコードは余りにもグローバル変数が多く、
自分自身余り、グローバル変数は好きではないので、関数内で収まるようにと改造したのですが。。。
お忙しい中、申し訳ございませんが、先輩方、アドバイス宜しくお願い致します。
お礼
お返事ありがとうございます。 例をだしていただき、とてもわかりやすかったです。 勉強頑張ります。共に頑張りましょう!