当前位置:文档之家› 指法练习软件报告

指法练习软件报告

学 院 名 称: 计算机科学与工程学院 专 业: 计算机科学与技术 班 级: 09计2Z 学 号: 09141229、09141232 姓 名: 姚慕容、朱义霞 2010年 6月 10日

W I N D O W S 程序设计报告

JIANGSU TEACHERS UNIVERCITY OF TECHNOLOGY

指法练习软件

摘要:科技的飞速发展,将人类带入了信息时代,计算机越来越贴近人的生活,速度成为人们成功的前提条件,以致于人们必须不断尝试着使用各种手段来提高自身的工作效率,其手段之一就是对键盘的充分利用和相应软件的开发。

至今为止,人们对计算机键盘的熟悉在很大程度上还必须依靠一些指法练习软件,软件质量的高低直接影响到对熟悉键盘过程的长短。由北京元易达科技发展责任有限公司指法练习设计开发小组自主开发的指法练习软件,完全使用汉语程序设计语言进行开发,结构紧凑,高度安全,资源占用少,速度快,能帮助使用者更加方便,快捷的熟悉对键盘的操作,从而节省操作时间,达到提高工作效率的目的。

关键词:信息时代,键盘,程序设计

Fingering practice software Abstract: The rapid development of science and technology, human beings into the information age, The computer is more and more close to the human life, speed, become people the premise condition of success, that people must constantly try to use all sorts of means to improve their own work efficiency, is one of the means to make full use of the keyboard and the corresponding software development.

So far, people familiar with the keyboard on the computer to a great extent must also rely on some fingering practice software, software quality directly influence on the familiar with the keyboard, length of the process. By Beijing yuan eseetech science and technology development limited company fingering practice design development team independent development of fingering practice software, a completely use Chinese programming language development, compact structure, high safety, less resources occupation, speed, can help users more convenient and quick familiar with the operation of the keyboard, which can save time, improve operation efficiency purpose.

Keywords:information age, keyboard, programming language

目录

序言 (4)

第1章概述 (4)

1.1系统开发背景和意义 (4)

1.2设计流程 (4)

1.3开发工具介绍 (4)

1.3.1 Visual c++软件 (4)

1.3.2 MFC应用程序 (5)

1.3.3 对话框 (5)

第2章需求分析 (6)

2.1 设计思路 (6)

2.2 技术要点 (6)

2.2.1 CStatic类的Create方法 (6)

2.2.2 srand 函数 (6)

2.2.3 rand函数 (6)

2.2.4、 ShowWindow函数 (7)

第3章系统设计 (8)

3.1 设计步骤 (8)

3.2 主要程序代码 (8)

3.2.1 在主窗体的头文件中声明变量 (8)

3.2.2 添加自定义函数Initialization (8)

3.2.3 初始化控件显示数据 (9)

3.2.4 添加WM_CTLCOLOR消息的处理函数 (9)

3.2.5 添加自定义函数RandLetter (10)

3.2.6 添加自定义函数SetBitmap (10)

3.2.7 处理“开始”按钮的单击事件 (10)

3.2.8 处理主窗体的定时器事件 (11)

3.2.9重载PreTranslateMessage虚函数 (12)

3.2.10处理“取消”按钮的单击事件 (13)

3.3、调试程序 (14)

3.3.1 调试中的错误与解决方式 (14)

3.3.2 测试结果 (14)

结束语 (16)

参考文献 (17)

致谢 (18)

序言

用户在日常的工作中,对计算机的使用越来越多,如果用户打字速度加快的话,工作效率也会相应的提高,在这竞争激烈的社会,较快的打字速度已经成为工作的基础,为了提高个人的打字速度,一款好的指法软件必不可少。本程序通过Visual c++来实现一款指法练习的开发。运行本程序,设置练习时间和字符下落间隔,单击“开始”按钮,进行指法练习,在练习时可以在窗体的右侧看到练习的各项数据。

第1章概述

1.1系统开发背景和意义

