无法输入字符
LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
int wmId, wmEvent;
PAINTSTRUCT ps;
HDC hdc;
static HFONT hFont;//逻辑字体
static HWND hBtn;
static HWND hStatic;
static HWND Start;
static HWND Stop;
static HWND Continue;
static HWND Restart;
//一组单选按钮
static HWND hGroupSex; //静态文本框--性别
static HWND hRadio1; //单选按钮--简单
static HWND hRadio2; //单选按钮--中等
static HWND hRadio3; //单选按钮--困难
static HWND hRadio4; //单选按钮--炼狱
switch (message)
{
case WM_TIMER: //增加定时器消息处理
switch (wParam)
{
case 1: //接受定时器1消息,字母下落
y = y + velocity + 1; //根据当前分数计算下落速度
if (y > bottom - 40) //判断是否落地
{
gameover = 1; //游戏结束
KillTimer(hWnd,1); //关掉字母下落定时器1
SetTimer(hWnd, 2, 300, NULL); //建立显示“游戏结束!”的定时器2
}
InvalidateRect(hWnd, 0, 0); //刷新画面
break;
case 2: //接到定时器2消息,显示“游戏结束!”动画效果
InvalidateRect(hWnd, 0, 0); //刷新画面
break;
case 3: //接受定时器3消息,游戏开始计时
if (gameover == 1) //判断游戏是否结束,若结束,暂停计时
KillTimer(hWnd, 3); //关闭计时定时器3
s++; //时间更新
if (s == 60) //时间换算
{
s = 0;
m++;
}
if (m == 60)
{
m = 0;
h++;
}
}
break;
case WM_CHAR: //增加键盘输入消息处理
{
c2 = (wParam >= 'a' && wParam <= 'z') ? wParam + 'A' - 'a' : wParam; //按键
HDC hdc = GetDC(hWnd);
Fire(hdc, left + 5 + (c2 - 'A') * 9 + 4, top, bottom); //显示射击效果
ReleaseDC(hWnd, hdc);
if (c2 == c1) //判断是否击中
{
c1 = rand() % 26 + 'A'; //产生新下落字母
x = left + 5 + (c1 - 'A') * 9; //计算下落初始x坐标
y = top; //计算下落初始y坐标
iScoring = iScoring + 1; //分数+1
CS = CS + 1;
if(CS>=MaxShot)
MaxShot = CS;
}
else
{
CS = 0;
iFail = iFail + 1; //未击中,记录
}
}
break;
case WM_CREATE:
//创建逻辑字体
hFont = CreateFont(
-15/*高度*/, -7.5/*宽度*/, 0, 0, 400 /*一般这个值设为400*/,
FALSE/*不带斜体*/, FALSE/*不带下划线*/, FALSE/*不带删除线*/,
DEFAULT_CHARSET, //使用默认字符集
OUT_CHARACTER_PRECIS, CLIP_CHARACTER_PRECIS, //这行参数不用管
DEFAULT_QUALITY, //默认输出质量
FF_DONTCARE, //不指定字体族*/
TEXT("微软雅黑") //字体名
);
//创建按钮控件
Start = CreateWindow(
TEXT("button"), //按钮控件的类名
TEXT("开始"),
WS_CHILD | WS_VISIBLE | WS_BORDER | BS_FLAT/*扁平样式*/,
95 /*X坐标*/, 550 /*Y坐标*/, 50 /*宽度*/, 50/*高度*/,
hWnd, (HMENU)1 /*控件唯一标识符*/, hInst, NULL
);
Stop = CreateWindow(
TEXT("button"), //按钮控件的类名
TEXT("暂停"),
WS_CHILD | WS_VISIBLE | WS_BORDER | BS_FLAT/*扁平样式*/,
165 /*X坐标*/, 550 /*Y坐标*/, 50 /*宽度*/, 50/*高度*/,
hWnd, (HMENU)2 /*控件唯一标识符*/, hInst, NULL
);
Continue = CreateWindow(
TEXT("button"), //按钮控件的类名
TEXT("继续"),
WS_CHILD | WS_VISIBLE | WS_BORDER | BS_FLAT/*扁平样式*/,
235 /*X坐标*/, 550 /*Y坐标*/, 50 /*宽度*/, 50/*高度*/,
hWnd, (HMENU)3 /*控件唯一标识符*/, hInst, NULL
);
Restart = CreateWindow(
TEXT("button"), //按钮控件的类名
TEXT("重置"),
WS_CHILD | WS_VISIBLE | WS_BORDER | BS_FLAT/*扁平样式*/,
305 /*X坐标*/, 550 /*Y坐标*/, 50 /*宽度*/, 50/*高度*/,
hWnd, (HMENU)4 /*控件唯一标识符*/, hInst, NULL
);
SendMessage(Start, WM_SETFONT, (WPARAM)hFont, NULL);//设置按钮字体
SendMessage(Stop, WM_SETFONT, (WPARAM)hFont, NULL);//设置按钮字体
SendMessage(Continue, WM_SETFONT, (WPARAM)hFont, NULL);//设置按钮字体
SendMessage(Restart, WM_SETFONT, (WPARAM)hFont, NULL);//设置按钮字体
//创建分组框控件
hGroupSex = CreateWindow(
TEXT("button"), TEXT("难度选择"),
WS_CHILD | WS_VISIBLE | BS_GROUPBOX,
90, 450, 300, 70,
hWnd, (HMENU)5, hInst, NULL
);
//接下来添加单选按钮
hRadio1 = CreateWindow(
TEXT("button"), TEXT("简单"),
WS_CHILD | WS_VISIBLE | BS_LEFT | BS_AUTORADIOBUTTON,//单选按钮
15, 30, 50, 26,
hGroupSex, (HMENU)6, hInst, NULL//父窗口为 GroupBox 控件
);
hRadio2 = CreateWindow(
TEXT("button"), TEXT("中等"),
WS_CHILD | WS_VISIBLE | BS_LEFT | BS_AUTORADIOBUTTON,
80, 30, 50, 26,
hGroupSex, (HMENU)7, hInst, NULL
);
hRadio3 = CreateWindow(
TEXT("button"), TEXT("困难"),
WS_CHILD | WS_VISIBLE | BS_LEFT | BS_AUTORADIOBUTTON,
145, 30, 50, 26,
hGroupSex, (HMENU)8, hInst, NULL
);
hRadio4 = CreateWindow(
TEXT("button"), TEXT("炼狱"),
WS_CHILD | WS_VISIBLE | BS_LEFT | BS_AUTORADIOBUTTON,
210, 30, 50, 26,
hGroupSex, (HMENU)9, hInst, NULL
);
SendMessage(hGroupSex, WM_SETFONT, (WPARAM)hFont, NULL);
SendMessage(hRadio1, WM_SETFONT, (WPARAM)hFont, NULL);
SendMessage(hRadio2, WM_SETFONT, (WPARAM)hFont, NULL);
SendMessage(hRadio3, WM_SETFONT, (WPARAM)hFont, NULL);
SendMessage(hRadio4, WM_SETFONT, (WPARAM)hFont, NULL);
break;
case WM_COMMAND: //处理键盘输入结束
{
int wmId = LOWORD(wParam);
int wmEvent = HIWORD(wParam);
// 分析菜单选择:
switch (wmId) {
case 1: //按下按钮
//更改文本框的内容
if (gameover == 1)
{
KillTimer(hWnd, 2);
KillTimer(hWnd, 3);
}
gameover = 0;
iScoring = 0;
iFail = 0;
h = 00;
m = 00;
s = 00;
c1 = rand() % 26 + 'A';
x = left + 5 + (c1 - 'A') * 9;
y = top;
CS = 0;
MaxShot = 0;
SetTimer(hWnd, 1, 10, NULL); //启动字母下落定时器
SetTimer(hWnd, 3, 1000, NULL); //启动计时定时器
break;
case 2:
KillTimer(hWnd, 1);
KillTimer(hWnd, 3);
break;
case 3:
SetTimer(hWnd, 1, 10, NULL); //启动字母下落定时器
SetTimer(hWnd, 3, 1000, NULL); //启动计时定时器
break;
case 4:
break;
case 5:break;
case 6:
velocity = iScoring / 10;
break;
case 7:
break;
case 8:
break;
case 9:
break;
case ID_START: //开始ID
if (gameover == 1)
{
KillTimer(hWnd, 2);
KillTimer(hWnd, 3);
}
gameover = 0;
iScoring = 0;
iFail = 0;
h = 00;
m = 00;
s = 00;
c1 = rand() % 26 + 'A';
x = left + 5 + (c1 - 'A') * 9;
y = top;
CS = 0;
MaxShot = 0;
SetTimer(hWnd, 1, 10, NULL); //启动字母下落定时器
SetTimer(hWnd, 3, 1000, NULL); //启动计时定时器
break;
case ID_STOP: //暂停ID
KillTimer(hWnd, 1);
KillTimer(hWnd, 3);
break;
case ID_CONTINUE:
SetTimer(hWnd, 1, 10, NULL); //启动字母下落定时器
SetTimer(hWnd, 3, 1000, NULL); //启动计时定时器
break;
case IDM_ABOUT:
DialogBox(hInst, MAKEINTRESOURCE(IDD_ABOUTBOX), hWnd, About);
break;
case IDM_HELP:
DialogBox(hInst, MAKEINTRESOURCE(IDD_HELP), hWnd, About);
break;
case IDM_EXIT:
DestroyWindow(hWnd);
break;
default:
return DefWindowProc(hWnd, message, wParam, lParam);
}
}
break;
case WM_PAINT:
{
PAINTSTRUCT ps;
HDC hdc = BeginPaint(hWnd, &ps);
// TODO: 在此处添加使用 hdc 的任何绘图代码...
DrawBk(hdc, left, top, right, bottom); //显示背景
ShowScoring(hdc, right + 20, top + 50, iScoring, iFail, h, m, s);//显示分数
if (gameover) //判断游戏是否结束
GameOver(hdc, left + 80, top + 130); //显示游戏结束
else //显示游戏画面
{
char szTemp[8];
sprintf_s(szTemp, "%c", c1); //将下落字母转为字符串
TextOutA(hdc, x, y, szTemp, strlen(szTemp)); //显示下落字母
}
EndPaint(hWnd, &ps);
}
break;
case WM_DESTROY:
PostQuitMessage(0);
break;
default:
return DefWindowProc(hWnd, message, wParam, lParam);
}
return 0;
}
无报错
暂未想到
能够输入字符