医学信息系统实验Word文档下载推荐.docx
《医学信息系统实验Word文档下载推荐.docx》由会员分享,可在线阅读,更多相关《医学信息系统实验Word文档下载推荐.docx(47页珍藏版)》请在冰点文库上搜索。
要求通过实验操作,培养学生自主学习HIS的兴趣和能力,树立卫生信息化意识,社会意识、职业意识、责任意识、标准化与法规意识。
随着计算机技术的发展,人类在生产、生活的各个领域都应用到了计算机,这充分体现了计算机高效、全面、快速处理信息的能力。
医院管理信息系统(HMIS)的主要目标是支持医院的行政管理与事务处理业务,减轻事务处理人员的劳动强度,辅助医院管理,辅助高层领导决策,提高医院的工作效率,从而使医院能够以少的投入获得更好的社会效益与经济效益。
住院管理作为医院管理系统的一个重要分支,承担着患者一切的住院事务,本实验主要应用Visual
C开发医院管理中收费管理系统,通过对简单的医院子系统的设计与开发,进一步加深学生对所学知识的理解,培养学生的实际动手能力。
一、Visual
C简介
Visual
C6.0是微软公司推出的开发Win32应用程序(Windows95/98/2000/XP/NT)的、面向对象的可视化集成工具。
它的最大优点就是提供了功能强大的MFC类库,MFC是一个很大的C类层次结构,其中封装了大量的类及其函数,很多Windows程序所共有的标准内容可以由MFC的类来提供,MFC类为这些内容提供了用户接口的标准实现方法,程序员所要做的就是通过预定义的接口把具体应用程序特有的东西填入这个轮廓,这将简化编程工作,大大的减少程序员编写的代码数量,使编程工作变得更加轻松容易。
二、Visual
C基本特征
1.抽象:
抽象就是忽略一个主题中与当前目标无关的那些方面,以便更充分地注意与当前目标有关的方面。
抽象并不打算了解全部问题,而只是选择其中的一部分,暂时不用部分细节。
比如,我们要设计一个学生成绩管理系统,考察学生这个对象时,我们只关心他的班级、学号、成绩等,而不用去关心他的身高、体重这些信息。
抽象包括两个方面,一是过程抽象,二是数据抽象。
过程抽象是指任何一个明确定义功能的操作都可被使用者看作单个的实体看待,尽管这个操作实际上可能由一系列更低级的操作来完成。
数据抽象定义了数据类型和施加于该类型对象上的操作,并限定了对象的值只能通过使用这些操作修改和观察。
2.继承:
继承是一种联结类的层次模型,并且允许和鼓励类的重用,它提供了一种明确表述共性的方法。
对象的一个新类可以从现有的类中派生,这个过程称为类继承。
新类继承了原始类的特性,新类称为原始类的派生类(子类),而原始类称为新类的基类(父类)。
派生类可以从它的基类那里继承方法和实例变量,并且类可以修改或增加新的方法使之更适合特殊的需要。
这也体现了大自然中一般与特殊的关系。
继承性很好的解决了软件的可重用性问题。
比如说,所有的Windows应用程序都有一个窗口,它们可以看作都是从一个窗口类派生出来的。
但是有的应用程序用于文字处理,有的应用程序用于绘图,这是由于派生出了不同的子类,各个子类添加了不同的特性。
3.封装:
封装是面向对象的特征之一,是对象和类概念的主要特性。
封装是把过程和数据包围起来,对数据的访问只能通过已定义的界面。
面向对象计算始于这个基本概念,即现实世界可以被描绘成一系列完全自治、封装的对象,这些对象通过一个受保护的接口访问其他对象。
一旦定义了一个对象的特性,则有必要决定这些特性的可见性,即哪些特性对外部世界是可见的,哪些特性用于表示内部状态。
在这个阶段定义对象的接口。
通常,应禁止直接访问一个对象的实际表示,而应通过操作接口访问对象,这称为信息隐藏。
事实上,信息隐藏是用户对封装性的认识,封装则为信息隐藏提供支持。
封装保证了模块具有较好的独立性,使得程序维护修改较为容易。
对应用程序的修改仅限于类的内部,因而可以将应用程序修改带来的影响减少到最低限度。
4.
多态性:
多态性是指允许不同类的对象对同一消息作出响应。
比如同样的加法,把两个时间加在一起和把两个整数加在一起肯定完全不同。
又比如,同样的选择编辑-粘贴操作,在字处理程序和绘图程序中有不同的效果。
多态性包括参数化多态性和包含多态性。
多态性语言具有灵活、抽象、行为共享、代码共享的优势,很好的解决了应用程序函数同名问题。
三、Visual
C面相对象设计的优点
开发时间短,效率高,可靠性高,所开发的程序更强壮。
由于面向对象编程的可重用性,可以在应用程序中大量采用成熟的类库,从而缩短了开发时间。
应用程序更易于维护、更新和升级。
1、学会在文本框中显示文本;
2、学会弹出式对话框的使用。
信息显示是人机交互的基础,同时,信息显示也为以后的程序调试打下基础。
1、新建工程。
打开VC6.0点击[文件]->
[新建],弹出如下对话框:
在工程选项中选择MFC
AppWizard[exe],选择好工程存入的位置,然后在工程名称中填入工程的名称,例如Eg01,填入Eg01后。
VC会在我们选择的路径后自动加入一个以工程名命名的文件夹作为工程目录。
完成按[确定]就会进入工程向导,出现以下的提示:
在这里选择[基于对话框]就行了。
这里简要说明一下单文档及多文档方式:
①单文档:
程序一次只能处理一个文档对象(文件),像写字板,记事本等。
②多文档:
程序一次可以处理多个对象(文件),像word之类的,可以同时打开多个文件。
③基本对话框:
程序一般用于处理一些比较小的,工具型的软件,像双龙的ISP下载软件,Easy51Pro等都是基于对话框。
一些不是很复杂的工业软件也通常可以用基于对话框的形式,这种方式的优点是所见即所得,一些控件可以像VB一样拖到工作区就行了。
选好以后直接按[完成]就可以了。
至于[下一步]的向导,这里我们先不管。
然后会进入以下的画面:
2、选中静态文本框[TODO:
在这里设置对话框控制],单击指标右键,在弹出的快捷菜单中选择[属性Properties]菜单项,弹出如下对话框:
修改IDC_STATIC为IDC_FIRSTLABEL,标题可以写为“第一个应用程序”然后关闭这个对话框,就可以看到刚才的静态文本框内容变为“第一个应用程序”了。
在刚才的操作中,我们将静态文本框的ID改为了IDC_FIRSTLABEL,在VC中,ID是控件的标志,不能有相同的ID出现,但允许多个名为IDC_STATIC的ID号。
所以,一般并不把文件名命为IDC_STATIC,除非以后我们不想在程序中改变这个控件的属性。
有一些控制,例如:
GroupBox一般并不在程序中改变什么,所以不改变其ID号。
ID是程序访问控件的标识,所以一个应用程序中不能有重复
ID。
接下来我们要添加一个按钮。
用鼠标将控件条上的按钮拖到对话框上,可以看到对话框上多了一个按钮。
用上述方法,改变按钮ID为IDC_BTN1,标题改为“显示”,这样就做好一个按钮了。
3、为按钮添加代码
添加完成以后,按F7编译。
如果编译通过,按F5运行,可以看到程序运行后的对话框:
按[OK]为按钮添加响应函数,出现以下画面:
voidCEg01Dlg:
:
OnBtn1()
{
//TODO:
Addyourcontrol
notificationhandlercodehere
}
这一段就是刚才按钮的函数了。
当然,现在还没有响应。
现在我们添加一个事件,让这个按钮按下后上面的静态文本框的内容变为“串口号:
COM1波特率:
57600”把上面的代码改为:
Addyourcontrolnotificationhandlercodehere
SetDlgItemText(IDC_FIRSTLABEL,“串口号:
57600”);
按下按钮,可以看到上面的静态文本框的内容改变了。
这样就完成了第一步操作了,如图所示:
//TODO:
Addyourcontrolnotificationhandlercodehere
SetDlgItemText
(IDC_FIRSTLABEL,“串口号:
看看SetDlgItemText这个函数,IDC_FIRSTLABEL
是给静态文本框分配的ID,后面的参数是要显示的内容。
上面我们提到过,VC中的控件都认为是窗体,所以,对于所有的文本显示,我们都可以用这个函数来做,大家可以试着加入一个编辑框(Edit),同样可以使用这个函数,只要ID号对了就可以了。
VC对大小写敏感,大家要注意大小写。
下面我们用另一个方法来实现。
把代码改为:
OnBtn1()
//
TODO:
CString
a;
a=“串口号:
57600”;
SetDlgItemText(IDC_FIRSTLABEL,a);
然后按F7编译,无误则按F5运行。
可以看到运行结果是一样的。
把变量a定义为CString类型,这个类型在C中可能没有见过。
CString其实是VC中的一个类。
这里要引入类的概念了。
类跟C语言结构体很像,结构体可以有成员变量,但不能有成员函数,类不但可以有成员变量,还可以有成员函数,并且支持多种方法。
在VC中,类用class标识。
下面是一个类的定义,来分析一下。
classCEg01Dlg:
publicCDialog
public:
CStringGetPath(void);
protected:
intGetMax(inta,intb);
inta;
intb;
};
首先,我们从这句classCEg01Dlg:
publicCDialog知道这个类名是CEg01Dlg,那么public后面的CDialog其实也是一个类,是VC中标准对话框类。
publicCDialog意思是我们定义的这个类CEg01Dlg从CDialog派生,也叫从CDialog继承,从继承这个词语大家就会明白CEg01Dlg不但可以有自身函数,而且还可以用到CDialog里的变量及函数,所以说是继承,也叫CDialog为父类,把CEg01Dlg称为子类。
当然,这是相对的。
如果再定义一个类从CEg01Dlg派生,那么CEg01Dlg也就是父类,派生出来的类就是子类。
CString这个类不是派生的,所以也没有父类了。
用CString定义一个变量a,我们称为类变量,CString有很强大的功能,我们这里只用到一个功能,就是字符串,a可以是一个不定长度的字符串,所以可以给a赋一个任意的字符串而不用关心长度。
当然,也可以用intStringLen=a.GetLength();
来获得这个字符串的长度.从这句可以看到,GetLength()是类CString里的一个函数。
要显示字符串的长度,把代码改为:
a;
a="
串口号:
COM1
波特率:
57600"
;
(IDC_FIRSTLABEL,a);
a.Format("
字符串的长度:
%d"
a.GetLength());
MessageBox(a);
运行一下,效果如下:
这里用到了类Cstring的另一个成员函数Format();
这个函数用起来跟C语言里的Printf()很像,就不多说明了。
格式化后的字符串还是存放在a中,在这里,还用到了一个新的函数MessageBox();
只是用了这个函数最简单的用法,显示一个字符串.MessageBox用于弹出一个提示对话框.查查MSDN就知道,函数原型是
intMessageBox(LPCTSTRlpszText,LPCTSTRlpszCaption=NULL,UINTnType=MB_OK);
在VC里面,函数可以有默认值,例如LPCTSTRlpszCaption=NULL,UINTnType=MB_OK变量lpszCaption的默认值是NULL,
nType的默认值是MB_OK,这些有默认值的变量我们可以不传值,所以这个函数使用时,最简单的用法就是传lpszText就可以了.如果要显示一个固定的字串,可以这样调用MessageBox(“大家好”)。
1、新建一个工程,并为该工程添加静态文本和按钮。
2、为按钮添加代码及响应函数,实现按钮的操作功能。
学习人机交互,为医学信息系统软件开发提供界面基础。
参考实验一的方法新建一个工程,名字为Eg02完成后如下图:
新建的工程里还有一个对话框,ID名是IDD_ABOUTBOX,双击IDD_ABOUTBOX就可以了,看到如下对话框:
这就是这个程序的关于对话框,一般用于版权声明及版本号标识。
这个对话框里有两个静态文本框和一个图像框(Picture),先按F7编译,然后按F5运行。
可以看到程序运行了,如图所示:
单击应用程序图标,就会出现一个菜单,选最后一个[关于Eg02],关于对话框就弹出来了。
2、添加一个按钮,然后把按钮的ID改为IDC_BTN_ABOUTME,把标题,也就是Caption改为[关于]。
最终效果如下:
下面为按钮添加代码。
双击[关于]按钮,在弹出的对话框中点[确定]就可以了。
为了更好的理解下面的操作,先要解释一下关于对话框的类。
VC向导会为关于对话框建立一个类。
单击标签ClassView(这里显示的是[Class…])就可以看到Eg02这个应用程序的类。
第一个CAboutDlg就是关于对话框的类。
CEg02Dlg对应IDD_EG02_DIALOG。
中间的Ceg02App是应用程序的基础类。
所以,如果要对关于对话框进行操作,就要用到类CAboutDlg,因为与此有关的函数及变量都封装在CAboutDlg中。
先为[关于]按钮添加代码:
voidCEg02Dlg:
OnBtnAboutme()
上面是VC为[关于]按钮添加的响应函数。
添加代码如下所示
:
OnBtnAboutme()
CAboutDlg
ADlg;
ADlg.DoModal();
一共有两句,第一句是CAboutDlgADlg;
作用是定义一个变量Adlg。
第二句是ADlg.DoModal();
功能是调用类CAboutDlg里的一个函数DoModal();
这个函数在MSDN里的解释是Call
this
memberfunctiontoinvokethemodaldialogboxandreturnthedialog-boxresultwhendone.Thismemberfunctionhandlesallinteractionwiththeuserwhilethedialogboxisactive.Thisiswhatmakesthedialogboxmodal;
thatis,theusercannotinteractwithotherwindowsuntilthedialogbox
is
closed。
一般我们用于显示一个对话框。
其实CAboutDlg这个类下面,只有两个函数:
DoModal()这个函数并不在这个里面。
其实CAboutDlg这个类是派生于CDialog类,DoModal()这个函数是CDialog的成员函数,由于CAboutDlg是继承父类CDialog的,所以CDialog里的函数在CAboutDlg中也可以使用。
3、常用控件的使用
首先在IDD_EG02_DIALOG对话框中加入一个Edit(编辑框)控件。
Edit一般用于输入输出数据文本。
相当于VB里的
TextBox。
加入Edit控件后,编辑其属性为:
然后,再加一个按钮(PushButton),并编辑其属性为:
在编辑框里输入一个文本,然后按显示,就把文本显示在静态文本框中。
所以这里要把静态文本编辑框的ID改为IDC_DISPLABEL。
下面我们为[显示]按钮添加代码:
OnBtnShow()
GetDlgItemText(IDC_EDIT_INPUT,a);
SetDlgItemText(IDC_DISPLABEL,a);
第一句定义一个CString类变量
a,
GetDlgItemText这个函数函数的原型:
intGetDlgItemText(intnID,LPTSTRlpStr,intnMaxCount)const;
intGetDlgItemText(intnID,CString&
rString)const;
有两个原型,一个是传两个参数,另一个是传三个参数,在VC里面,同一个类下是可以存在多个同名函数的,具体调用哪个函数要看参数的不同。
在这里我们传入了两个参数,所以VC会调用intGetDlgItemText(intnID,CString&
这个函数。
第一个函数是控件的ID号,第二个是字串。
第二个传了地址,所以我们在下一句中用的a已经是获得IDC_EDIT_INPUT的文本了。
运行效果如下:
4、进度条的使用以及定时器的使用
要实现的效果是进度从0到满格,然后再从0到满格,依次循环。
每跳一格间隔500ms,这个时间我们用定时器来实现。
首先从控件条里拖出一个进程条到对话框,修改属性如下:
然后我们要介绍一下VC的定时器。
VC里面使用定时器有多种方式,首先添加一个Windows消息处理器,如图所示:
在类管理器里选中Ceg02Dlg这个类,然后点右键,就会弹出一个菜单,选择[Add
WindowsMessageHandler…],接下来会弹出另一个菜单,如图所示:
双击WM_TIMER然后按[确定]就可以了。
CEg02Dlg类中多了一个函数。
如图所示:
这个就是VC中的定时器响应函数。
然后双击这个函数就进入代码了:
然后为Timer事件添加代码:
OnTimer(UINTnIDEvent)
Addyourmessagehandlercodehereand/orcalldefaultIDC_PROGRESS
staticintnPos=0;
((CProgressCtrl*)(GetDlgItem(IDC_PROGRESS)))->
SetPos(nPos);
if(nPos<
100)
nPos+=10;
else
nPos=0;
CDialog:
OnTimer(nIDEvent);
首先定义一个整型的变量nPos用于记录进度条的进度值。
默认时,进度条0为空,100为满格。
GetDlgItem(IDC_PROGRESS)这个函数用来获取IDC_PROGRESS的句柄,在VC里面引入了句柄这个词语,句柄是WINDOWS用来标识被应用程序所建立或使用的对象的唯一整数,WINDOWS使用各种各样的句柄标识诸如应用程序实例,窗口,控制,位图,GDI对象等等。
WINDOWS句柄有点象C语言中的文件句柄。
在这里,GetDlgItem获取了窗体句柄,大家应该还记得,在VC里面,控制就看成窗体。
(CProgressCtrl*)这个地方是将返回的句柄强制转换为CProgressCtrl类型,与C语言的中的强制转换是一样的。
进度条的控制类是
CprogressCtrl。
而前面返回的是一个窗体类型,所以先要强制转换.在第一章中,我们提到过,VC中的控件都认为是窗体,在这里就体现出来了。
这个函数是类CprogressCtrl的成员函数,用来指定当前进度条的进度。
最后还有一步,就是激活这个定时器。
像我们的C51或AVR一样,要初始化定时器。
而voidCEg02Dlg:
OnTimer(UINT
nIDEvent)这个函数就像我们单片机的定时器中断服务函数一样。
时间到了就会自动执行。
参考上面的图,双击OnInitDialog(),就可以进入对话框初始化函数,只要添加一句就可以了。
完成后如下:
BOOLCEg02Dlg:
OnInitDialog()
OnInitDialog();
Add"
About..."
menuitemtosystemmenu.
IDM_ABOUTBOXmustbeinthesystemcommandrange.
ASSERT((IDM_ABOUTBOX
&
0xFFF0)==IDM