C/S考试系统程序制作详解
2010-05-27 20:37:07 来源:WEB开发网三、数据库的操作实现
这部分功能主要是通过WinSocket32 API和ODBC API结合使用来实现的,服务端进入监听状态后,为每个客户端提供相应线程处理发过来的指令,通过分析指令,作出以下相应的操作:
客户端发送的指令(自定义的):login: 登陆校验 参数:用户名,科目,密码
Srecv:ScanTm: 检查服务器时间校对试卷修改试卷状态,抛出计数值
Srecv:GetSta: 获取试卷状态
Srecv:GetRlt: 获取上次做答
Srecv:GetNum: 获得试卷相关信息(总题数,开考时间,结束时间)
Srecv:GetQue: 获取试卷题目内容.
Srecv:SaveDt: 保存试卷
Srecv:ChanST: 修改试卷状态.
四、服务器程序总结
数据库被单独存放在一个服务器中可以保证数据安全性,程序会将客户端的一切操作显示在窗口中,用户可以通过观察窗口,知道所有客户端的动作。这个程序采用“完成端口”模型,可以满足大规模的考试需求。
客户端程序详解
一、窗口完全采用Win32API函数生成
主要包含一下标准控件:static控件
二、试卷的初始化
Edit控件
Button控件
Scroll控件
窗口元素全部采用计算后的相对坐标定位,所以800X600和1024X768下均能正常显示,
考虑到每张试卷的题目数量都不同,为了节约内存空间,所以我在堆中动态生成了一个试卷结构体,通过向服务器程序发送GetNum:指令来获得试卷总题数QuestionNum,然后使用TestPaper=new TestRubric [QuestionNum]/*结构体定义*/
由于TextOut函数不支持自动换行,所以换行操作必须由我自己完成.因此我用同样的方法在堆中创建了一个Screen用作屏幕显示的结构体
//试卷每道题的结构
struct Questions{
BOOL state;
char Text [512];
};
struct SelectObject{
BOOL state;
char Text[256];
};
struct TestRubric{
struct Questions Tile;
struct SelectObject choose [4];
};
Screen=new Lines[LINES]
LINES=扫描TestPaper中超过屏幕宽度的行数+ QuestionNum*5+QuestionNum*3
struct Lines{
int earmark; //用来存储Button的ID
BOOL color1;//置颜色标志
BOOL color2;//置颜色标志
char Line [512];
};
屏幕宽度=客户区的宽/每个文字的宽度/2*2
屏幕高度=客户区的高/每个文字的高度
为每一体产生4个互斥的按钮
按钮总数= QuestionNum*4
在堆中生成hWndList数组保存按钮handle
hWndList=new hWnd [QuestionNum*4]
按钮ID=题号*10+选项号
Screen.earmark=按钮ID
更多精彩
赞助商链接