随着科学技术的不断提高,计算机科学日渐成熟,计算机已经深入到工作和生活的角落,文字录入是学习计算机非常重要的一部分。在手写录入技术和语音识别技术还不完善的同时大部分还在使用键盘作为文字录入的工具。计算机是人类社会20世纪的重大科技成果之五。自1946年世界第一台电子数字计算机诞生至今,在短短50多年的时间里,计算机技术得到了飞速发展。目前计算机已广泛应用在工业,农业,科技,国防,文教,卫生,家庭生活等各个领域中,已成为现代人类生活不可缺少的智能工具。本程序构建学生练习指法系统,帮助熟悉键盘各个布局。

完成指法软件开发,培养学生的程序设计和开发能力。

1.2设计流程

1. 查阅文献,确定设计内容。通过查阅网页设计与制作,和图书馆的书籍资源,确定设计内容。

2. 搜集图片。通过上网查找所需要的图片,利用应用程序导入位图。完成前期的准备。

3. 设计主界面。添加各类控件及文本框。

4. 添加所实现程序的代码。

5. 测试结果

1.3开发工具介绍

本程序主要采用了Visual c++软件,利用集成化开发环境窗口和对话框,新建一个基于对话框的应用程序,进行各个阶段的设计,导入位图,添加各类函数,完成一个基本的练习软件。

1.3.1 Visual c++软件

随着计算机技术的普及和发展,计算机的应用已经渗透到国民经济与人们生活的各个方面,Visual c++是20世纪90年代中期由美国微软公司推出的一个强大的Windows应用程序开发平台,是“真正的程序员”首选的开发工具之一。在Visual c++环境下,利用微软的基础类库MFC开发出功能强大的Windows应用程序。

1.3.2 MFC应用程序

MFC是由微软公司编写的一套专门用于Windows编程的基础类库,它的类可以处理许多标准Windows编程任务。借助App Wizard可以创建非常灵活的应用程序框架,使开发者摆脱那些每次都必写的基本代码。与其他所有的Windows应用程序一样,在使用MFC的应用程序中也要处理Windows消息,但是在MFC中消息处理更容易,封装得更好,更易于维护。

1.3.3 对话框

对话框是Windows应用程序中的一种常用的资源。它其实是一个“窗口”,是Windows 程序与用户交互的一个手段,它的主要功能是输出信息和接收用户的输入。它可以只是一个简单的OK消息框,也可以是一个复杂的数据输入表单。在对话框内一般都有一些控件,对话框依靠这些控件与用户进行交互。

第2章需求分析

2.1 设计思路

在设计指法练习软件时,先在对话框上绘制软件的背景位图,然后动态创建10个静态控件,在调用rand函数取出1~26的随机数,根据随机获得的数据判断每个控件显示的字母图片,在定时器中设置控件向下移动,当控件到达下落区域的底部或者用户按下了正在下落的字母时,重新取随机数,再设置一个定时器,在该定时器中根据用户的操作计算正确率、错误数、漏打数等消息,当到达用户设置练习时间后自动停止控件的下落,这样指法练习软件就完成了。

2.2 技术要点

本程序实现字母下落功能时,主要用CStatic类的Create方法、srand 函数、rand函数ShowWindow函数,下面对本程序中用到的关键技术进行详细讲解。

2.2.1 CStatic类的Create方法

Create方法用于创建静态控件,该函数的语法格式如下:

BOOL Create(LPCTSTR lpszText,DWORD dwStyle,const RECT&rect,CWnd*pParentWnd,UINT nID= =0xffff);

参数说明如下:

●sxText: 用于设置控件文本。

●dwStyle: 用于设置控件风格。

●rect: 用于确定控件的显示区域。

●pParentWnd: 用于确定控件父窗口指针。

●nID: 用于设置控件ID。

本程序中用于创建静态控件的代码如下:

For(int i=0;i<10;i++)

{

m_Static[i].Create(“”,WS_CHILD|WS_CLIPSIBLINGS|WS_EX_TOOLWINDOW|SS_BITMAP,CRect(0,0,50,50),this,1230+i);

}

2.2.2 srand 函数

srand 函数用于为rand函数设置一个种子,其语法格式如下:

