windoes系统编程课程设计.docx
- 文档编号:23503553
- 上传时间:2023-05-17
- 格式:DOCX
- 页数:26
- 大小:193.57KB
windoes系统编程课程设计.docx
《windoes系统编程课程设计.docx》由会员分享,可在线阅读,更多相关《windoes系统编程课程设计.docx(26页珍藏版)》请在冰豆网上搜索。
windoes系统编程课程设计
中南民族大学计算机科学学院
Windows系统编程
课程设计报告
题目:
汽车客运公司售票系统
专业自动化
学生姓名张宁
班级学号08064008
指导老师程鹏
完成日期2010年12月22日
一、课题名称
Windows系统编程课程设计——汽车客运公司售票系统之售票系统登陆界面的设计
二、课题内容和要求
1、内容:
1.了解Windows编程的基础知识,掌握MFC应用程序的基本知识
2.加深对数据库的掌握和运用
3.掌握用VC++开发应用程序的的一般步骤和方法
4.进一步加强C++的编程能力和对程序结构的理解
5.基本掌握面向对象程序设计的基本思路和方法
2.要求:
1.了解Windows编程的基础知识,掌握MFC应用程序的基本知识;基本掌握面向对象程序设计的基本思路和方法;掌握用VC++开发应用程序的一般步骤和方法;系统以Windows标准菜单界面方式工作,运行界面友好,演示程序以用户和计算机的对话方式进行
2.程序的功能
建立一个基于对话框的MFC,要设置权限,即设置一个登陆的对话框。
进入系统以后能够展示出一个普通的汽车公司售票系统,能够实现售票等基本功能。
3.输入输出的要求
采用界面选择与编辑框两种输入方式,输出结果直接显示在售票对话框中。
输入的数据必须符合程序所规定的合法输入方式,对不合法的信息输入将提示无法处理。
4.综合应用
使用界面编程、网络、数据库、文件系统、线程和进程、异常处理等知识。
特别是数据库的应用,用来存储数据和提供数据。
对于网络主要进行网络通信,连接客户端和服务器端。
采取模块化方式进行程序设计,要求程序的功能设计、数据结构设计及整体结构设计合理
三、开发工具介绍
随着计算机的广泛应用,办公无纸化正在越来越普及,传统的手工信息管理已显然不能满足人们的需求,这就需要一种适应潮流的新的管理系统的出现,员工信息管理与考勤系统就是用VisualC++开发的Access数据库管理系统。
Access数据库是一个关系数据库,在VisualC++中,可以用SQL语句实现对它的操作。
本系统的建表是直接在Access中进行,而对表的操作则在VisualC++中通过编程进行。
VisualC++是一种编程开发非常灵活的工具。
有两种编程方法:
其一是WINDOWS API函数,另一种就是使用MFC。
VisualC++与数据库连接的一种方式是MFCODBC连接
VisualStudio2010是微软亚太研发集团服务器与开发工具事业部成立以来参与的最大开发项目。
超过100位工程师在为VisualStudio2010的多个重要模块设计中贡献了他们的智慧与心血。
在.NETFramework4.0中为WindowsForms架构设计运行时和设计时的新功能;对SharePoint、Silverlight、WPF、WCF、WF等多个平台提供更多工具支持;大大增强VisualStudio中的各种基本开发工具,例如C++编译和链接工具,并行开发工具中的调试器和性能探视器;为更好地支持团队开发,提供全新的UML建模工作组件、模型浏览器和建模工程等 。
Microsoft为单独工作或在小型团队中的专业开发人员提供了两种选择,VisualStudio2005ProfessionalEdition和用于MicrosoftOffice系统的VisualStudio2005工具。
每种版本都在标准版的特性上进行了扩展,包括用于远程服务程序开发和调试、SQLServer2005开发的工具,以及完整的、没有限制的开发环境。
每种产品都可以单独购买或打包定购。
专业开发人员喜欢自由的使用.NETFramework2.0,它是一种稳健的、功能齐备的开发环境,支持创建扩展VisualStudio集成开发环境的工具。
MFC借助C++的优势为Windows开发开辟了一片新天地,同时也借助ApplicationWizzard使开发者摆脱离了那些每次都必写基本代码,借助ClassWizard和消息映射使开发者摆脱了定义消息处理时那种混乱和冗长的代码段。
更令人兴奋的是利用C++的封装功能使开发者摆脱Windows中各种句柄的困扰,只需要面对C++中的对象,这样一来使开发更接近开发语言而远离系统.利用C++的封装性开发者可以更容易理解和操作各种窗口对象;利用C++的派生性开发者可以减少开发自定义窗口的时间和创造出可重用的代码;利用虚拟性可以在必要时更好的控制窗口的活动。
而且C++本身所具备的超越C语言的特性都可以使开发者编写出更易用,更灵活的代码。
PlatformSDK。
这才是VisualC++和整个VisualStudio的精华和灵魂,虽然我们很少能直接接触到它。
大致说来,PlatformSDK是以MicrosoftC/C++编译器为核心(不是VisualC++,看清楚了),配合MASM,辅以其他一些工具和文档资料。
上面说到DeveloperStudio没有编译程序的功能,那么这项工作是由谁来完成的呢?
是CL,是NMAKE,和其他许许多多命令行程序,这些我们看不到的程序才是构成VisualStudio的基石。
vc++是Windows平台上的C++编程环境,学习VC要了解很多Windows平台的特性并且还要掌握MFC、ATL、COM等的知识,难度比较大。
Windows下编程需要了解Windows的消息机制以及回调(callback)函数的原理;MFC是Win32API的包装类,需要理解文档视图类的结构,窗口类的结构,消息流向等等;COM是代码共享的二进制标准,需要掌握其基本原理等等。
VC作为一个主流的开发平台一直深受编程爱好者的喜爱,但是很多人却对它的入门感到难于上青天,究其原因主要是大家对他错误的认识造成的,严格的来说VC++不是门语言,虽然它和C++之间有密切的关系,如果形象点比喻的话,可以C++看作为一种”工业标准”,而VC++则是某种操作系统平台下的”厂商标准”,而”厂商标准”是在遵循”工业标准”的前提下扩展而来的。
VC++应用程序的开发主要有两种模式,一种是WINAPI方式,另一种则是MFC方式,传统的WINAPI开发方式比较繁琐,而MFC则是对WINAPI再次封装,所以MFC相对于WINAPI开发更具备效率优势。
Windows系统是一个消息驱动的OS:
1、消息的组成:
一个消息由一个消息名称(UINT),和两个参数(WPARAM,LPARAM)。
当用户进行了输入或是窗口的状态发生改变时系统都会发送消息到某一个窗口。
例如当菜单转中之后会有WM_COMMAND消息发送,WPARAM的高字中(HIWORD(wParam))是命令的ID号,对菜单来讲就是菜单ID。
当然用户也可以定义自己的消息名称,也可以利用自定义消息来发送通知和传送数据。
2、谁将收到消息:
一个消息必须由一个窗口接收。
在窗口的过程(WNDPROC)中可以对消息进行分析,对自己感兴趣的消息进行处理。
例如你希望对菜单选择进行处理那么你可以定义对WM_COMMAND进行处理的代码,如果希望在窗口中进行图形输出就必须对WM_PAINT进行处理。
3、未处理的消息到那里去了:
M$为窗口编写了默认的窗口过程,这个窗口过程将负责处理那些你不处理消息。
正因为有了这个默认窗口过程我们才可以利用Windows的窗口进行开发而不必过多关注窗口各种消息的处理。
例如窗口在被拖动时会有很多消息发送,而我们都可以不予理睬让系统自己去处理。
4、窗口句柄:
说到消息就不能不说窗口句柄,系统通过窗口句柄来在整个系统中唯一标识一个窗口,发送一个消息时必须指定一个窗口句柄表明该消息由那个窗口接收。
而每个窗口都会有自己的窗口过程,所以用户的输入就会被正确的处理。
例如有两个窗口共用一个窗口过程代码,你在窗口一上按下鼠标时消息就会通过窗口一的句柄被发送到窗口一而不是窗口二。
四、设计思路
用户管理数据库采用的是SQLServer数据库,建立用户权限表以及设备信息表,通过MFCODBC方式访问,使用类CRecordset的函数MoveFirst()、MoveLast()、MoveNext()、MovePrev()、IsBOF()、IsEOF()对设备信息表实现遍历操作,使用类CRecordset的函数AddNew增加设备或者函数Delete删除设备。
并根据用户登录情况确定用户是否可以修改设备信息,以此实现后台数据与前台界面操作的一致。
在帐户被通过后,用户可以使用它来登录系统,登录时系统自动查找用户表,判断帐户是否存在,存在则提示用户登录成功,并显示可以的操作;否则,提示不存在该用户,返回登录界面,让用户重新输入信息。
另外,经过这个验证的过程,提醒用户牢记帐号和密码,防止他人盗窃个人信息,从而提高用户信息的安全性。
进行登录操作时,访问到了用户表(User)
在用户未成功登录时,个人资料功能是被禁止的。
只有成功登录以后,用户才有资格修改自己的资料,包括基本信息的修改,帐户(昵称或密码)的更新,帐号是不可以更改的,一旦服务器分配以后,始终与帐户绑定。
方便管理员管理帐户,也使得系统具有一定的稳定性。
该模块访问到了用户表和个人信息表。
备注:
当在修改密码时,系统会确认旧密码,如果输入的旧密码错误,系统会弹出出错信息,否则才允许更新密码。
并且,如果修改昵称,系统会把修改后的昵称更新到两个表中,使得数据能够保持同步,方便管理员的管理和维护,提高了系统的可靠性。
系统具有数据录入、数据修改、记录查询、报表打印等功能。
较全面满足了材料库存管理的各项工作。
该系统采用模块化原理编程,做到了模块规模适中,本身相对独立。
模块化使程序结构清晰,易于设计、易于理解,提高了系统的可靠性。
用户的需求具体体现在各种信息的提供、保存、更新和查询统计,这就要求数据库结构能充分满足各种信息的输出和输入。
收集基本数据、数据结构以及数据处理的流程,组成一份详尽的数据字典,为后面的详细设计打下基础
。
针对本系统要求,设计如下的数据项和数据结构:
用户信息表:
包括的数据项有:
,用户名,用户密码,用户权限。
系统信息表:
包括的数据项有:
权限ID,系统设置。
读入模块
该模块只是起选择通道的作用。
根据模块的输入,输出和小说明,可设计出该模块的算法。
“读入”模块的算法
模块名:
READING
输入:
<帐号>、<密码>
输出:
<售票管理>、<系统管理员>
指令:
switch(){
case1:
调用“汽车客运公司售票系统——售票管理”模块
case2:
调用“汽车客运公司售票系统——系统管理员”模块
}
文件读入模块
该模块主要从文件中读取存储的旅客登记信息和班次信息,并将其输出到屏幕或者流向信息处理模块。
模块名:
WenJianREAD;
输入:
<查询信息>
输出:
<信息总表>
要实用的变量:
ChengKem_chengke;要查询的乘客
Busm_bus;被查询的班次
intAfxMessageBox(LPCTSTRlpszText,UINTnType=MB_OK,UINTnIDHelp=0);用于弹出一个消息框
1,创建一个MFC的application,
2,把控件拖到界面上放好,可以放两个EDIT,一个放用户名,一个放密码,再放一个按钮,名字改成确定,
3,双击确定按钮,会弹出编写代码的地方.如果LZ不要判断用户名是否正确,只要写一句就好.MessageBox(_T("登陆成功!
");,如果还需要内置一个用户名密码进行判断就获取一下两个EDIT的值进行一下判断就好了.
程序的主要有两个主要处理模块:
各个类的描述和对话框的处理
1.定义类
先定义一个乘客类:
classChengKe{
座位编号Numint
姓名Namechar[30]
身份证号IdNumchar[20]
friendBus;
}
再定义一个汽车类:
classBus{
班次号BanCichar[20]
发车时间StartTimechar[20]
终点城市DestCitychar[20]
座位数AllSeatsint
已售数量CurSeatsint
指向乘客链表的指针PsgsChengKe*
指向下一辆车的指针nextBus*
friendBusList;
public:
Bus(char*a,char*b,char*c,intd,inte){//构造函数
BanCi=a;
StartTime=b;
……
依次初始化
Psgs=newChengKe[AllSeats];//生成乘客动态数组
for(inti=1;i<=AllSeats;i++){
Psgs[i-1]->Num=I;//将座位编号初始化
将乘客姓名和身份证号清空
}
}
~Bus(){//析构函数
delete[]Psgs;
}
}
最后定义汽车列表类:
classBusList{
指向汽车类的指针headBus*
public:
BusList()
~BusList()
intAddBus(char*bc,char*st,char*dc,intas)//班次发车时间终点城市座位数
intDeleteBus(char*bc)//班次
intAddChengKe(char*bc,char*name,char*idnum)//班次号姓名身份证号
intDeleteChengKe(char*bc,char*name)//班次号姓名
intFindChengKe(char*name,char&Ans)//姓名输出的地方(char*)
intSaveBusListToFile()
intSaveChengKeListToFile(char*bc)//班次
GetBusListToScreen()
GetChengKeListToScreen(char*bc)//班次
}
BusList:
:
BusList(){
//生成10辆汽车链表,并用head指向
}
BusList:
:
~BusList(){
//删除链表
}
AddBus(char*bc,char*st,char*dc,intas){//班次发车时间终点城市座位数
//在链表中增加一个bus结点。
}
DeleteBus(char*bc){//班次
//在链表中删除一个bus结点。
}
intAddChengKe(char*bc,char*name,char*idnum){//班次号姓名身份证号
//找到相应的班次,添加ChengKe
}
2.定义所用的全局变量
//全局变量
BusList*buslist;//这里定义了一个汽车列表的指针
floatXueShengPiao=0.5;//学生票折扣
doubleJunRenPiao=0.7;//军人票折扣
doubleQiTaPiao=0.8;//其它票折扣
intYuShouDays=3;//预售期限
intJieZhiHours=1;//退票截止时间(小时)
intJieZhiMins=5;//售票截止时间(分钟)
CTimenowtime;
CStringtoday;//假定今天的日期
intwhichday=0;//正在操作哪一天
3、模块设计
通过CMenu:
:
CreatePopupMenu()建立一个弹出菜单,然后使用TrackPopupMenu弹出菜单。
使用CreatePopupMenu创建的菜单也可以将其作为一个弹出项添加另一个菜单中。
下面的伪代码演示了如何创建一个弹出菜单并进行修改后弹出:
CMenumenu1,menu2;
menu1.CreatePopupMenu
menu1.InsertMenu
(1)
menu1.InsertMenu
(2)
menu1.InsertMenu(3)
menu2.CreatePopupMenu
menu2.AppendMenu(MF_POPUP,1,menu1.Detach())将弹出菜单加入orInsertMenu...
menu2.InsertMenu("stringdesc");
menu.TrackPopupMenu(...)
用户登录界面设计,判断用户名密码是否正确
BOOLCLoginDlg:
:
OnInitDialog()
{
CDialog:
:
OnInitDialog();
//TODO:
Addextrainitializationhere
:
:
SetWindowPos(m_hWnd,HWND_TOPMOST,0,0,0,0,SWP_NOMOVE|SWP_NOSIZE);
SetDlgItemText(IDC_USER_NAME,"admin");
SetDlgItemText(IDC_USER_PASSWORD,"123456");
//m_ctrlRadio1.SetCheck
(1);
returnTRUE;//returnTRUEunlessyousetthefocustoacontrol
//EXCEPTION:
OCXPropertyPagesshouldreturnFALSE
}
voidCLoginDlg:
:
OnSubmit()
{
//TODO:
Addyourcontrolnotificationhandlercodehere
//读取用户输入的账号密码
GetDlgItemText(IDC_USER_NAME,strUserName);
GetDlgItemText(IDC_USER_PASSWORD,strUserPassword);
//判断账号密码是否匹配
if(strUserName!
="admin")
{
MessageBox("账号不存在!
","警告!
");
SetDlgItemText(IDC_USER_NAME,"");
SetDlgItemText(IDC_USER_PASSWORD,"");
return;
}elseif(strUserPassword!
="123456")
{
MessageBox("密码错误!
","警告!
");
SetDlgItemText(IDC_USER_PASSWORD,"");
return;
}
OnOK();
下面的伪代码演示了消息循环的用法:
while
(1)
{
id=getMessage(...);
if(id==quit)
break;
translateMessage(...);
}
BOOLCShouPiaoXiTongDlg:
:
OnInitDialog()//初始化
{
CDialog:
:
OnInitDialog();
//Settheiconforthisdialog.Theframeworkdoesthisautomatically
//whentheapplication'smainwindowisnotadialog
SetIcon(m_hIcon,TRUE);//Setbigicon
SetIcon(m_hIcon,FALSE);//Setsmallicon
//TODO:
Addextrainitializationhere
//-------------------------------------------------------------------------
//从这里开始是主窗口的初始化代码
//主窗口初始化到此结束
//------------------------------------------------------------------------
CLoginDlgm_logDlg;//登陆对话框实例化
m_logDlg.DoModal();//打开登录模态对话框
intm_managerType=m_logDlg.m_managerType;//赋值
//判断登录人员的身份类型
if(0==m_managerType)//如果是售票员
{
SetDlgItemText(IDC_CUR_USER,m_logDlg.strUserName);
GetDlgItem(IDC_SHEZHI)->ShowWindow(SW_HIDE);
}else//如果登陆的不是售票员
{
CSysManagerm_sysManagerDlg;//实例化一个管理员对话框
m_sysManagerDlg.m_user=m_logDlg.strUserName;
m_sysManagerDlg.DoModal();//打开管理员对话框
exit
(1);//管理员窗口关闭后直接退出不进入主对话框(售票对话框)
}
returnTRUE;//returnTRUEunlessyousetthefocustoacontrol
}
CFormView类提供用户在资源文件中定义界面的能力,并可以将子窗口和变量进行绑定。
通过UpdateData函数让数据在变量和子窗口间交换。
CTreeView类利用TreeCtrl界面作为视界面,通过调用CTreeCtrl&CTreeView:
:
GetTreeCtrl()const得到CTreeCtrl的引用。
CListView类利用ListCtrl界面作为视界面,通过调用CTreeCtrl&CTreeView:
:
GetTreeCtrl()const得到CListCtrl的引用。
CEditView类利用Edit接收用户输入,它具有输入框的一切功能。
通过调用CEdit&CEditView:
:
GetEditCtrl()const得到Edit&的引用。
voidCEditView:
:
SetPrinterFont(CFont*pFont)可以设置打印字体。
CRichEditView类作为RichTextEdit(富文本输入)的视类,提供了可以按照格式显示文本的能力,在使用时需要CRichEditDoc的支持。
下面的代码建立了一个简单身份证记录的类,同时也能够支持序列化。
inH
structstrPID
{
charszName[10];
charszID[16];
structstrPID*pNext;
};
classCAllPID:
publicCObject
{
public:
DECLARE_SERIAL(CAllPID
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- windoes 系统 编程 课程设计