操作系统课程设计C语言实现画板资料.docx
- 文档编号:1933960
- 上传时间:2023-05-02
- 格式:DOCX
- 页数:17
- 大小:81.91KB
操作系统课程设计C语言实现画板资料.docx
《操作系统课程设计C语言实现画板资料.docx》由会员分享,可在线阅读,更多相关《操作系统课程设计C语言实现画板资料.docx(17页珍藏版)》请在冰点文库上搜索。
FoshanUniversity
课程设计说明书
操作系统课程和设计
学 院:
电子与信息工程学院
专 业:
2012网络工程2
学 号:
学生姓名:
二〇一五年七月
课程设计任务书
专业 级 班
一、 设计题目:
操作系统图形显示程序接口设计
二、 主要内容:
本设计的目的是通过设计一些简单的中断调用接口,使学生掌握程序接
口的设计方法。
要求在熟悉DOS操作系统的中断接口及程序接口的基础上,利用C语言设
计简单的显示程序接口,最后通过程序验证全部接口的正确性。
三、 具体要求
利用C语言设计DOS中断中21H与图形操作相关的中断调用,具体包括:
1、设置点阵图形的彩色
2、画点
3、画线
4、画矩形
5、画圆
6、屏幕区域填充
7、屏幕区域保存
8、屏幕区域逻辑恢复
9、清除屏幕/区域
10、屏幕区域卷动
11、鼠标控制
12、多窗口功能
5
上述功能由两部分程序验证,中断驻留程序和验证程序。
首先运行中断驻留程序,然后运行验证程序得到预期结果。
4、进度安排
1-2天:
资料查找、系统分析,数据流程分析,概要设计
1-2天:
系统详细设计、功能设计
5-6天:
模块设计、编程调试
1天:
资料整理、课程设计说明书编写。
五、完成后应上交的材料
1、课程设计说明书(程序流程图、功能模块图、相关数据结构、核心算法等)
2、相关源程序文件
六、总评成绩
指导教师 签名日期 年 月 日
系主任 审核日期 年 月 日
目 录
一、程序概述 5
1.1程序任务 5
1.2程序原理 5
二、概念原理 5
三、总体设计 6
3.1设计流程图 6
3.2实现方法 6
四、详细设计 7
4.1函数使用 7
五、完成情况 7
六、使用说明 7
七、设计总结 9
7.1系统特色 9
7.2经验教训 9
7.3实践感受 9
参考资料 9
附 录 10
一.程序概述
1.1.程序任务
本设计是要求编写一个简单的命令解释器,利用C语言、DOS中断中21H与屏幕显示相关的中断调用进行设计的,主要完成要求中所提到的功能如:
画点、画线、画圆、填充、恢复、屏幕滚动等。
1.2.程序原理
设计过程中发现使用C语言进行图形操作如果使用传统的功能菜单和接口选项,会使功能无法衔接,模块化感严重,功能使用不连续的问题,用户体验非常低。
所以经过思考了查阅资料后,改用单面板上,鼠标控制输入的办法实现功能,鼠标的控制使用已经包含了中断机制,所以不用特意添加其他功能模块的中断。
使用鼠标位置追踪函数,建立int33h中断功能调用组,随时获取鼠标位置以及功能选择。
GetCursorPos(&point); //获取鼠标指针位置(屏幕坐标),调用ScreenToClient(hwnd,&point);//将鼠标指针位置转换为窗口坐标,最后再检测鼠标按下左键的状态,调用函数GetAsyncKeyState(VK_LBUTTON)。
二.概念原理
2.1中断
中断:
顾名思义,是指当出现需要时,CPU暂时停止当前程序的执行而执行处理新情况的程序和执行过程。
即在程序运行过程中,系统出现了一个必须由CPU立即处理的情况,此时,CPU暂时中止程序的执行转而处理这个新的情况的过程就叫做中断。
2.2图形显示程序接口
图形显示接口(GDI)提供了一系列的函数和相关的结构,应用程序可以使用它们在显示器、打印机或其他设备上生成图形化的输出结果。
使用GDI函数可以绘制直线、曲线、闭合图形、路径、文本以及位图图像。
所绘制的图形的颜色和风格依赖于所创建的绘图对象,即画笔、笔刷和字体。
你可以使用画笔来绘制直线和曲线,使用笔刷来填充闭合图形的内部,使用字体来书写文本。
2.3.中断驻留程序
中断驻留程序,指的是当加载进内存的程序执行完毕后,依然能够保存产
幕幕区域逻辑操作
生的临时数据跟临时状态,而在下一次调用时继续执行。
2.4.系统调用
系统调用,顾名思义,说的是操作系统提供给用户程序调用的一组“特殊”接口。
用户程序可以通过这组“特殊”接口来获得操作系统内核提供的服务,
比如用户可以通过文件系统相关的调用请求系统打开文件、关闭文件或读写文件,可以通过时钟相关的系统调用获得系统时间或设置定时器等。
从逻辑上来说,系统调用可被看成是一个内核与用户空间程序交互的接口,它好比一个中间人,把用户进程的请求传达给内核,待内核把请求处理完毕后再将处理结果送回给用户空间。
三.总体设计
选取颜色
3.1程序流程图
画线
画点
鼠标控制
图形显示程序接口设计
画圆
图
矩形
多窗口功能
屏幕区域填充
屏幕区域保存
屏幕区域逻辑恢复
6
清除屏幕/区域
3.2实现方法
使用GetCursorPos(&point);函数获取鼠标指针位置(屏幕坐标),随时获取鼠标位置以及功能选择。
调用ScreenToClient(hwnd,&point);//将鼠标指针位置转换为窗口坐标,调用函数GetAsyncKeyState(VK_LBUTTON),检测鼠标按下左键的状态,根据鼠标状态选择功能并输出。
四.详细设计
4.1函数使用
Show()输出功能面板边框以及调色板色块GetCursorPos(&point); //获取鼠标指针位置(屏幕坐标)ScreenToClient(hwnd,&point);//将鼠标指针位置转换为窗口坐标
Line()画线函数
Bar()画条函数
Rectangle()画矩形函数
Circle()画圆函数
Setfillstyle()设置填充图样和颜色函数
Getimage()保存图像函数
Putimage()输出图像函数
Cleardevice();刷新屏幕
五.完成情况
本程序完成了其中的选择颜色,设置点阵图形的彩色,画点,画线,画矩
形,画圆,屏幕区域填充,屏幕区域保存,屏幕区域逻辑恢复,清除屏幕/区域,鼠标控制,多窗口功能。
屏幕卷动功能尚未实现,但大部分及主要功能都已实
现,并不影响使用,部分功能存在BUG,使用时需遵循一定使用方法,有待改善。
17
六.使用说明
左边工具栏按顺序为
1、画曲线
2、画直线
3、画矩形
4、画圆
5、封闭区域颜色填充
6、保存画面到文件
7、清屏
8、撤销一步操作
9、恢复之前保存的文件到画面上底部为调色板,点击选色
七.设计总结
7.1系统特色
本系统使用单页面操作,比起传统的DOS界面操作的选项菜单来说,更加便利以及直观,可以在同一窗口看到多次操作的结果,用户体验更好,而且全程鼠标控制,直观的菜单栏都是本软件亮点。
7.2经验教训
本次课程设计一开始,我使用的是传统的选择菜单模式实现功能,每个功能都需要经过一次选择和退出才能执行下一个功能,没有连贯性,并不符合我们本次任务的画板功能,经过与同学的讨论分析后,我们才决定重新开始,更改界面,这告诉我们要摆脱定势思维,因为我们习惯于作选项接口,就忘了分析。
做项目之前应先分析清楚,所需要的方法及功能再开始程序设计,而不应该使用老方法,直接开始。
7.3实验感受
本次课程设计让我对C语言的感悟更加深了一层,曾经以为C语言有许多功能都无法实现,但当开始课程设计并查找资料都发现,C语言功能强大而且深奥,之前所学习的东西可以说是沧海一粟,是在拿不出手,经过了大量翻阅
C语言高级教程后,才有所了解。
数据结构与操作系统知识也是不可或缺,作
为本次设计的核心,操作系统的中断功能又花费了我们大量的时间来理解,然后用C语言实现,又一次锻炼了我的编码功能,在做后退功能的时候,需要用到栈结构来保存之前多部操作,但是实现了栈之后,却无法实现类类型入栈,所以最终只能做出单步恢复的功能,还是有待改进。
本次课程设计让我加深了,软件设计的整个流程以及对语言的熟悉程度,为以后打下坚实基础。
参考资料
1、《计算机操作系统教程》(第2版)张尧学史美林 编著清华大学出版社
2、《操作系统实验指导》任爱华李鹏刘方毅清华大学出版社
3、《操作系统实验教程——核心技术与编程实例》顾宝根王立松顾喜梅 科学出版社
4、《C++编程思想》 Bruck著侯捷译 机械工业出版社
5、《C语言程序中清除键盘缓冲区的方法》 杨长虹益阳职业技术学院学报
附 录
#include
{
voidshow();
IMAGEimg;
initgraph(1000,680); //初始化绘图窗口
HWNDhwnd=GetHWnd(); //获取绘图窗口句柄
POINTpoint;setfillcolor(LIGHTGRAY);show();
intx1,y1,a=0,p,color;chars[]="SAVE";
charseban[]="调色板";
chart[]="FULL";
charc[]="CLEAR";
charb[]="BACK";charr[]="RETURN";
outtextxy(15,220,t);outtextxy(10,635,seban);outtextxy(15,270,s);outtextxy(10,320,c);outtextxy(15,380,b);outtextxy(3,430,r);while(true)
{
GetCursorPos(&point); //获取鼠标指针位置(屏幕坐标)ScreenToClient(hwnd,&point);//将鼠标指针位置转换为窗口坐标if(GetAsyncKeyState(VK_LBUTTON))
{ if(point.y>630)
{
setcolor(getpixel(point.x,point.y));color=getpixel(point.x,point.y);}
if(point.x<60)
{
if(point.y>0&&point.y<=50)//曲线a=0;
if(point.y>50&&point.y<=100)//直线a=1;
if(point.y>100&&point.y<=150)//矩形a=2;
if(point.y>150&&point.y<=200)//圆a=3;
if(point.y>200&&point.y<=250)//fulla=4;
if(point.y>300&&point.y<=350)//刷新屏幕,重新输出所有
{
getimage(&img,60,0,1000,610);cleardevice();
show();outtextxy(10,320,c);outtextxy(15,270,s);outtextxy(15,220,t);
outtextxy(10,635,seban);outtextxy(15,380,b);outtextxy(3,430,r);
}
if(point.y>250&&point.y<=300)//保存
{
getimage(&img,60,0,1000,610);saveimage("E:
\\test.jpg");HWNDhwnd=GetHWnd();
MessageBox(hwnd,_T("已保存到E:
\\text.jpg!
"),
_T("save"),MB_OK);
}
if(point.y>350&&point.y<=400)//后退a=5;
if(point.y>400&&point.y<=450)//恢复到文件内容a=6;
}
while
(1)
{
x1=point.x;y1=point.y;if(a==0)//曲线
{
getimage(&img,60,0,1000,610);
GetCursorPos(&point); //获取鼠标指针位置(屏幕坐标)
窗口坐标
ScreenToClient(hwnd,&point);//将鼠标指针位置转换为
line(x1,y1,point.x,point.y);if(!
GetAsyncKeyState(VK_LBUTTON))
break;
}
if(a==2)//矩形
{
if(!
GetAsyncKeyState(VK_LBUTTON))
{
坐标)
换为窗口坐标
}
getimage(&img,60,0,1000,610);
GetCursorPos(&point); //获取鼠标指针位置(屏幕
ScreenToClient(hwnd,&point);//将鼠标指针位置转
line(x1,y1,point.x,y1);
line(x1,y1,x1,point.y);line(x1,point.y,point.x,point.y);
line(point.x,y1,point.x,point.y);break;
}
if(a==1)//直线
{
if(!
GetAsyncKeyState(VK_LBUTTON))
{
坐标)
为窗口坐标
getimage(&img,60,0,1000,610);
GetCursorPos(&point); //获取鼠标指针位置(屏幕
ScreenToClient(hwnd,&point);//将鼠标指针位置转换
line(x1,y1,point.x,point.y);break;
}
}
if(a==3)//圆
{
if(!
GetAsyncKeyState(VK_LBUTTON))
{
幕坐标)为窗口坐标
getimage(&img,60,0,1000,610);
GetCursorPos(&point); //获取鼠标指针位置(屏
ScreenToClient(hwnd,&point);//将鼠标指针位置转换
farcircle(x1,y1,(int)sqrt((point.x-x1)*(point.x-
x1)+(point.y-y1)*(point.y-y1)));
break;
}
}
if(a==4)//full
{
if(!
GetAsyncKeyState(VK_LBUTTON))
{
坐标)
换为窗口坐标
}
getimage(&img,60,0,1000,610);
GetCursorPos(&point); //获取鼠标指针位置(屏幕
ScreenToClient(hwnd,&point);//将鼠标指针位置转
setfillcolor(color);setfillstyle(BS_SOLID);floodfill(point.x,point.y,BLACK);
break;}
if(a==5)//后退
{ putimage(60,0,&img);break;
}
if(a==6)//文件恢复
{loadimage(&img,"E:
\\test.jpg");putimage(0,0,&img);break;
}
}
}
}
}
voidshow()
{
farfloodfill(1,1,BLUE);
setbkmode(TRANSPARENT);//背景模式。
透明
setcolor(BLACK);setfillcolor(BLACK);setfillstyle(BS_SOLID);
bar(75,620,95,640);//使用对角线坐标画矩形
setcolor(RED);setfillcolor(RED);setfillstyle(BS_SOLID);
bar(75,650,95,670);//使用对角线坐标画矩形
setcolor(GREEN);setfillcolor(GREEN);setfillstyle(BS_SOLID);
bar(105,620,125,640);//使用对角线坐标画矩形
setcolor(BLUE);setfillcolor(BLUE);setfillstyle(BS_SOLID);
bar(105,650,125,670);//使用对角线坐标画矩形
setcolor(YELLOW);setfillcolor(YELLOW);setfillstyle(BS_SOLID);
bar(135,620,155,640);//使用对角线坐标画矩形
setcolor(BROWN);setfillcolor(BROWN);setfillstyle(BS_SOLID);
bar(135,650,155,670);//使用对角线坐标画矩形
setcolor(CYAN);setfillcolor(CYAN);setfillstyle(BS_SOLID);
bar(165,620,185,640);//使用对角线坐标画矩形
setcolor(MAGENTA);setfillcolor(MAGENTA);setfillstyle(BS_SOLID);
bar(165,650,185,670);//调色板输出完成
setcolor(BLACK);setfillcolor(LIGHTGRAY);setlinestyle(0,2);line(60,0,60,680);
line(0,50,60,50);
line(0,100,60,100);
line(0,150,60,150);
line(0,200,60,200);
line(0,250,60,250);
line(0,300,60,300);
line(0,350,60,350);
line(0,400,60,400);
line(0,450,60,450);
line(0,610,1000,610);//边线
setlinestyle(0,4);//按钮line(5,30,10,20);
line(10,20,20,30);
line(20,30,30,20);
line(30,20,40,30);
line(40,30,50,20);//波浪线
line(10,75,50,75);//直线
rectangle(10,110,50,140);//矩形
circle(30,175,18);//圆}
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 操作系统 课程设计 语言 实现 画板 资料