V oid srand(unsigned int seed);

参数说明如下:

●Seed:设置的种子。

2.2.3 rand函数

rand函数用于获取随机数,其语法格式如下:

Int rand(void);

本程序中用于获得随机数的代码如下:

CTime time=CTime::GetCurrentTime(); //获得系统时间

Srand(time.GetHour()+Time.GetMinute()+time.GetSecond()); //根据时间设置种子For(int i=0;i<10;i++)

{

m_Num[i]=rand()%26+1;} //获得1~26之间的随机数

}

2.2.4、 ShowWindow函数

ShowWindow函数用于设置窗口的显示状态,其语法格式如下:

BOOLShowWindow(int nCmdShow);

参数说明如下:

nCmdShow:表示窗口的显示状态,可选值如表1所示。

第3章系统设计

3.1 设计步骤

(1)、新建一个基于对话框的应用程序,将其窗体标题改为“指法练习软件”,勾选Minmize box 属性,使对话框具有最小化按钮。

(2)、向对话框中添加4个静态文本控件、8个编辑框控件和3个按钮控件。对话框主要用到的控件及说明如表2所示,根据需要对其属性进行修改,并建立类向导,在相应

(3)、向工程中导入30个BMP位图资源

(4)在类的原文件中添加实现功能所需要的各种函数,并添加相应的代码,同时在头文件中添加对各种函数及变量的声明。

(5)调试程序,纠正发生的错误,直到这个程序能够运行为止。

3.2 主要程序代码

3.2.1 在主窗体的头文件中声明变量

代码如下:

UIN m_Num[10]; //显示字母

CStatic m_Static[10]; //静态控件

int m_Error; //错误数

int m_Sum; //打字数

int m_Lose; //漏打数

int m_Time; //用时

BOOL m_IsStart; //开始

int m_iTime; //定时

int m_aTime; //间隔时间

3.2.2 添加自定义函数Initialization

该函数用于初始化控件显示数据,代码如下:

void CFingerExerciseDlg::Initialization()

{

m_IsStart = FALSE;

m_uTime.SetWindowText("时间:0分0秒");

m_sNum.SetWindowText("打字数:0个");

m_eNum.SetWindowText("错误数:0个");

m_lNum.SetWindowText("漏打数:0个");

m_Veracity.SetWindowText("正确率:0.0%");

m_Rate.SetWindowText("速度:0个/分");

m_Timing.SetWindowText("3");

m_Alternation.SetWindowText("500");

}

3.2.3 初始化控件显示数据

在主窗体初始化,创建静态控件,并设置按钮的显示图片,代码如下:Initialization();

for(int i=0;i<10;i++)

{

m_Static[i].Create("",WS_CHILD|WS_CLIPSIBLINGS|

WS_EX_TOOLWINDOW|SS_BITMAP,CRect(0,0,50,50),this,1230+i);

}

m_Start.SetBitmap(LoadBitmap(AfxGetInstanceHandle(),MAKEINTRESOURCE(IDB_START))); //设置位图

m_Cancel.SetBitmap(LoadBitmap(AfxGetInstanceHandle(),MAKEINTRESOURCE(IDB_CANCEL))); //设置位图

m_Exit.SetBitmap(LoadBitmap(AfxGetInstanceHandle(),MAKEINTRESOURCE(IDB_EXIT))); //设置位图

3.2.4 添加WM_CTLCOLOR消息的处理函数

在该函数中调用绘制窗体的背景位图,实现代码如下:

HBRUSH CFingerExerciseDlg::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor)

{

HBRUSH hbr = CDialog::OnCtlColor(pDC, pWnd, nCtlColor);

CBitmap m_BK; //声明位图对象

m_BK.LoadBitmap(IDB_BITMAPBK); //加载位图资源

if (nCtlColor == CTLCOLOR_DLG) //如果是对话框

{

CBrush m_Brush(&m_BK); //定义一个位图画刷

CRect rect;

GetClientRect(rect); //获得窗体客户区域

pDC->SelectObject(&m_Brush); //选中画刷

pDC->FillRect(rect,&m_Brush); //填充客户区域

return m_Brush; //返回画刷

}

else

hbr = CDialog::OnCtlColor(pDC, pWnd, nCtlColor);

if(nCtlColor == CTLCOLOR_STA TIC) //如果是静态文本控件

{

pDC->SetBkMode(TRANSPARENT); //设置控件背景透明

}

return hbr;

}

