- 易迪拓培训,专注于微波、射频、天线设计工程师的培养
LabWindows/CVI虚拟仪器: 打字练习
4.4 打字练习
4.4.1 打字练习设计方法
一般的打字练习软件包含几大功能:中文打字练习、数字打字练习、英文打字练习、中文打字测速、英文打字测速等。如金山公司推出的金山打字通软件,是一款功能齐全、数据丰富、界面友好的、集打字练习和测试于一体的打字软件。打字练习可以循序渐进突破盲打障碍,短时间运指如飞,完全摆脱枯燥学习。
利用LabWindows/CVI 开发一款打字练习游戏,设计两个字母从屏幕上方自由下落,当按键与字母相同时该字母消失并重新生成新的下落字母,每成功击键一次,得分就加一分,通过速度调节可适当加速或降低下落速度,时间设置为60s, 当一次游戏结束时,给出一分钟内打字速度说明。读者通过游戏的编程可体会键盘类游戏设计方法,同时也能提高打字速度。游戏字母范围设置为a~z,亦可设置其他字符如0~9 和A~Z,满足实际键盘练习要求。
打字窗口背景用LED 控件,并配以底色,下落字符采用Text Message 控件,设置背景透明,与窗口背景能很好融合。下落字符通过伪随机数产生,下落的Left 属性是通过随机数确定的。
对于键盘类游戏设计,通常都会在回调函数响应EVENT_KEYPRESS 事件,也只有利用该事件才能获得击键字符。一般来说,用户按键事件,支持面板和绝大多数控件。当面板或控件处于激活状态时,通过回调函数接收键盘事件。在面板或控件回调函数中,eventData1 表示按键ASCII 码,eventData2 为指向存储ASCII 码值的指针。LabWindows/CVI 约定,modifier (修饰)键为Shift 和Alt 键,menu modifier 键为Ctrl 键。
大部分虚拟键在winuser.h 头文件中定义,并以VK_开头。LabWindows/CVI 对其进行了重新定义,如表4-7 所示。
表4-7 虚拟键表
常量名 |
常量值 |
说明 |
VAL_FWD_DELETE_VKEY |
0x0100 |
Del 键 |
VAL_BACKSPACE_VKEY |
0x0200 |
退格键 |
VAL_ESC_VKEY |
0x0300 |
ESC 键 |
VAL_TAB_VKEY |
0x0400 |
Tab 键 |
VAL_ENTER_VKEY |
0x0500 |
回车键 |
VAL_UP_ARROW_VKEY |
0x0600 |
↑键 |
VAL_DOWN_ARROW_VKEY |
0x0700 |
↓键 |
VAL_LEFT_ARROW_VKEY |
0x0800 |
←键 |
VAL_RIGHT_ARROW_VKEY |
0x0900 |
→键 |
VAL_INSERT_VKEY |
0x0A00 |
Insert 键 |
VAL_HOME_VKEY |
0x0B00 |
Home 键 |
VAL_END_VKEY |
0x0C00 |
End 键 |
VAL_PAGE_UP_VKEY |
0x0D00 |
Page Up 键 |
VAL_PAGE_DOWN_VKEY |
0x0E00 |
Page Down 键 |
VAL_F1_VKEY |
0x0F00 |
F1 键 |
VAL_F2_VKEY |
0x1000 |
F2 键 |
VAL_F3_VKEY |
0x1100 |
F3 键 |
VAL_F4_VKEY |
0x1200 |
F4 键 |
VAL_F5_VKEY |
0x1300 |
F5 键 |
VAL_F6_VKEY |
0x1400 |
F6 键 |
VAL_F7_VKEY |
0x1500 |
F7 键 |
VAL_F8_VKEY |
0x1600 |
F8 键 |
VAL_F9_VKEY |
0x1700 |
F9 键 |
VAL_F10_VKEY |
0x1800 |
F10 键 |
VAL_F11_VKEY |
0x1900 |
F11 键 |
VAL_F12_VKEY |
0x1A00 |
F12 键 |
通常情况下,ASCII 码不能与虚拟键同时使用,但可与modifier 键组合使用。如:VAL_MENUKEY_MODIFIER | 'A'表示同时按下Ctrl + A 键。LabWindows/CVI 约定,键值可用4 字节整型量表示为0x00MMVVAA ,其中,MM 为modifier 键,VV 为虚拟键,AA 为ASCII 码键。
4.4.2 打字练习程序设计
(1)面板设计
编写一个打字练习程序,在面板中点击开始按钮进行一分钟计时,在此时间内测试打字的速度,测试结束时显示结果并提示是否继续练习。点击暂停按钮,暂停计时。程序运行时可根据实际情况对字母下落速度进行适当调整。屏幕最多可出现两个字母同时下落。两个定时器分别用于产生字符下落效果和速度测试计时。选中下落字符Text Message 控件,通过菜单Arrange→Control ZPanel Order→Move to Front 使其置于背景控件之上。面板设计如图4-11 所示,面板中主要控件属性设置如表4-8 所示。
图4-11 打字练习面板
表4-8 控件属性设置表
常量名 |
控件类型 |
控件的主要属性 |
PANEL |
Panel |
标题:打字练习回调函数:PanelCB |
TEXTMSG |
Text Message |
默认值:a |
TEXTMSG_1 |
Text Message |
默认值:a |
TIMER |
Timer |
标题:timer1 回调函数:timer1 Interval:1.000 |
TIMER_2 |
Timer |
标题:timer2 回调函数:timer2 Interval:1.000 |
NUMERIC_SCORE |
Numeric |
标题:得分 |
NUMERIC_SPEED |
Numeric |
标题:速度默认值:10 |
NUMERICTHERM_TIME |
Numeric Thermometer |
标题:时间 |
BACKGROUND |
LED |
( 背景) |
CMD_START |
Command Button |
标题:开始回调函数:start |
CMD_PAUSE |
Command Button |
标题:暂停回调函数:pause |
(2)程序源代码
//头文件声明
#include
#include "toolbox.h"
#include
#include
#include "打字练习.h"
static int panelHandle;
//声明得分为全局静态变量
static int score;
//声明自定义初始化函数
int InitChar (int choice);
//主函数
int main (int argc, char *argv[])
{
if (InitCVIRTE (0, argv, 0) == 0)
return –1;
if ((panelHandle = LoadPanel (0, " 打字练习.uir", PANEL)) < 0)
return –1;
//初始化要显示的下落字符
InitChar (0);
InitChar (1);
//设置下落字符背景透明
SetCtrlAttribute (panelHandle, PANEL_TEXTMSG, ATTR_TEXT_BGCOLOR, VAL_TRANSPARENT);
SetCtrlAttribute (panelHandle, PANEL_TEXTMSG_1, ATTR_TEXT_BGCOLOR, VAL_TRANSPARENT);
DisplayPanel (panelHandle);
RunUserInterface ();
DiscardPanel (panelHandle);
return 0;
}
//面板回调函数
int CVICALLBACK PanleCB (int panel, int event, void *callbackData,
int eventData1, int eventData2)
{
char str[2];
switch (event)
{
//响应键盘事件
case EVENT_KEYPRESS:
str[0] = '