《C语言下拉菜单设计-带源代码.ppt》由会员分享,可在线阅读,更多相关《C语言下拉菜单设计-带源代码.ppt(30页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、C C语言下拉菜单语言下拉菜单程序设计程序设计唐远新唐远新哈尔滨理工大学哈尔滨理工大学主要内容l显示器工作方式显示器工作方式l文本窗口文本窗口I/OI/O函数函数lbioskeybioskey函数函数l下拉菜单程序设计下拉菜单程序设计l扩展设计要求扩展设计要求1.显示器工作方式l显示适配器(显卡)显示适配器(显卡)单色文本适配器(单色文本适配器(MDAMDA)彩色图形适配器(彩色图形适配器(CGACGA)增强图形适配器(增强图形适配器(EGAEGA)等)等工作模式:字符模式、图形模式工作模式:字符模式、图形模式l显示器上的所有信息均来自显示适配器显示器上的所有信息均来自显示适配器l屏幕信息保存
2、在显示器存储器屏幕信息保存在显示器存储器(VRAM)(VRAM)中中l窗口、图形等编程本质是对窗口、图形等编程本质是对VRAMVRAM编程编程字符模式的显示器l显示信息的形态显示信息的形态硬件支持:字符发生器硬件支持:字符发生器 (计算机组成原理)(计算机组成原理)屏幕显示:字符屏幕显示:字符VRAMVRAM中内部表示:中内部表示:值:字符的值:字符的ASCIIASCII码:码:1 1字节字节颜色属性:颜色属性:1 1字节字节l屏幕宽度屏幕宽度8025 8025 (横坐标(横坐标-80-80列列 纵坐标纵坐标-25-25行)行)4025 4025 (横坐标(横坐标-40-40列列 纵坐标纵坐标
3、-25-25行)行)颜色属性l包括两个方面:字符的颜色和衬托字符的颜包括两个方面:字符的颜色和衬托字符的颜色。把对象的颜色称为前景的颜色,衬托对色。把对象的颜色称为前景的颜色,衬托对象的颜色称为背景的颜色。象的颜色称为背景的颜色。前景色前景色/背景色背景色l文本方式下显示属性字节文本方式下显示属性字节76543021闪烁闪烁背背 景景增亮增亮前景前景0-不闪烁1-闪烁0-正常1-增亮位位属性位表示的颜色前前/背景色背景色属性值属性值颜色颜色加亮颜色加亮颜色(当位(当位3为为1时)时)000黑黑灰灰001蓝蓝浅蓝浅蓝010绿绿浅绿浅绿011青青浅青浅青100红红浅红浅红101紫红紫红浅紫红浅紫红
4、110棕色棕色黄黄111灰灰白白2.文本窗口I/O函数l窗口:具有色彩的有边界的矩形区域窗口:具有色彩的有边界的矩形区域l控制台控制台I/O I/O 头部文件头部文件#include#include l文本窗口文本窗口I/OI/O函数分类函数分类文本模式设置与创建文本窗口函数文本模式设置与创建文本窗口函数文本输入文本输入/输出函数输出函数属性与状态控制函数属性与状态控制函数文本模式设置函数lvoid void textmode(inttextmode(int mode);mode);l将屏幕设置成文本模式的全屏幕窗口,并清将屏幕设置成文本模式的全屏幕窗口,并清除窗口中所有的图形和正文。除窗口中
5、所有的图形和正文。符号常量符号常量数值数值文本模式文本模式LASTMODE-1原文本模式原文本模式BW400黑白,黑白,40列列C401彩色,彩色,40列列BW802黑白,黑白,80列列C803彩色,彩色,80列列MONO7单色,单色,80列列从图形模式返回到文本模式时才使用这个函数从图形模式返回到文本模式时才使用这个函数创建文本窗口函数lvoid void window(intwindow(int left,left,intint top,top,intint right,right,intint bottom);bottom);l在屏幕上创建指定大小的文本窗口在屏幕上创建指定大小的文本窗口
6、l默认定义的窗口为整个屏幕(默认定义的窗口为整个屏幕(1 1,1 1)和)和(8080,2525)。)。l窗口中每个字符有一个坐标值(窗口中每个字符有一个坐标值(x,yx,y)l左上角、右下角的坐标不能越界左上角、右下角的坐标不能越界l输入、输出信息将限定在该窗口范围内输入、输出信息将限定在该窗口范围内光标位置设置/读取函数lintint wherex(voidwherex(void)返回当前文本窗口中光标的位置的返回当前文本窗口中光标的位置的X X 坐标,坐标,返回值为返回值为1 1到到8080之间的整数之间的整数 lintint wherey(voidwherey(void)返回当前文本窗
7、口中光标位置的返回当前文本窗口中光标位置的Y Y坐标,坐标,返回值为返回值为1 1到到2525之间的整数之间的整数lvoid void gotoxygotoxy(intint x,intyx,inty)在当前文本窗口中把光标移动到指定的位在当前文本窗口中把光标移动到指定的位置置控制台(窗口)文本I/O函数lcpringtfcpringtf(格式说明字符串格式说明字符串,变量名表,变量名表)把变量名表中的信息按格式说明输出到当前窗口把变量名表中的信息按格式说明输出到当前窗口lcputs(charcputs(char*string)*string)输出一个字符串到当前窗口上输出一个字符串到当前窗口
8、上lputchar(charputchar(char c)c)输出一个字符到当前窗口上输出一个字符到当前窗口上lchar char getchc(voidgetchc(void)从键盘上获得一个字符并在屏幕上显示出来从键盘上获得一个字符并在屏幕上显示出来lchar char getchgetch()()从键盘上获得一个无回显的字符从键盘上获得一个无回显的字符控制台(窗口)信息清除函数lvoid void clrscr(voidclrscr(void)清除当前窗口,并将光标移到左上角位置清除当前窗口,并将光标移到左上角位置(1,1)(1,1)lvoid void clreol(voidclreo
9、l(void)将从光标位置到行末的所有字符清除将从光标位置到行末的所有字符清除lvoid void delline(voiddelline(void)删除光标所在的那一行删除光标所在的那一行,以下各行上移一以下各行上移一行行例子例子1 1:建立一个:建立一个1010行行4040列宽的窗口列宽的窗口颜色与状态控制函数lvoid void textbackground(textbackground(intint color color)设立当前窗口的背景颜色为设立当前窗口的背景颜色为colorcolor所指的所指的颜色颜色lvoid void textcolor(textcolor(intint
10、color color)设立当前窗口的文本颜色为设立当前窗口的文本颜色为colorcolor所指的所指的颜色颜色lvoid void textattr(inttextattr(int attrattr)同时设立当前窗口背景和前景的颜色为同时设立当前窗口背景和前景的颜色为attrattr所指的颜色所指的颜色颜色参数color的含义符号常量译名数值前景和背景色BLACK黑0两者均可BLUE蓝1两者均可MAGENTA品红5两者均可GREEN绿2两者均可CYAN青3两者均可RED红4两者均可BROWN综6两者均可LIGHTGRAY淡灰7两者均可DARKGRAY暗灰8前景(只用于字符)LIGHTBLUE
11、淡蓝9前景(只用于字符)LIGHTGREEN淡绿10前景(只用于字符)LIGHTCYAN淡青11前景(只用于字符)LIGHTRED淡红12前景(只用于字符)LIGHTMAGENTA浅品红13前景(只用于字符)YELLOW黄14前景(只用于字符)WHITE白15前景(只用于字符)BLINK闪烁128前景(只用于字符)颜色控制举例l例例2 2 建立一个建立一个1010行行4040列的用户窗口,且列的用户窗口,且窗口的颜色是蓝底黄字。显示的内容在窗口的颜色是蓝底黄字。显示的内容在窗口中滚动。窗口中滚动。单步运行,再添加单步运行,再添加gotoxy(i,igotoxy(i,i)语句测试语句测试l例例3
12、 3 在规定的窗口在规定的窗口(20,5,60,15)(20,5,60,15)中,底中,底色由色由BLACKBLACK到到LIGHTGRAY(LIGHTGRAY(由黑到浅灰由黑到浅灰)八八种颜色的变化,而文本颜色也是如此变种颜色的变化,而文本颜色也是如此变化化注意本例中颜色的符号常量标识符注意本例中颜色的符号常量标识符测试前景色、背景色的设定效果测试前景色、背景色的设定效果使用CLS清屏文本窗口加框l加框的窗口使信息显示更清楚加框的窗口使信息显示更清楚 lC C无现成的画文本框库函数无现成的画文本框库函数l使用使用ASCIIASCII中划线字符画框中划线字符画框l例例4 4 单线框、双线框窗口
13、单线框、双线框窗口移动文本窗口l一个文本窗口可以被整个移到另一个位置,一个文本窗口可以被整个移到另一个位置,消失,再出现,而不影响原来在屏幕上显示消失,再出现,而不影响原来在屏幕上显示的信息。这被称为弹出式窗口设计的信息。这被称为弹出式窗口设计lintint gettext(intgettext(int left,left,intint top,top,intint righrrighr,intint bottom,bottom,void*void*bufbuf)将屏幕上指定矩形区域内容的文本信息存入指针将屏幕上指定矩形区域内容的文本信息存入指针 bufbuf 指向的内存空间,内存块的字节大小
14、为指向的内存空间,内存块的字节大小为“行行数数*列数列数*2”2”,其中行数,其中行数=bottonbotton-top+1,-top+1,列数列数=righrrighr-left+1-left+1。存储时,在相邻的两个字节中,。存储时,在相邻的两个字节中,前一个字节存放字符,后一个字节存放这个字节前一个字节存放字符,后一个字节存放这个字节的屏幕属性。的屏幕属性。移动文本窗口lintint puttextputtext(intint left,left,intint top,top,intint right,right,intint bottom,void*bottom,void*bufbuf
15、)将用将用gettextgettext 函数存入内存函数存入内存bufbuf中的文本拷贝到屏中的文本拷贝到屏幕指定的位置上。幕指定的位置上。lintint movetextmovetext(intint left,intleft,int top,top,intint right,intright,int bottom,bottom,intint destleft,intdestleft,int desttopdesttop)将屏幕左上角为将屏幕左上角为(left,topleft,top),右下角为,右下角为 (right(right,bottom),bottom)的一矩形区域内的文本内容复制到
16、左上的一矩形区域内的文本内容复制到左上角为角为(destleft,desttopdestleft,desttop)的新位置上。的新位置上。lgettext,puttext,movetextgettext,puttext,movetext 这三个函数的坐这三个函数的坐标是相对于整个屏幕而言的。标是相对于整个屏幕而言的。l例例5 5 移动文字窗口移动文字窗口3.bioskey函数l控制键、功能键和组合键按键捕获控制键、功能键和组合键按键捕获lbioskeybioskey函数的头文件函数的头文件 lbioskeybioskey函数的格式函数的格式 intint bioskey(intbioskey(
17、int cmdcmd)lcmdcmd=0=0:返回按键值,返回按键值,16bit16bit,2 2字节字节低低8 8位非位非0 0,则为,则为ASCIIASCII码码低低8 8位为位为0 0,则高,则高8 8位值为控制键、组合键位值为控制键、组合键键值,为对应键的扩充码键值,为对应键的扩充码bioskey函数lcmdcmd=1=1,返回是否按键,返回是否按键0 0,没有键按下,没有键按下非非0 0值,有按键,将键值存放到缓冲区供值,有按键,将键值存放到缓冲区供cmdcmd=0=0的调用读取的调用读取lcmdcmd=2=2,返回返回控制键状态控制键状态,该状态字以,该状态字以编码方式放在返回值的
18、低编码方式放在返回值的低8 8位字节中。位字节中。如果某一位为如果某一位为1 1,则表示该位代表的键,则表示该位代表的键盘被按下。盘被按下。l例例6 6 键盘按键代码测试键盘按键代码测试注意测试注意测试ESCESC、上下箭头、大小写字符、上下箭头、大小写字符、数字、数字、Alt+xAlt+x等键值等键值4.下拉菜单程序设计l例例7 7 下拉菜单模型下拉菜单模型画边线框画边线框显示菜单项并初始定位到第一个菜单项显示菜单项并初始定位到第一个菜单项循环检测上下箭头、回车按键循环检测上下箭头、回车按键恢复正常显示当前菜单项恢复正常显示当前菜单项改变颜色显示新的当前位置菜单项改变颜色显示新的当前位置菜单
19、项选择条顶选择条顶/底的判断底的判断l注意体会注意体会线框、表格等是线框、表格等是“画画”出来的出来的屏幕界面是屏幕界面是“设计设计”、“做做”出来的,犹如出来的,犹如衣服衣服5.扩充设计要求l带主菜单的多组下拉菜单带主菜单的多组下拉菜单能按左、右键移动选择主菜单能按左、右键移动选择主菜单l增加主菜单、子菜单项的快捷键增加主菜单、子菜单项的快捷键l记住每个组的当前选择项,出现时定位记住每个组的当前选择项,出现时定位到该项到该项用一个数组或磁盘文件实现用一个数组或磁盘文件实现l实现实现3-53-5个功能个功能注意体验窗口、菜单、按键、屏幕缓冲、数注意体验窗口、菜单、按键、屏幕缓冲、数据结构的应用
20、,使最终的程序接近实际应用据结构的应用,使最终的程序接近实际应用指导教师联系方式l教师:唐远新教师:唐远新l办公室:新主楼办公室:新主楼E1503E1503或或G809G809l办公电话:办公电话:8639064886390648l手机:手机:1504580354315045803543l邮箱:邮箱:com发邮件后电话或短信通知发邮件后电话或短信通知l答疑时间:每周五答疑时间:每周五12:3012:30建议小组讨论分享学习心得、共同提高建议小组讨论分享学习心得、共同提高l提交总结报告时间提交总结报告时间四级考试后的第一个周五四级考试后的第一个周五例1#include main()window(
21、21,7,60,16);clrscr();gotoxy(14,5);cprintf(Welcome to use the window!);window(1,1,80,25);例2#include main()int i;window(21,7,60,16);textbackground(BLUE);textcolor(14);clrscr();for(i=0;i15;i+)cprintf(Welcome!n);window(1,1,80,25);例3#includemain()int i,j;char*c=BLACK,BLUE,GREEN,CYAN,RED,MAGENTA,BROWN,LIG
22、HTGRAY;window(20,5,60,15);for(i=0;i8;i+)textbackground(i);for(j=0;j8;j+)if(j!=i)textcolor(j);clrscr();gotoxy(5,5);cprintf(The background color is%s and the text color is%s n,ci,cj);getch();window(1,1,80,25);例4#include#include main()int i;textbackground(YELLOW);textcolor(BLACK);gotoxy(10,2);putch(0 x
23、da);/*左上角左上角*/for(i=1;i30;i+)putch(0 xc4);/*单横线单横线*/putch(0 xbf);/*右上角右上角*/for(i=3;i9;i+)gotoxy(10,i);putch(0 xb3);/*单竖线单竖线*/gotoxy(40,i);putch(0 xb3);gotoxy(10,9);putch(0 xc0);/*左下角左下角*/for(i=1;i30;i+)putch(0 xc4);/*单横线单横线*/putch(0 xd9);/*右下角右下角*/window(11,3,39,8);clrscr();cprintf(this is a single
24、line bold of window n);window(1,1,80,25);textbackground(BLUE);textcolor(CYAN);gotoxy(59,12);putch(0 xc9);for(i=1;i11;i+)putch(0 xcd);putch(0 xbb);for(i=13;i22;i+)gotoxy(59,i);putch(0 xba);gotoxy(70,i);putch(0 xba);gotoxy(59,22);putch(0 xc8);for(i=1;i11;i+)putch(0 xcd);putch(0 xbc);window(60,13,69,21
25、);clrscr();cprintf(this is a double line bold of window n);window(1,1,80,25);例5#include conio.hmain()int i;char*c=BLACK,BLUE,GREEN,CYAN,RED,MAGENTA,BROWN,LIGHTGRAY;char*buf 14*9*2;textbackground(BLUE);textcolor(YELLOW);clrscr();window(10,2,24,11);textbackground(RED);textcolor(YELLOW);clrscr();for(i=
26、1;i9;i+)gotoxy(3,i+1);cprintf(%s,ci-1);gettext(10,2,24,11,buf);movetext(10,2,24,11,30,2);puttext(50,2,64,11,buf);getch();例6#include main()union star char s2;int number;key_num;do key_num.number=bioskey(0);printf(%d%dn,key_num.s0,key_num.s1);while(1);例7#include#include main()int i,key=0;char*f =Load
27、F3,Pick Alt_F3,New ,Save F2,Write to,Directory,Change dir,Os shell,Quit Alt_X,;textbackground(BLUE);textcolor(YELLOW);gotoxy(10,2);putch(0 xda);for(i=1;i15;i+)putch(0 xc4);putch(0 xbf);for(i=3;i 15;i+)gotoxy(10,i);putch(0 xb3);gotoxy(25,i);putch(0 xb3);gotoxy(10,12);putch(0 xc0);for(i=1;i 15;i+)putch(0 xc4);putch(0 xd9);window(11,3,25,11);for(i=0;i 8;gotoxy(1,i+1);textbackground(BLUE);cprintf(%s,fi);if(key=72)i=i=0?8:i-1;if(key=80)i=i=8?0:i+1;gotoxy(1,i+1);textbackground(MAGENTA);cprintf(%s,fi);window(1,1,80,25);
限制150内