3.2.5 添加自定义函数RandLetter

该函数用于设置随机数,其实现代码如下:

void CFingerExerciseDlg::RandLetter()

{

CTime time = CTime::GetCurrentTime(); //获得系统时间

srand(time.GetHour()+time.GetMinute()+time.GetSecond()); //根据时间设置种子

for(int i=0;i<10;i++)

{

m_Num[i] = rand()%26+1; //获得1~26之间的随机数

}

}

3.2.6 添加自定义函数SetBitmap

该函数用于设置静态控件的显示图片,其实现代码如下:

void CFingerExerciseDlg::SetBitmap(int num)

{

HBITMAP m_hBitmap;

//加载位图资源

m_hBitmap=LoadBitmap(AfxGetInstanceHandle(),MAKEINTRESOURCE(IDB_BITMAPA+m_Num[ num]-1));

m_Static[num].SetBitmap(m_hBitmap); //设置显示图片

m_Static[num].MoveWindow(45+58*num,21,24,24); //移动控件

m_Static[num].ShowWindow(SW_SHOW); //显示控件

}

3.2.7 处理“开始”按钮的单击事件

在该事件的处理函数中清空控件中的数据,并设置定时器,开始练习,其实现代码如下:

void CFingerExerciseDlg::OnButstart()

{

m_Error = 0; //错误数为0

m_Sum = 0; //打字数为0

m_Lose = 0; //漏打数为0

m_Time = 0; //用时为0

CString time;

m_Timing.GetWindowText(time); //获得练习时间

m_iTime = atoi(time)*60; //计算练习时间

m_Alternation.GetWindowText(time); //获得下降间隔

m_aTime = atoi(time); //转换下降间隔

RandLetter(); //设置随机数

for(int i=0;i<10;i++)

{

SetBitmap(i); //设置控件显示图片

}

m_IsStart = TRUE; //开始练习

SetTimer(1,m_aTime,NULL); //设置下降间隔定时器

SetTimer(2,1000,NULL); //设置练习时间定时器

}

3.2.8 处理主窗体的定时器事件

在该事件的处理函数中设置控件的下落记录漏打数,并设置漏打控件的图片,在练习时间定时器中,判断是否结束练习,如果结束练习则显示用户练习成绩单,并将信息保存到INT文件中,其实现代码如下:

void CFingerExerciseDlg::OnTimer(UINT nIDEvent)

{

if(nIDEvent == 1)

{

for(int i=0;i<10;i++)

{

CRect rect;

m_Static[i].GetClientRect(rect);

m_Static[i].MapWindowPoints(this,rect);

if(rect.bottom == 495)

{

m_Lose++;

srand(m_Num[i]*i+m_Num[i]+i);

m_Num[i] = rand()%26+1;

SetBitmap(i);

rect.top = 21;

rect.bottom = 45;

}

else

{

rect.top += 30;

rect.bottom += 30;

}

m_Static[i].MoveWindow(rect);

}

}

else if(nIDEvent == 2)

{

if(m_Time == m_iTime)

{

m_IsStart = FALSE;

KillTimer(1);

KillTimer(2);

CString str;

str.Format("╔═════════════════╗\r\n║时间:%02d分%02d秒║打字数:%03d个║\r\n║错误数:%03d个║漏打数:%03d个║\r\n║正确率:%0.0f%% ║速度:%03d个/分║\r\n╚═════════════════╝"

m_Time/60,m_Time%60,m_Sum,m_Error,m_Lose,(m_Sum-m_Error)*1.0/m_Sum*100,m_Sum*60/m_ Time);

MessageBox(str);

for(int i=0;i<10;i++)

m_Static[i].ShowWindow(SW_HIDE);

}

else

{

m_Time++;

CString str;

str.Format("时间:%d分%d秒",m_Time/60,m_Time%60);

m_uTime.SetWindowText(str);

str.Format("打字数:%d个",m_Sum);

m_sNum.SetWindowText(str);

str.Format("错误数:%d个",m_Error);

m_eNum.SetWindowText(str);

str.Format("漏打数:%d个",m_Lose);

m_lNum.SetWindowText(str);

str.Format("正确率:%0.0f%%",(m_Sum-m_Error)*1.0/m_Sum*100);

m_Veracity.SetWindowText(str);

str.Format("速度:%d个/分",m_Sum*60/m_Time);

m_Rate.SetWindowText(str);

}

}

CDialog::OnTimer(nIDEvent);

}

3.2.9重载PreTranslateMessage虚函数

在该函数中判断用户按下的键盘是否对应下落的字母,如果是,则重新设置控件的显示图片,如果不是,则记录一次错误,其实现代码如下:

BOOL CFingerExerciseDlg::PreTranslateMessage(MSG* pMsg)

{

if(m_IsStart)

{

if(pMsg->message == WM_KEYDOWN)

{

BOOL IsNum=FALSE;

for(int i=0;i<26;i++)

{

if(pMsg->wParam == 0x0041+i)

{

for(int j=0;j<10;j++)

{

if(m_Num[j] == i+1)

{

CRect rect;

m_Static[j].GetClientRect(rect);

m_Static[j].MapWindowPoints(this,rect);

srand(m_Num[j]*j*i+m_Num[j]+j+i);

m_Num[j] = rand()%26+1;

SetBitmap(j);

rect.top = 21;

rect.bottom = 45;

m_Static[j].MoveWindow(rect);

IsNum = TRUE;

}

}

}

}

if(!IsNum)

m_Error++;

m_Sum++;

}

}

return CDialog::PreTranslateMessage(pMsg);

}

3.2.10处理“取消”按钮的单击事件

在该事件的处理函数中关闭定时器并隐藏控件,其实现代码如下:void CFingerExerciseDlg::OnButcancel()

{

KillTimer(1);

KillTimer(2);

for(int i=0;i<10;i++)

m_Static[i].ShowWindow(SW_HIDE);

Initialization();

}

3.3、调试程序

3.3.1 调试中的错误与解决方式

由于各种各样的原因,在开发过程中,我遇到了许多技术上的问题,但是通过与指导老师的沟通,再加上自己的努力终于把问题一一解决了,

(1)、由于以前没有深入研究MFC的设计,所以它对于我有点陌生,特别是插入位图时,对菜单还不是很熟悉,所以使用起来有些困难。最终在书上找到了解决办法:插入——资源——Bitmap,然后导入自己一开始准备好的图片。

(2)、加入函数时,搞不清楚它属于自定义函数还是作为消息处理函数导入,要自己进行摸索。解决办法:自定义函数是直接往类加入就可以了,而消息处理函数却是要利用ClassWizard中寻找自己所需要的导入函数。

(3)、对类中进行添加函数时总是会出现字母多打或漏打,或字母大小写没有区分清楚等待。解决方法:在打入代码时要做到边打边检查是否打错,或者在程序运行时根据出错提示来纠正错误。

3.3.2 测试结果

1、开始界面

2、练习界面

结束语

通过此次课程设计,使我更加扎实的掌握了有关Visual c++方面的知识,在设计过程中虽然遇到了一些问题,但经过一次又一次的思考,一遍又一遍的检查终于找出了原因所在,也暴露出了前期我们在这方面的知识欠缺和经验不足。实践出真知,通过亲自动手编程,使我们掌握的知识不再是纸上谈兵。

过而能改,善莫大焉。在课程设计过程中,我们不断发现错误,不断改正,不断领悟,不断获取。最终的检测调试环节,本身就是在践行“过而能改,善莫大焉”的知行观。这次课程设计终于顺利完成了,在设计中遇到了很多问题,最后在老师的指导下,终于游逆而解。在今后社会的发展和学习实践过程中,一定要不懈努力,不能遇到问题就想到要退缩,一定要不厌其烦的发现问题所在,然后一一进行解决,只有这样,才能成功的做成想做的事,才能在今后的道路上劈荆斩棘,而不是知难而退,那样永远不可能收获成功,收获喜悦,也永远不可能得到社会及他人对你的认可!

课程设计诚然是一门专业课,给我很多专业知识以及专业技能上的提升,同时又是一门讲道课,一门辩思课,给了我许多道,给了我很多思,给了我莫大的空间。同时,设计让我感触很深。使我对抽象的理论有了具体的认识。

我认为,在这学期的实验中,不仅培养了独立思考、动手操作的能力,在各种其它能力上也都有了提高。更重要的是,在实验课上,我们学会了很多学习的方法。而这是日后最实用的,真的是受益匪浅。要面对社会的挑战,只有不断的学习、实践,再学习、再实践。这对于我们的将来也有很大的帮助。以后,不管有多苦,我想我们都能变苦为乐,找寻有趣的事情,发现其中珍贵的事情。就像中国提倡的艰苦奋斗一样,我们都可以在实验结束之后变的更加成熟,会面对需要面对的事情。

回顾起此课程设计,至今我仍感慨颇多,从理论到实践,在这段日子里,可以说得是苦多于甜,但是可以学到很多很多的东西,同时不仅可以巩固了以前所学过的知识,而且学到了很多在书本上所没有学到过的知识。通过这次课程设计使我懂得了理论与实际相结合是很重要的,只有理论知识是远远不够的,只有把所学的理论知识与实践相结合起来,从理论中得出结论,才能真正为社会服务,从而提高自己的实际动手能力和独立思考的能力。在设计的过程中遇到问题,可以说得是困难重重,但可喜的是最终都得到了解决。实验过程中,也对团队精神的进行了考察,让我们在合作起来更加默契,在成功后一起体会喜悦的心情。果然是团结就是力量,只有互相之间默契融洽的配合才能换来最终完美的结果。

此次设计也让我明白了思路即出路,有什么不懂不明白的地方要及时请教或上网查询,只要认真钻研,动脑思考,动手实践,就没有弄不懂的知识,收获颇丰。

参考文献

[1] 丁展,Visual C++游戏开发技术与实例[M]. 北京:人民邮电出版社,2005年2月.

[2] 蒋爱军, Visual C++ MFC棋牌类游戏编程实例[M]. 北京:人民邮电出版社,2008年7月.

[3] 高守传, Visual C++6.0开发指南[M]. 北京:人民邮电出版社,2008年6月.

[4] Scott Douglas Meyers, Effective C++, Addison-Wesley,1992年6月.

[5] Robert Murry, C++ Strategies and Tactics, Addison-Wesley, 1993年2月.

[6] 谭浩强, C程序设计题解与上机指导[M]. 北京: 清华大学出版社,2005年7月.

[7] 钱能, C++程序设计教程[M]. 北京: 清华大学出版社,2007年8月.

[8] 巴拉古鲁萨米, 标准C程序设计[M]. 北京: 清华大学出版社,2006年5月.

[9] 约翰逊鲍尔, 面向对象程序设计:C++语言描述[M]. 机械工业出版社,2003年1月.

[10] 刘宇君等, C++程序设计例题解析与项目实践[M]. 北京: 清华大学出版社,2008年10月.

致谢

在我的指法练习软件这一程序实现预期成果的时候,我有一种前所未有的成就感,我想或许是因为我付出了太多的努力的缘故,此刻在我高兴之余,我更想向一直以来关心我,指导我的搭档说声谢谢,从选题的定位,到整个案例的分析设计,她都提出了许多宝贵建议。特别要感谢赵老师,并且为我提供了重要的visual c++软件。赵老师认真负责的工作态度使我受益匪浅,给予我很大的帮助。

另外,还要感谢两年来诸位老师给予的知识积累,感谢学校提供的各种设备与资源。非常感谢你们一直以来的无私奉献和全力的帮助,没有你们,我就不会有今天的成就和收获,是你们让我们的付出有了回报,有了价值。

相关主题
文本预览
相关文档 最新文档