第3章高级编程技术的实现

上传人:鲁** 文档编号:568300125 上传时间:2024-07-24 格式:PPT 页数:150 大小:938.50KB
返回 下载 相关 举报
第3章高级编程技术的实现_第1页
第1页 / 共150页
第3章高级编程技术的实现_第2页
第2页 / 共150页
第3章高级编程技术的实现_第3页
第3页 / 共150页
第3章高级编程技术的实现_第4页
第4页 / 共150页
第3章高级编程技术的实现_第5页
第5页 / 共150页
点击查看更多>>
资源描述

《第3章高级编程技术的实现》由会员分享,可在线阅读,更多相关《第3章高级编程技术的实现(150页珍藏版)》请在金锄头文库上搜索。

1、 第第3 3章章 高级编程技术的实现高级编程技术的实现 主要内容主要内容操作手段显示方式图形绘制技术图像技术动画技术发声技术汉字显示技术精确的时间控制技术1尸征讲思篡协卒集锡姚枕坷葬蚁螟慎赋隐弹岛妹视醒观嘱呢放神拓拜匠胁第3章高级编程技术的实现第3章高级编程技术的实现第第3 3章章 高级编程技术的实现高级编程技术的实现操作手段:键盘操作手段:键盘在键盘内有一个微处理器,用来扫描和检测每个键的按下和抬起状态,然后以程序中断(INT9H)的方式与主机通信,向主机传送一个字节的按键扫描码。接着ROM中BIOS内的键盘中断处理程序,将按键扫描码翻译成对应的ASCII码或扩充的ASCII码,存放在AX寄

2、存器中。它不是它不是ASCIIASCII码;其码;其0606位标识位标识了每个键在键盘上的位置,最了每个键在键盘上的位置,最高位为高位为0 0对应该键是被按下;对应该键是被按下;1 1对应松开;它并不能区别大小对应松开;它并不能区别大小写字母,而且一些特殊键不产写字母,而且一些特殊键不产生扫描码直接引起中断调用生扫描码直接引起中断调用 键名AHAL字符键ASCII码ASCII码功能键/组合键扩充码的ASCII码0原理原理2遵贞钥百奄浦碉呐炼呢隶添掐赫敌占仆砌翘梯怎呜学迢曹帆说硒帆个菜驴第3章高级编程技术的实现第3章高级编程技术的实现第第3 3章章 高级编程技术的实现高级编程技术的实现操作手段:

3、键盘操作手段:键盘方法方法方法一:直接使用声明在bios.h中的库函数bioskey();方法二:通过库函数int86(),调用BIOS的INT 16H、功能 号为0的中断。它将按键的扫描码存放在AH寄存器 中;方法三:简单地利用声明在conio.h中的库函数kbhit()。3使班毁淆捏擞画滋涣醚碱攘疼屯轨扑辽灾菠赏训庆哦丧垫蠕助梆蛇洲揖湾第3章高级编程技术的实现第3章高级编程技术的实现第第3 3章章 高级编程技术的实现高级编程技术的实现操作手段:键盘操作手段:键盘方法一方法一int bioskey(int cmd)int bioskey(int cmd);/*/*参数cmd用来确定函数如何操

4、作*/cmd=0bioskey()返回按健的键值,该值是2个字节的整型数。若没有键按下,则该函数一直等待若没有键按下,则该函数一直等待,直到有键按下。当按下时,若返回值的低8位为非零,则表示为普通键,其值代表该键的ASCII码。若返回值的低8位为0,则高8位表示为扩展的ASCII码,表示按下的是特殊功能键4级打溉栏挞拴诡形邹叫佛猛括郧颤茄民媒撮雁济苞壶穷淹什侄潘哇卢蘑锋第3章高级编程技术的实现第3章高级编程技术的实现第第3 3章章 高级编程技术的实现高级编程技术的实现操作手段:键盘操作手段:键盘方法一方法一int bioskey(int cmd)int bioskey(int cmd);/*/

5、*参数cmd用来确定函数如何操作*/cmd=1bioskey()查询是否有键按下。若返回非0值,则表示有键按下,若为0表示没键按下。5腊扰窖敬衍缝延竿茅瀑既鸥激菩笺附饭奴即美此嚼辨却例汕伦窿让臣烛迎第3章高级编程技术的实现第3章高级编程技术的实现第第3 3章章 高级编程技术的实现高级编程技术的实现操作手段:键盘操作手段:键盘方法一方法一int bioskey(int cmd)int bioskey(int cmd);/*/*参数cmd用来确定函数如何操作*/cmd=2bioskey()将返回一些控制键是否被按过,按过的状态由该函数返回的低8位的各位值来表示:字节位对应的16进制数含义00x01

6、右边的shift键被按下10x02左边的shift键被按下20x04Ctrl键被按下30x08Alt键被按下40x10ScrollLock已打开50x20NumLock已打开60x40CapsLock已打开70x80Insert已打开6留蓉癌痘堑民炒刚亮晨搽亿延铭荡糠瞥援耽缚衙卸匙郧堆亿现曹薄翁瘸的第3章高级编程技术的实现第3章高级编程技术的实现第第3 3章章 高级编程技术的实现高级编程技术的实现操作手段:键盘操作手段:键盘方法二方法二/*读键函数,返回扫描码*/intgetKeySCode()unionREGSrg;rg.h.ah=0;int86(0x16,&rg,&rg);returnrg

7、.h.ah; 7键盘扫描码表见课程主页键盘扫描码表见课程主页迅惑姬燎佃勉舟鸥权汹介漫岛船虹誊甘款护畅乘拢猜是滦岩坑抱辖违志杜第3章高级编程技术的实现第3章高级编程技术的实现第第3 3章章 高级编程技术的实现高级编程技术的实现操作手段:键盘操作手段:键盘方法三方法三int kbhit(void); 若按了键盘,该函数返回值1,否则返回值0。8瘪糜搞肿揍鹏皇蚤肉淑硬灌坷秉沪甸绩壮椰烽殴培隘瘟奎粮是灭软掉省击第3章高级编程技术的实现第3章高级编程技术的实现第第3 3章章 高级编程技术的实现高级编程技术的实现操作手段:鼠标操作手段:鼠标DOS操作系统和TurboC2.0并不支持鼠标器的操作。要操纵鼠标

8、器,首先必须安装相应的鼠标驱动程序。鼠标驱动程序由生产鼠标的厂家提供,它提供了许多鼠标操作的功能。这些功能可以通过INT 33H鼠标中断调用来使用。原理原理9氰堑零晕聂杠芍烁柒蔷润歹钱钎谆从舟撤圃脏产丸夫袱掉近例笺舍山打么第3章高级编程技术的实现第3章高级编程技术的实现第第3 3章章 高级编程技术的实现高级编程技术的实现操作手段:鼠标操作手段:鼠标常用功能常用功能/*显示鼠标器光标*/voidcursorOn()unionREGSr;structSREGSs;r.x.ax1;/*1号鼠标器功能:显示鼠标光标*/msvisibleTRUE;int86x(0x33,&r,&r,&s);10相盛檬刷

9、霄哼德体照元汁待寄求再撇掠孜覆柒妇废蛙苹遵驹制馆凄双央吵第3章高级编程技术的实现第3章高级编程技术的实现第第3 3章章 高级编程技术的实现高级编程技术的实现/*关闭鼠标器光标*/void cursorOff() union REGS r; struct SREGS s; r.x.ax2; /* 2号鼠标器功能 :不显示鼠标光标 */ msvisibleFALSE; int86x(0x33,&r,&r,&s);操作手段:鼠标操作手段:鼠标常用功能常用功能11溅纲坎溺按舆舟横芯浴耿功祭忠檬胰庚多利噪口喷闹锁俐灰萤掷旬互哈赫第3章高级编程技术的实现第3章高级编程技术的实现第第3 3章章 高级编程技术

10、的实现高级编程技术的实现/*设定鼠标光标的初始位置*/void cursorXY(unsigned int x, unsigned int y) union REGS r; struct SREG s; r.x.ax=4; /* 4号鼠标器功能:设置鼠标光标位置 */ r.x.cx=x; /* 设定光标x坐标*/ r.x.dx=y; /* 设定光标y坐标*/ int86x(0x33,&r,&r,&s); mousex=x; mousey=y; 操作手段:鼠标操作手段:鼠标常用功能常用功能12就咙伦厚阔溶挛棋嗓聪独默绊押黍婆烬郡典吗褪甸吕伊侵啦予溃湛洲威酚第3章高级编程技术的实现第3章高级编程技

11、术的实现第第3 3章章 高级编程技术的实现高级编程技术的实现/*报告鼠标器当前光标位置和当前按键状态*/voidmouseRead()unionREGSrl,r2;structSREGSs;r1.x.ax=3;/*3号鼠标器功能:取按钮状态和鼠标位置*/int86x(0x33,&r1,r2,&s);mousex=r2.x.cx;/*鼠标器光标x方向坐标*/mousey=r2.x.dx;/*鼠标器光标y方向坐标*/mousekey=r2.x.bx; /*鼠标器按健状态*/操作手段:鼠标操作手段:鼠标常用功能常用功能13品晃骋萨歉武哥殊窒霜旅秘悄踌戊存贺付材骇治容邹谐使谭缉巢歪糟领蛾第3章高级编程

12、技术的实现第3章高级编程技术的实现第第3 3章章 高级编程技术的实现高级编程技术的实现/*等待鼠标器的某种状态*/void wait(int i) do mouseread(); while(mousekey=i);操作手段:鼠标操作手段:鼠标常用功能常用功能14担论湃芍冠谍勿囚企迪瞅腊膜妹抡砂碱柠赋烁拳扳知栗尝墩蔬撕冉聪栈赤第3章高级编程技术的实现第3章高级编程技术的实现第第3 3章章 高级编程技术的实现高级编程技术的实现主要内容主要内容操作手段显示方式图形绘制技术图像技术动画技术发声技术汉字显示技术精确的时间控制技术15作束捷事隔欲忆盖蓉核卡妮刀诀巢剂崩听料潘诫介箱吏斥恿拜乎垄犀绘孩第3章

13、高级编程技术的实现第3章高级编程技术的实现第第3 3章章 高级编程技术的实现高级编程技术的实现显示方式:显示系统显示方式:显示系统显卡在计算机主机和显示器之间起到了信息转换和视频发送作用,必须与显示器配套。不同种类的显卡支持的显示模式种类不同,而且同一显卡一般可以支持多种显示模式。一种显示模式指定了相应显示器的工作方式、分辨率和颜色数目。 显显 卡卡16怯昭椎撰鳖促湾胰刑哑键脚差那松顿趴犯硝玉惕徊胚峰睹柬则腾吩卤讨磊第3章高级编程技术的实现第3章高级编程技术的实现第第3 3章章 高级编程技术的实现高级编程技术的实现显示方式:显示系统显示方式:显示系统 常见显卡及其模式常见显卡及其模式17市称炮

14、慎驱嗽睡移呻豪盗剔蓉卜零诞洁牛顷吩湍棍矾榨甩碰缉镁腥销魄抿第3章高级编程技术的实现第3章高级编程技术的实现第第3 3章章 高级编程技术的实现高级编程技术的实现显示方式:显示系统显示方式:显示系统 显示器工作方式显示器工作方式显示器有两种工作方式,即文本显示方式和图形显示方式,它们的主要差别是显示存储器(VRAM)中存的信息不同。文本方式时,VRAM存放要显示字符的ASCII码,用它作为地址,取出字符发生器ROM中存放的相应字符的图像变成视频信号在显示器屏幕上进行显示。图形方式时,则要显示的图形的图像直接存在VRAM中,VRAM中某地址单元存放的数就表示了相应屏幕上某行和列上的像素及颜色。18言

15、羹深序肉如搓绿省排抖蟹返贡胺捉用草狰莉哼价面涪湛辉药粟忘星擒颐第3章高级编程技术的实现第3章高级编程技术的实现第第3 3章章 高级编程技术的实现高级编程技术的实现显示方式:显示方式:也称作字符显示方式,是TurboC确省的显示方式。文本方式屏幕的最大分辨单位是单个字符,字符显示的位置用行和列坐标来表示。文本方式文本方式19袒益田腻青敌猿嗡按膏账蚂仕喳怠黑轩源犹棘兄植植艘嘎颗啦栏薛补哉亲第3章高级编程技术的实现第3章高级编程技术的实现第第3 3章章 高级编程技术的实现高级编程技术的实现显示方式:文本方式显示方式:文本方式方式设定方式设定TurboC支持的几种文本显示方式可以用下面的函数来设置:

16、void textmode(int newmode);。20姥它辉圃元幽煤盐文烷若港胚款昆犯帜鲜缅亨橡镁激握缸糜蓄盅绩邻剁叼第3章高级编程技术的实现第3章高级编程技术的实现第第3 3章章 高级编程技术的实现高级编程技术的实现显示方式:文本方式显示方式:文本方式颜色设置颜色设置void textbackground(int color);/*设置字符背景颜色*/void textcolor(int color); /*设置字符颜色*/void textattr(int attr);/*/*可同时设置文本的字符和背景颜色*/ 颜色函数颜色函数21攒廓闷祝揣卒栗枷禹阮妻怜篮慈惠模誊类蛇稠峭梨写慈矽搪

17、悼桓饭说蛔屯第3章高级编程技术的实现第3章高级编程技术的实现第第3 3章章 高级编程技术的实现高级编程技术的实现显示方式:文本方式显示方式:文本方式窗口设置窗口设置Turbo C确省定义的文本窗口为整个屏幕。用户可以通过函数: void window(int left, int top, int right, int bottom);定义屏幕上的一个矩形域作为窗口窗口。参数(left,top)是窗口左上角所在的屏幕坐标,(right,bottom)是窗口的右下角所在的屏幕坐标。窗口定义之后,用有关窗口的输入输出函数就可以只在此窗口内进行操作而不超出窗口的边界。另外,一个屏幕可以定义多个窗口,但

18、现行窗口只能有一个。 22泣查幂叶碗龚光酱躲柿寨幽疆媚最泞贴否盗宅澄嚷炒跋瘴仓云湃翅亮断跪第3章高级编程技术的实现第3章高级编程技术的实现第第3 3章章 高级编程技术的实现高级编程技术的实现显示方式:文本方式显示方式:文本方式窗口操作窗口操作窗口内文本输出函数:窗口内文本输出函数: int cprintf(char *format,表达式表,表达式表); int cputs(char *str); int putch(int ch);/*这三个函数受窗口的控制,窗口内显示光标的位置就是它们开始输出的位置。当输出行超过窗口右边界或输出到窗口底部边界时,会自动转到窗口内的下一行输出或自动上卷窗口内

19、的内容继续输出*/光标操作函数:光标操作函数: void gotoxy(int x, int y); /*把光标移到窗口把光标移到窗口(x,y)处处*/23沟炯耐岔嫌菏乓滑叠料悬晨胯翁宰肿圭大义炙栏吓氮又澜腐茬埠丹予藤猿第3章高级编程技术的实现第3章高级编程技术的实现第第3 3章章 高级编程技术的实现高级编程技术的实现显示方式:文本方式显示方式:文本方式屏幕操作屏幕操作 清屏函数:清屏函数: void clrscr(void); /*清除窗口文本,光标移到清除窗口文本,光标移到(1,1)*/ void clreol(void); /*清除窗口从光标位置开始到本行清除窗口从光标位置开始到本行 结

20、尾的所有字符,但光标不变结尾的所有字符,但光标不变 */ void delline(void); /*删除当前窗口的当前行删除当前窗口的当前行*/24漆戈狼呵褒舱躲芳映操卷盼孙晚械晤劫兴营二表郸讼慈掩有沤宴朵持侍庆第3章高级编程技术的实现第3章高级编程技术的实现第第3 3章章 高级编程技术的实现高级编程技术的实现显示方式:文本方式显示方式:文本方式屏幕操作屏幕操作 屏幕文本移动函数:屏幕文本移动函数: void movetext(int x1, int y1, int x2, int y2, int x3, int y3);屏幕文本存取函数屏幕文本存取函数void gettext(int x1

21、, int y1, int x2, int y2, void *buffer);void puttext(int x1, int y1, int x2, int y2, void *buffer); 25垢钢渔筷抱普颂胁涂值礁互惜槐柏阶箍焉挥奴釜峦秃册增牙妹谬直享链嗡第3章高级编程技术的实现第3章高级编程技术的实现第第3 3章章 高级编程技术的实现高级编程技术的实现显示方式:文本方式显示方式:文本方式编制一个程序,将屏幕垂直平分成两个窗口,左边窗口为蓝色背景,白色前景,右边窗口为绿色背景,红色前景。两个窗口都设计为文本输入,即在窗口中可以输入文字,在窗口屏幕中显示出来。使用tab键在左右两个窗

22、口中切换,每个窗口都有光标,活动窗口光标进行闪烁。 应应用用实实例例 问题描述问题描述26威悸擅猿像岸享夹摆憨威瞅绎陋弯省健玩浙痹败跑靖腐一酗锗体蕴撵造搂第3章高级编程技术的实现第3章高级编程技术的实现第第3 3章章 高级编程技术的实现高级编程技术的实现显示方式:文本方式显示方式:文本方式首先用文本窗口函数window (int x1, int y1, int x2, int y2)画出两个窗口,用textcolor (int color),textbackground (int color),clrscr (void)等进行窗口属性的设置。用tabtab键键进行两个窗口间的循环切换,在每次切

23、换前先调用gettext (int left, int top, int right, int bottom, void * buf)函数把当前矩形窗口上的字符拷贝到由buf所指向的内存中,在切换到另一个窗口后调用puttext (int left, int top, int right, int bottom, void * buf)把先前存储在该窗口buf所指向的内存中的字符拷贝到当前窗口中,并用gotoxy (int x, int y)把光标移到原先所在位置,因此可以接着先前的文本继续编辑。 应应用用实实例例 设计思想设计思想27服雨仓萍其倡滤馁煽顾燥厕虎严阜沙吠撩旧臣脱憾秦核瞩蹲啤睹辗

24、忙艇晨第3章高级编程技术的实现第3章高级编程技术的实现第第3 3章章 高级编程技术的实现高级编程技术的实现显示方式:文本方式显示方式:文本方式应应用用实实例例 程序运行截图程序运行截图28初正碍勾郭颓祁层湍沤肠杀姬阔郑七六夺始另墅桔荤鞋烽济抨耿鸿竖坍捍第3章高级编程技术的实现第3章高级编程技术的实现第第3 3章章 高级编程技术的实现高级编程技术的实现显示方式:显示方式:图形方式图形方式图形显示方式可以满足在屏幕上作图的要求。在此方式下,屏幕显示的单位是像素。屏幕显示的像素大小(分辨率)可以通过设置不同的显示方式来改变。像素在屏幕上的位置可由其所在的x,y坐标来决定。此时,屏幕的坐标系统就象一个

25、倒置的直角坐标系。29喀棕誓彼珍诗挞又航毡坛递汰栗韧逞汰沟尾领恬理淡桓要饲抚贸绽杂织烟第3章高级编程技术的实现第3章高级编程技术的实现第第3 3章章 高级编程技术的实现高级编程技术的实现显示方式:图形方式显示方式:图形方式方式设定方式设定图形系统的初始化:图形系统的初始化:用什么类型的显卡的驱动程序采用什么模式的图形方式适配器驱动程序的寻找路径名。注意:所用系统的卡一定要支持所选用的显示模式,否则将出错。30拳镭相楔噎埋慰闹驯币厢架桑簧瑚阎柄服蹄虏悔屁容临辛岁到锁验昼棵续第3章高级编程技术的实现第3章高级编程技术的实现第第3 3章章 高级编程技术的实现高级编程技术的实现显示方式:图形方式显示方

26、式:图形方式方式设定方式设定图形系统的初始化函数:图形系统的初始化函数:void far initgraph(int far *pdriver,int far *pmode,char far *ppath_for_driver);enumgraphics_driver DETECT,CGA,MCGA,EGA,EGA64,EGAMONO,IBM8514,HERCMONO,ATT400,VGA,PC3270;31霍许笛噎田贡刀剥柔洒恭龄焊耳毋哮羡箱汹陆谜布承胸嘻躲昔痰陋鹏锦尽第3章高级编程技术的实现第3章高级编程技术的实现第第3 3章章 高级编程技术的实现高级编程技术的实现显示方式:图形方式显示方

27、式:图形方式方式设定方式设定图形系统的初始化函数:图形系统的初始化函数:void far initgraph(int far *pdriver,int far *pmode,char far *ppath_for_driver);32苯拘两二附吝篆砷林鸽譬饿灾轰沧重阀宏稻端席盟楼咕麻陵俗龙堤求彼哲第3章高级编程技术的实现第3章高级编程技术的实现第第3 3章章 高级编程技术的实现高级编程技术的实现显示方式:图形方式显示方式:图形方式方式设定方式设定图形系统检测函数图形系统检测函数 :void far detectgraph(int far *pdriver,int far *pmode);完成对

28、适配器的检查并得到显示器类型号和相应的最高分辨率模式 将graphdriver设成DETECT, initgraph()将调用detectgraph()自动检测所用显卡类型,并将相应的驱动程序装入,并将其最高的显示模式作为当前显示模式。int graphdriver=DETECT,graphmode;initgraph(&graphdriver,&graphmode,);33斤螟玉森犁扒卿买晋杭当淤染蔬毯览蛤篡平临稻菌皮厩颁浓奋冒阵甲耕喇第3章高级编程技术的实现第3章高级编程技术的实现第第3 3章章 高级编程技术的实现高级编程技术的实现显示方式:图形方式显示方式:图形方式方式设定方式设定清屏函

29、数:清屏函数:画图前一般需清除屏幕,使得屏幕如同一张白纸,以画最新最美的图画。void far cleardevice(void); 图形系统的关闭:图形系统的关闭:当画图结束时可以通过调用关闭图形系统的函数: void far closegraph(void); 使显示器恢复到调用initgraph()函数之前的文本方式。34竭峰阮激霓俄喧必址省屠底绝酸醉勘源弱臆喜老圃绵浸唁塞记俐刨距第边第3章高级编程技术的实现第3章高级编程技术的实现第第3 3章章 高级编程技术的实现高级编程技术的实现显示方式:图形方式显示方式:图形方式颜色设置颜色设置前景色设置函数:前景色设置函数:void far se

30、tcolor(int color); 背景色设置函数:背景色设置函数:void far setbkcolor(int color);35糊在浆涂镣欠县瘁氢鸦股倚雄竟含膘卖恍捂输谆酿斜根绵呈舞溜辞秀瓮部第3章高级编程技术的实现第3章高级编程技术的实现第第3 3章章 高级编程技术的实现高级编程技术的实现显示方式:图形方式显示方式:图形方式颜色设置颜色设置前景色设置函数:前景色设置函数:void far setcolor(int color); 背景色设置函数:背景色设置函数:void far setbkcolor(int color);36狸萧毁择杯圾裕塑廊呜壁扁绿棵喳盅钩坤靠甚畏儡孪摘捅焕掏豁通

31、琉冈乍第3章高级编程技术的实现第3章高级编程技术的实现第第3 3章章 高级编程技术的实现高级编程技术的实现显示方式:图形方式显示方式:图形方式颜色设置颜色设置CGA前景色的取值:前景色的取值:37烽算禽龚向嘘非果呕社售虚于季造说祭骡械猫沾骑裳瓤烟鉴圆勒主旋谨伏第3章高级编程技术的实现第3章高级编程技术的实现第第3 3章章 高级编程技术的实现高级编程技术的实现显示方式:图形方式显示方式:图形方式颜色设置颜色设置CGA背景色的取值:背景色的取值:38焚埋钟毒险刑颤茨作率苗辑挣腕佬廷必圣辫窘件德岿命腥桌骆蒙焕驭泻踊第3章高级编程技术的实现第3章高级编程技术的实现第第3 3章章 高级编程技术的实现高级

32、编程技术的实现显示方式:图形方式显示方式:图形方式颜色设置颜色设置EGA/VGA调色板:调色板:setcolor(color)时color的取值;0号索引位置的颜色总是和背景色相同;16个索引号意味着同时最多可显示16种不同的颜色64/256色选一39嘘镣建椒劝迪鳃牺黎除呐苹吹豌丫盲打咆蘑叔崇渭赛欣趋丧扶稳腐惊桔兰第3章高级编程技术的实现第3章高级编程技术的实现第第3 3章章 高级编程技术的实现高级编程技术的实现显示方式:图形方式显示方式:图形方式颜色设置颜色设置EGA/VGA调色板:调色板:整体设置:void far setallpalette(struct palettetype far

33、*palette);#defineMAXCOLORSl5structpalattetypeunsignedcharsize;signedcharcolorsMAXCOLORS+1;;单色设置:单色设置:voidfar setpalette(int index, int actual_color);40湿挎蜡闷绰予珊谁壳钓仕殉抄玖稍刻教刃迁杖婪诊啊销梅眺孟鹊捍苫席握第3章高级编程技术的实现第3章高级编程技术的实现第第3 3章章 高级编程技术的实现高级编程技术的实现显示方式:图形方式显示方式:图形方式颜色设置颜色设置EGA/VGA标准色:标准色:41稚辣砂啪勉蒙摹藩饺仪淹竹亚鼓凛珊媚幼琴冀似岭妆坦

34、霸彰宦涛抡椒员语第3章高级编程技术的实现第3章高级编程技术的实现第第3 3章章 高级编程技术的实现高级编程技术的实现显示方式:图形方式显示方式:图形方式图视口图视口设置函数设置函数:void far setviewport(int xl,int y1,int x2,int y2, clipflag); 其中(x1,y1)为图视口的左上角所在的原屏幕物理坐标,(x2,y2)为右下角所在的原屏幕物理坐标。clipflag参数clipflag若为0,则超出图视口的图形部分仍将显示出来;否则,超出图视口的部分将被切除而不显示。清除函数:清除函数:void far clearviewport(void)

35、42驳脂蹿逆粗淌北疫听爵毯赚势搐害垦呢完缸等背逛苫粱诉砒玄惦癸洛猛娄第3章高级编程技术的实现第3章高级编程技术的实现第第3 3章章 高级编程技术的实现高级编程技术的实现显示方式:图形方式显示方式:图形方式文本输出文本输出当前位置文本输出函数:当前位置文本输出函数: void far outtext(char far *textstring); 定位文本输出函数:定位文本输出函数: void far outtextxy(int x,int y,char far *textstring);文本输出字符串函数文本输出字符串函数 int sprintf(char *string, char *form

36、at, argument, );43反运篓连样蜒被媚诸劫乃艘馒牌辞灾瘫派峻掩骨丑第晰僵芜凋配呐紫钮笆第3章高级编程技术的实现第3章高级编程技术的实现第第3 3章章 高级编程技术的实现高级编程技术的实现显示方式:图形方式显示方式:图形方式文本输出文本输出 文本输出位置函数:文本输出位置函数:void far settextjustify(int horiz,int vert); 44盎像挺胞奏揩绢狂敦并筛榴身渣熬巢垒荫婿富稠巳蒙踞碍靳座虚银给丹粥第3章高级编程技术的实现第3章高级编程技术的实现第第3 3章章 高级编程技术的实现高级编程技术的实现显示方式:图形方式显示方式:图形方式文本输出文本输出

37、 定义文本字型函数:定义文本字型函数: void far settextstyle(int font,int direction,int char size); 45沙啼忠焙块疹恰敬路煮之菲雪棒嘶郸摇霞誊屯川频昌佛啤迈钵滔敖因女谦第3章高级编程技术的实现第3章高级编程技术的实现第第3 3章章 高级编程技术的实现高级编程技术的实现#includemain()inti,graphdriver,graphmode,size,page;chars30;graphdriver=DETECT;initgraph(&graphdriver,&graphmode,);cleardevice();settext

38、style(DEFAULT_FONT,HORIZ_DIR,2);settextjustify(LEFT_TEXT,0);outtextxy(220,20,Defautfont);settextstyle(TRIPLEX_FONT,HORIZ_DIR,2);settextjustify(LEFT_TEXT,0);outtextxy(220,50,Triplexfont);应应用用实实例例 程序源代码程序源代码settextstyle(SMALL_FONT,HORIZ_DIR,2);settextjustify(LEFT_TEXT,0);outtextxy(220,80,Smallfont);se

39、ttextstyle(SANS_SERIF_FONT,HORIZ_DIR,2);settextjustify(LEFT_TEXT,0);outtextxy(220,110,Sansseriffont);settextstyle(GOTHIC_FONT,HORIZ_DIR,2);settextjustify(LEFT_TEXT,0);outtextxy(220,140,gothicfont);getch();closegraph();显示方式:图形方式显示方式:图形方式文本输出文本输出46审种辅妙南硝屈津盈结蟹祖患蝗务整檬浅佰韧霓恐混预帧帜絮寂硬葫惜厕第3章高级编程技术的实现第3章高级编程技术的

40、实现第第3 3章章 高级编程技术的实现高级编程技术的实现应应用用实实例例 程序输出程序输出显示方式:图形方式显示方式:图形方式文本输出文本输出47彭喇凯一篷动讶孟扛羚幼顿党硷结怂擎蓖篱娠夺样童盘岁朴冉吸熟安校震第3章高级编程技术的实现第3章高级编程技术的实现 第第3 3章章 高级编程技术的实现高级编程技术的实现主要内容主要内容操作手段显示方式图形绘制技术动画技术发声技术汉字显示技术图像技术精确的时间控制技术48枫篇俊弛融瘸痛引署抵淡鸦枝匈翁碍巍危鞘册所闸套顾闸劈用胎一道废旬第3章高级编程技术的实现第3章高级编程技术的实现第第3 3章章 高级编程技术的实现高级编程技术的实现图形绘制图形绘制voi

41、d far moveto(int x,int y);移动画笔到指定的(x,y)位置,移动过程不画。void far moverel(int dx,int dy);画笔从现行位置(x,y)处移到一位置增量处(x+dx,y+dx),移动过程不画:int far getx(void);得到当前画笔的x位置int far gety(void);得到当前画笔的y位置:画笔定位:画笔定位 49峭铃溜看纤硬割桥忻淑豫古讳毒兼贸措炼敌矮瓤肥靡靴嚏念雪赣攻铃狮预第3章高级编程技术的实现第3章高级编程技术的实现第第3 3章章 高级编程技术的实现高级编程技术的实现图形绘制图形绘制 画点函数:画点函数: void f

42、ar putpixel(int x,int y,int color);该函数表示在指定的x,y位置画一点,点的显示颜色由设置的color值决定。int far getpixel(int x,int y);该函数与putpixel()相对应,它得到在(x,y)点位置上的像素的颜色值 :点和线:点和线 50轴城苛咕驹蒂异澡耀日皋尽启砖埠猎蜡码辽事拇录舟噬掂艺侣薪建研疆供第3章高级编程技术的实现第3章高级编程技术的实现第第3 3章章 高级编程技术的实现高级编程技术的实现图形绘制:图形绘制: 点和线点和线 画线函数:画线函数:void far line(int x0,int y0,int x1,int

43、 y1);该函数从(x0,y0)点到(x1,y1)点画一直线。void far lineto(int x,int y);该函数将从现行画笔位置到(x,y)点画一直线。void far linerel(int dx,int dy); 该函数将从现行画笔位置(x,y)到位置增量处(x+dx,y+dy)画一直线。 51醋枫将际鹿并乏柄钢制吏厂奖旅钳奥帜放咙搐饺炒浑春濒魂凤实墨警甥呀第3章高级编程技术的实现第3章高级编程技术的实现第第3 3章章 高级编程技术的实现高级编程技术的实现 线类型的设置:线类型的设置:在确省的情况下,画线函数画出的线都是一个像素点宽的细实线。也可以在画线之前通过函数: voi

44、d far setlinestyle(int linestyle, unsigned upattern,int thickness); 定义线的类型和粗细。 setlinestyle(4,0xF3D0,1)设置的线型设置的线型图形绘制:图形绘制: 点和线点和线 52衡表肄母瞒炳象卧渤笺叶董厅永腮颗齐召图颗郡脊相鳞巾乘僧沥坯傣伪裳第3章高级编程技术的实现第3章高级编程技术的实现第第3 3章章 高级编程技术的实现高级编程技术的实现BIOS的10H中断负责显示器服务,该中断的主要功能通过对AH来设置:AH=00H,功能为设置显示方式。此时通过对AL进行设置来设定显示方式,如设置AL=13H,则显示方

45、式设置为VGA的256色320200图形显示模式。AH=0CH,功能为画点。这时AL中设置的值为颜色号,CX和DX的值决定画点的位置坐标。图形绘制:图形绘制: 点和线点和线 利用利用BIOS调用调用53呸俐瞻需哮硷怎剑殴诅样紊诀差废纱侩铜菏吮袄抒匈帝迁拘佛守轧散滁平第3章高级编程技术的实现第3章高级编程技术的实现第第3 3章章 高级编程技术的实现高级编程技术的实现#include#include int main() int i,j; union REGS inreg,outreg; inreg.h.ah=0; /*置屏幕显示方式*/ inreg.h.al=0x13; /* 定义VGA256色

46、320200图形模式 */ int86(0x10,&inreg,&outreg); /*调用中断0x10*/ for (i=0;i256;i+) for(j=0;j200;j+) inreg.h.ah=0x0c;/*写点*/ 应应用用实实例例在屏幕上画出颜色不同的在屏幕上画出颜色不同的256条直线的条直线的程序源代码程序源代码 inreg.h.al=i; /*置颜色号*/ inreg.h.ch=0; /*决定画点位置*/ inreg.h.cl=i; inreg.h.dh=0; inreg.h.dl=j; int86(0x10,&inreg,&outreg); getch(); inreg.h.

47、ah=0; inreg.h.al=2; /*返回到文本方式*/ int86(0x10,&inreg,&outreg); 图形绘制:图形绘制: 点和线点和线 利用利用BIOS调用调用54极莲洞溪祈涎互如纤公船霸喘腹厢长温冷盯旅己漳舶简眶篙吞繁初驻紫俭第3章高级编程技术的实现第3章高级编程技术的实现第第3 3章章 高级编程技术的实现高级编程技术的实现图形绘制图形绘制 :矩形、圆和弧线矩形、圆和弧线 画矩形的函数:画矩形的函数:void far rectangle(int xl,int y1,int x2,int y2); 画椭圆、圆和扇形图函数:画椭圆、圆和扇形图函数: void ellipse(

48、int x,int y,int stangle,int endangel, int xradius,int yradius); void far circle(int x,int y,int radius); void far arc(int x,int y,int stangle,int endangle, int radius);55玩网婶乳最叙忿名新姻率技抖晒比筷枝煽琅剐皇神世浊溃杠势兰了吻豪妥第3章高级编程技术的实现第3章高级编程技术的实现第第3 3章章 高级编程技术的实现高级编程技术的实现编写程序,使用鼠标进行如下操作:按住鼠标器的任意键并移动,十字光标将随鼠标而移动,根据按键的不同

49、采用不同的形状来画出相应的移动轨迹:当仅按下左键时用圆圈;仅按下右键时用矩形;其它按键情况用线条。 应应用用实实例例 问题描述问题描述图形绘制图形绘制56茫蝇鞍攀得娶咸娠钩摇歌抵陕欲深国帅拒买粮瞄眉掀名绪乏苗炬泳棉鹤芯第3章高级编程技术的实现第3章高级编程技术的实现第第3 3章章 高级编程技术的实现高级编程技术的实现结合鼠标使用方法和上述的图形绘制函数来解决问题。由于在Windows2000/XP下不支持INT 33的1号显示鼠标光标功能,可以用画线函数line()画出一个十字形光标。光标的移动是通过将原位置光标用背景色再画而使其消失,然后在新位置处重新画一个光标,从而实现光标移动的动感。 应

50、应用用实实例例 设计思想设计思想图形绘制图形绘制57催煎楚棵钨纳猴戏银点沙满僳彤筷遵植帆抽翼彭霍郭忙鸥峡联树该蓖悍座第3章高级编程技术的实现第3章高级编程技术的实现第第3 3章章 高级编程技术的实现高级编程技术的实现应应用用实实例例 程序运行截图程序运行截图图形绘制图形绘制58熔莽蔬订部讹宰丸掂拳综埋鸥凿团萍鸦黑虑莉斥韩诊败珊甲绅胞钝徘紊洁第3章高级编程技术的实现第3章高级编程技术的实现第第3 3章章 高级编程技术的实现高级编程技术的实现图形绘制:图形绘制:封闭图形的填色封闭图形的填色 填充设置函数填充设置函数 :void far setfillstyle(int pattern,int co

51、lor);该函数将用设定的color颜色和pattern图模式对后面画出的轮廓图进行填充,这些图轮廓是由待定函数画出的。59误败棘兼绘奔苛遭汉惩颤数患溜隐脆咀溅涯佳重剪袖旗甜断襟入涪劲释一第3章高级编程技术的实现第3章高级编程技术的实现第第3 3章章 高级编程技术的实现高级编程技术的实现图形绘制:图形绘制:封闭图形的填色封闭图形的填色 填充设置函数填充设置函数 :void far setfillstyle(int pattern,int color)60擅枕膀殷种奈髓氛洼担掩酵衷秧敖蚁蹋故乡橡坠砰粳刺央唬斤沥碧阉饱逸第3章高级编程技术的实现第3章高级编程技术的实现第第3 3章章 高级编程技术的

52、实现高级编程技术的实现图形绘制:图形绘制:封闭图形的填色封闭图形的填色 用户自定义填充函数用户自定义填充函数: void far setfillpattern(char upattefn,int color);该函数设置用户自定义可填充模式,以color指出的颜色对封闭图形进行填充。参数upattern是一个指向8个字节存储区的指针,这8个字节表示了一个88像素点阵组成的填充图模,它是由用户自定义的,用来对封闭图形填充。8个字节的图模是这样形成的:每个字节代表一行,而每个字节的每一个二进制位代表该行的对应列上的像素。是1,则用color显示,是0则不显示。 61挞无腻宵鸦闭舱答撩锥邦遏堑谰粤续

53、留猜咎斋熬乏象滞健斑弛婶殷布纪蚕第3章高级编程技术的实现第3章高级编程技术的实现第第3 3章章 高级编程技术的实现高级编程技术的实现图形绘制:图形绘制:封闭图形的填色封闭图形的填色 得到目前的填充模式和颜色的函数得到目前的填充模式和颜色的函数 : void far fillsettings(struct fillsettingstype far *fillinfo); void far getfillpattern(char *upattern) void far getfillpattern(char *upattern); 62卢当描谬莉广嫂炽壶嘱疆翼喊孟哭弦贯沁完渍扭勾亏洪厦迸陌犊壕岳糊

54、情第3章高级编程技术的实现第3章高级编程技术的实现第第3 3章章 高级编程技术的实现高级编程技术的实现图形绘制:图形绘制:封闭图形的填色封闭图形的填色 可填充的基本图形函数:可填充的基本图形函数: (这些函数绘制的图形,将根据事先用setfillstyle函数设置的填充模式和颜色,或按缺省方式进行填充 ) void bar(int x1,int y1,int x2,int y2); void far pieslice(int x,int y,int stangle,int endangle,int radius); void far bar3d(int x1,int y1,int x2,int

55、 y2,int depth,int topflag);void far sector(int x,int y,int stangle,int endang1e,int xradius,int yradius);void far fillellipse(int x,int y,int xradius,int yradius); void far fillpoly(int numpoints,int far polypoints);63炽满纳滞帜炕暂亮藻挞绕暴墓郎肄荚镣掂陆毫乐连萧累又烙褐多四练币冉第3章高级编程技术的实现第3章高级编程技术的实现第第3 3章章 高级编程技术的实现高级编程技术的实现

56、图形绘制:图形绘制:封闭图形的填色封闭图形的填色 可对任意封闭图形填充的函数可对任意封闭图形填充的函数 : void void far far floodfill(int floodfill(int x x,int int y y,int int border)border); 该函数将对任一封闭图形进行填充,其颜色和模式将由设定的或缺省的图模与颜色决定。其中参数(x,y)为封闭图形中的任一点,border是封闭图形的边框颜色。编程时该函数位于画封闭图形(即要填充的图形)的代码之后。 64诧焉蔫于旅去嘱架殃萍龟惑妓专遥俭汁铲炳传隧初肢涕察扛准不汽揣坞蜕第3章高级编程技术的实现第3章高级编程技术

57、的实现第第3 3章章 高级编程技术的实现高级编程技术的实现#includemain()inti,graphdriver,graphmode,size,page;chars30;graphdriver=DETECT;initgraph(&graphdriver,&graphmode,);cleardevice();setbkcolor(BLUE);setviewport(40,40,600,440,1);/*开图视口*/setfillstyle(1,2);setcolor(YELLOW);rectangle(0,0,560,400);floodfill(50,50,14);/*用绿色填充矩形框*

58、/rectangle(20,20,540,380);setfillstyle(1,13);floodfill(2l,300,14);/*用淡洋红色填充矩形框*/setcolor(BLACK);应应用用实实例例 程序源代码程序源代码settextstyle(1,0,6);/*设置字形方向,尺寸*/outtextxy(100,60,WelcomYou);setviewport(100,200,540,380,0);setcolor(14);setfillstyle(1,12);rectangle(20,20,420,120);settextstyle(2,0,9);floodfill(21,100

59、,14);/*用深蓝色填充*/sprintf(s,“LetsstudyTurboC”);setcolor(YELLOW);outtextxy(60,40,s);/*用黄色显示*/setcolor(1);settextstyle(4,0,3);outtextxy(110,80,s);getch();closegraph();图形绘制图形绘制65卞筹崖丘松热四猿投哀骚暂查卡婴觉草逊彬糟刚圃梯潜馋加线悬咽围盅州第3章高级编程技术的实现第3章高级编程技术的实现第第3 3章章 高级编程技术的实现高级编程技术的实现应应用用实实例例 程序输出程序输出图形绘制图形绘制66炽睛培扼冀舀穆杖反包添辞洋镭仇外区隆灰

60、膳褪竿绣峦牧予命怨曲皋鹤咸第3章高级编程技术的实现第3章高级编程技术的实现 第第3 3章章 高级编程技术的实现高级编程技术的实现主要内容主要内容操作手段显示方式图形绘制技术图像技术动画技术发声技术汉字显示技术精确的时间控制技术67漂米曾颠栖够寝谦砾崇贮港俺亮件窗书暂呼谱傅格洼树将嚎盲秘竹沏秒局第3章高级编程技术的实现第3章高级编程技术的实现第第3 3章章 高级编程技术的实现高级编程技术的实现图像技术图像技术:图像的二种来源图像的二种来源(1)屏幕图像:在图形方式下所绘图形形成的像素点图像。图像数据直接存储在VRAM中,VRAM中某地址单元存放的数就表示了相应屏幕上某行和列上的像素及其颜色值。(

61、2)图像文件:图像数据以一定的格式存储在文件中。需要有专门的软件来支持,或自己编写程序来读取、显示和生成某种格式的图像文件。首先必须要了解某种图像文件的格式。68抹阮旺已狙盆温用男撞碗售痪似捡成逸竭梆菲烘贮腻匈壮服席彦俐派禾费第3章高级编程技术的实现第3章高级编程技术的实现第第3 3章章 高级编程技术的实现高级编程技术的实现图像技术:屏幕图像与图像技术:屏幕图像与VRAM直接写屏:在图形方式下将图像数据直接写入VRAM的过程,即图像显示过程。直接写屏是最快的图像显示方法。69联蝇暗洁截政砚丛锚阔栓摄匈海荤惦攀牌砚氰倚食革鱼隐寨暴崖鲁记志孔第3章高级编程技术的实现第3章高级编程技术的实现第第3

62、3章章 高级编程技术的实现高级编程技术的实现图像技术:图像技术:VRAM与系统存储器的对应关系与系统存储器的对应关系CGA的VRAM对应的内存地址开始于B8000H,VGA、EGA的开始于A0000H。对CGA,VRAM仅有16K字节;对VGA和EGA,VRAM可达256K字节,它分成独立的4个64K字节部分,这样的每个部分称为一个位面或页面(编号0-3),它们共同占有一块内存空间,即用同一的64K个地址。相应内存的每个地址实际上代表VRAM4个位面上相并列的4个字节。 对于SVGA,由于它要存取更高分辨率或更多颜色的数据,一般都至少拥有512K以上的VRAM,但其所占用的内存地址仍大都是64

63、K,因此也需要划分许多页面,对应到A0000H或其它的视频内存地址上。70庐缕朵屉倪拱朗谬淘督玄嗡炔哲堪显胆艇肯漂寒赡堰眨汤巳定翁傀消烯缆第3章高级编程技术的实现第3章高级编程技术的实现第第3 3章章 高级编程技术的实现高级编程技术的实现图像技术:屏幕图像的允许读写过程图像技术:屏幕图像的允许读写过程允许读的过程是:首先通过索引寄存器(接口地址为0x3ce)选择读位面选择寄存器(其索引号为4),然后通过读位面选择寄存器(接口地址0x3cf)选择位面号。相应的代码为:outportb(0x3ce, 4); /*将索引号4送索引寄存器,选择读位面选择寄存器*/outportb(0x3cf, n);

64、 /*将选择的位面号n送读位面选择寄存器,允许该位面可读*/71意崩饲鹊座边灸腮忽榨履骏技四特静秃寞少郊臀涟鲍场筐腆堵游件捌投钠第3章高级编程技术的实现第3章高级编程技术的实现第第3 3章章 高级编程技术的实现高级编程技术的实现图像技术:屏幕图像的读写过程图像技术:屏幕图像的读写过程允许写的过程是:首先通过索引寄存器(接口地址为0x3c4)选择位面写允许寄存器(索引号为2),然后通过接口地址0x3c5选择位面号。相应的代码为:outportb(0x3c4, 2); /*将索引号2送索引寄存器,选择位面写允许寄存器*/outportb(0x3c5, k); /*送位面号至位面写允许寄存器,允许该

65、位面可写*/72瑞诈姨驾栖箭侄俺丰醉酉泵浚衍蛆菩祝懦盯调脓佳宾浓钻弗馆默兄甜揉槽第3章高级编程技术的实现第3章高级编程技术的实现第第3 3章章 高级编程技术的实现高级编程技术的实现图像技术:屏幕图像数据在图像技术:屏幕图像数据在VRAM中存放格式中存放格式 CGA的4色320200的模式,视频内存起始地址B0000H。屏幕上显示的像素点从左到右,从上到下依次存在VRAM从0号地址开始的连续地址中,每个像素占2位,VRAM每个字节存放四个像素点。特殊的地方:屏幕上显示的偶行像素存在16KVRAM的上半部,而奇行存在下半部。从系统地址看,上半部开始于B800:0000,下半部开始于B800:100

66、0。73差镑隧北僻巾沸酵瞄疏鸵豪娜举蓟捡搬恋在堪希冒笺站狗攫敖釉七篮辽液第3章高级编程技术的实现第3章高级编程技术的实现第第3 3章章 高级编程技术的实现高级编程技术的实现图像技术:屏幕图像数据在图像技术:屏幕图像数据在VRAM中存放格式中存放格式 VGA视频内存起始地址A0000H,在16色640480模式下采用位面对应方式,视频内存地址上每一个字节代表8个像素,每一位又可对应到位面中同样位置的4位上(4位的组合表示16色之一,因此又称位面为颜色位面)。在屏幕上绘出一个点时,就必须将数据分别存放到四个位面中对应的位上。74翁行铂企课帚暴绊忙晶酝砚硝史脯搪抖礼由韩饰掠奖奶寿吓察交色贪驴使第3章

67、高级编程技术的实现第3章高级编程技术的实现第第3 3章章 高级编程技术的实现高级编程技术的实现图像技术:屏幕图像数据在图像技术:屏幕图像数据在VRAM中存放格式中存放格式 在256色320200模式下采用的是线性对应的方法(SVGA的所有256色和真彩都是用这种方法)。线性对应将屏幕上每一点与视频内存地址按顺序一一对应起来,一个点对应一个字节,这样做的好处是:这种对应方式比位面对应方式简单多了,因为只需直接对视频内存地址做存取即可,而不必理会位面与内存地址的对应关系。 75乌旗税豫细渴敖聚砍琴娇涣迎闺桐闪谐武蠕舷随琼丽痪通虾艇帐即赵斋姐第3章高级编程技术的实现第3章高级编程技术的实现第第3 3

68、章章 高级编程技术的实现高级编程技术的实现图像技术:屏幕图像的操作图像技术:屏幕图像的操作函数名含义unsigned far imagesize(int x1,int y1,int x2,int y2);测定图像所占字节数void far getimage(int x1,int y1,int x2,int y2,void far *bitmap);屏幕图像存储void far putimage(int x1,int y1,void far *bitmap,int op);显示所存屏幕图像屏幕图像的存储和显示操作函数76去身呸总扩再臀拯姻草寄孺壕壳隙浦吏嘎惶惟超逸独甜胡耍册蓝留哦鹤硬第3章高级编

69、程技术的实现第3章高级编程技术的实现第第3 3章章 高级编程技术的实现高级编程技术的实现图像技术:图像像素与背景像素的逻辑操作图像技术:图像像素与背景像素的逻辑操作 表表3-13 3-13 操作规定值及操作操作规定值及操作符号名 值含义COPY_PUT0存储图像进行覆盖XOR_PUT1对应像素点进行异或操作OR_PUT2对应像素点进行或操作AND_PUT3对应像素点进行与操作NOT_PUT4存储图像取反后进行覆盖77帕佛鹤伺蝶票柠区仍碉乓腻谬云栽研灌错雕漆壕营炊掏悔茹隶盛烟炯式仑第3章高级编程技术的实现第3章高级编程技术的实现第第3 3章章 高级编程技术的实现高级编程技术的实现图像技术:图像技

70、术:屏幕图像操作实例绘制满屏的16色圆和长方形,并将屏幕图像保存到文件pic.dat中。然后将保存在文件pic.dat的屏幕图像重新显示在VGA屏幕上。应应用用实实例例 问题描述问题描述78郸震议湘咨频扇雀皇淳袁渤癌纵没丙呀支获妊畜妄律厩椰暗矾盛租谚汐衡第3章高级编程技术的实现第3章高级编程技术的实现第第3 3章章 高级编程技术的实现高级编程技术的实现图像技术:图像技术:屏幕图像操作实例应应用用实实例例注意事项注意事项1)VGA的VRAM起始地址为A0000H,开始单元的地址为0xA000:0x0000。2)存取对应屏幕图像VRAM中的信息时,其开始地址指针定义为:ptr=(charfar*)

71、0xa0000000L; 3)由于程序将显示模式设置为VGAHI模式,分辨率是640480,16色,每个像素由每个位面上的1位组成,即一个字节代表8个像素,故对应的内存地址是从A0000H开始的38400个字节地址。4)由于系统初始化时,读位面选择寄存器设置为位面0,程序最后应恢复原系统初始化设置。79邻坷掠稚凶盲咯拓讨忻红吾生痴瘪蹄嗓膨菠挚蹲口受弱岸钡惑累厌绦缕葵第3章高级编程技术的实现第3章高级编程技术的实现第第3 3章章 高级编程技术的实现高级编程技术的实现图像技术:图像技术:屏幕图像操作实例应应用用实实例例源程序源程序/*保存屏幕图像*/voidsave_pic(char*fname)

72、FILE*fp;inti;longj;charfar*ptr;fp=fopen(fname,wb);for(i=0;i4;i+)outportb(0x3ce,4);/*选择读位面选择寄存器*/outportb(0x3cf,i);/*允许位面i可读*/ptr=(charfar*)0xa0000000L;/*VGA的VRAM指针*/for(j=0;j38400L;j+)fputc(*ptr,fp);ptr+;fclose(fp);outport(0x3cf,0);80译缆篷裴认糕蜡炳奖齐行梨萨懊妓诣肥务腹井肆入叔糕射坊奄德苦挖寻景第3章高级编程技术的实现第3章高级编程技术的实现第第3 3章章 高级

73、编程技术的实现高级编程技术的实现图像技术:图像技术:屏幕图像操作实例应应用用实实例例源程序源程序/*从文件载入图像*/voidload_pic(char*fname)FILE*fp;inti,k=1;longj;charfar*ptr;fp=fopen(fname,rb);for(i=0;i4;i+)outportb(0x3c4,2);/*选择位面写允许寄存器*/outportb(0x3c5,k);/*选择位面号*/ptr=(charfar*)0xa0000000L;/*VGA的VRAM指针*/for(j=0;j38400L;j+)/*读满屏信息字节数*/*ptr=fgetc(fp);/*从文

74、件中将图像信息字节写到VRAM中*/ptr+;/*字节地址加1*/k=k*2;fclose(fp);getch();outport(0x3c5,0xf);/*恢复位面允许写寄存器的缺省值*/81忍柠勘惜星惩盂掺炭藤嘿宰计迷蔫家炙洞父纪斋率倪妈邱友麻樱气漱硕痞第3章高级编程技术的实现第3章高级编程技术的实现第第3 3章章 高级编程技术的实现高级编程技术的实现图像技术:图像文件图像技术:图像文件图像文件由文件头和图像数据组成。文件头的内容一般包括文件类型、文件制作者、制作时间、版本号、文件大小和压缩方式等。常见的图像格式有BMP、JPEG、GIF、TIFF等。82粗氖硫侍案石堤草珍辙谊渤漂驶墙毋魄

75、进盯煎飞么村萤尧昌货肪媒蛹改愉第3章高级编程技术的实现第3章高级编程技术的实现第第3 3章章 高级编程技术的实现高级编程技术的实现图像技术:图像技术: BMP图像文件BMP文件由4个部分组成:文件头、信息头、彩色表和图像数据文件头包含有关于文件类型、文件大小、存放位置等信息信息头包含关于这幅图像的信息,如以像素为单位的图像的宽度和高度。彩色表记录图像颜色的RGB值83满卿淡明康律或愁褐乐闺肋福榴担彭砰桶当皱女千凌避甫避志冕砒锚僳厦第3章高级编程技术的实现第3章高级编程技术的实现第第3 3章章 高级编程技术的实现高级编程技术的实现图像技术:图像技术: BMP图像文件图像的每一扫描行由表示图像像素

76、的连续的字节组成,每一行的字节数取决于图像的颜色数目和用像素表示的图像宽度。通常扫描行是由底向上存储的,就是说,阵列中的第一个字节表示位图左下角的像素,而最后一个字节表示位图右上角的像素。每一扫描行的字节数必需是4的整倍数,也就是DWORD对齐的。84溯友调栓肉暴仿顾阻骚遵曳互沙笋滨镜侩友眉钧肮慌帽胎呆揍筷陷辅幌黎第3章高级编程技术的实现第3章高级编程技术的实现第第3 3章章 高级编程技术的实现高级编程技术的实现图像技术:图像技术: BMP图像文件说明:并不是所有的BMP文件都有彩色表。若有彩色表,如8位256色的BMP图像,其图像数据的每一字节代表一个像素,但是它的值是彩色表的一个索引而不是

77、该像素的RGB值;若没有彩色表,如16位高彩色或24位真彩色文件,像素值直接表示RGB值。85虱妄质仆悸耍迂嘱仆密彤攒奄胺既绑乒犬尚负萝芹泵圆私捻伴靶釜睹晾孵第3章高级编程技术的实现第3章高级编程技术的实现第第3 3章章 高级编程技术的实现高级编程技术的实现图像技术:图像技术:BMP图像文件的格式偏移量 域的名称 大小 内容 图像文件头0000h文件标识2 bytes识别BMP图像的类型: 0002hFileSize1dword用字节表示的整个文件的大小0006hReserved1dword保留,必须设置为0000AhBitmapDataOffset1dword从文件开始到图像数据开始之间的数

78、据之间的偏移量000EhBitmapHeaderSize1dword信息头(BitmapInfoHeader)的长度,用来描述图像的颜色、压缩方法等。0012hWidth1dword图像的宽度,以像素为单位0016hHeight1dword图像的高度,以像素为单位001AhPlanes1word图像的位面数(注:该值将总是1)86筋论组害憾东平忍隧毗猿谊躬赵撅循锣捍踊阁彼抨弱睁冕授媳桩蔗爵愉躺第3章高级编程技术的实现第3章高级编程技术的实现第第3 3章章 高级编程技术的实现高级编程技术的实现图像技术:图像技术:BMP图像文件的格式偏移量域的名称大小内容图像信息头001ChBitsPerPixe

79、l1word每个像素的位数:1-单色图像4-16色图像,8-256色图像,16-16bit高彩色图像,24-24bit真彩色图像,32-32bit增强型真彩色图像001EhCompression1dword压缩说明:0-不压缩0022hBitmapDataSize1dword用字节数表示的位图数据的大小。该数必须是4的倍数0026hHResolution1dword用像素/米表示的水平分辨率002AhVResolution1dword用像素/米表示的垂直分辨率002EhColors1dword图像使用的颜色数。如8-比特/像素表示为100h或者256.0032hImportantColors1

80、dword指定重要的颜色数。当该域的值等于颜色数时(或者等于0时),表示所有颜色都一样重要87浚属逼侨冗炙嫂仿叮边抖胶双捍跃熬同孔攻营锤撰冈鸟蘑宛衰函四个得募第3章高级编程技术的实现第3章高级编程技术的实现第第3 3章章 高级编程技术的实现高级编程技术的实现图像技术:图像技术:BMP图像文件的格式偏移量域的名称大小内容调色板数据根据BMP版本的不同而不同PaletteN*4byte调色板规范。对于调色板中的每个表项,这4个字节用下述方法来描述RGB的值:每字节分别表示蓝,绿,红,填充符(设置为)。图像数据根据BMP版本及调色板尺寸的不同而不同BitmapDataxxxbytes该域的大小取决于

81、压缩方法及图像的尺寸和图像的位深度,它包含所有的图像数据字节,这些数据可能是彩色调色板的索引号,也可能是实际的RGB值,这将根据图像信息头中的位深度值来决定。88瘦桃藤传爹砌沟伯惹唆钳赦曳玉腰宙豌轮妖恩在替寐仗涧间僳萄阿颂坦槐第3章高级编程技术的实现第3章高级编程技术的实现第第3 3章章 高级编程技术的实现高级编程技术的实现图像技术:图像技术:BMP图像的显示TurboC提供的BGI图形接口的局限:只支持VGA及以前的各种图形显示模式;调色板颜色为标准的,难以改变;显示的分辨率及色彩数有限。通过对显卡的VRAM直接进行访问来突破上述局限89钻兑挝价洪作迈赶既砰史铂柞祈坚篙揭芜非甜吾脉慑搏胁痘托

82、腻违彭韵甲第3章高级编程技术的实现第3章高级编程技术的实现第第3 3章章 高级编程技术的实现高级编程技术的实现图像技术:图像技术:BMP图像的显示目前常用的图形显示模式集中在256色上,主要包括VGA320200模式SVGA高精度的640480、800600和1024768模式。同样,可以利用BIOS设置高精度的SVGA图形显示模式。SVGA利用VESA标准,就可以实现直接写屏(WindowsXP采用了VESA标准)90评渗涤货提褒席霉犹艾砒燥埃辕郁院爵浇抄趾庸皮靡众坪仗贸避漓袁僧帮第3章高级编程技术的实现第3章高级编程技术的实现第第3 3章章 高级编程技术的实现高级编程技术的实现图像技术:图

83、像技术:BMP图像的显示VESA图形标准(在图形模式下):SVGA的VRAM是顺序的链结构,且图像数据是按行顺序存放的。一个像素用一个字节(256色)表示。VRAM按字节连续寻址,与主机内存采用分页映射方式通讯,一次只能读写64KB的VRAM,通过改变段偏移量(I/O操作)来寻址不同的段。91捂弱邪剁面购倔轿布勤痔习雁蛹革涉瑰昏豫衅幢昼株河氯绷魄医账搏惑呸第3章高级编程技术的实现第3章高级编程技术的实现第第3 3章章 高级编程技术的实现高级编程技术的实现图像技术:图像技术:SVGA模式显示BMP图像实例以256色640480 SVGA模式显示BMP图像。应应用用实实例例 问题描述问题描述92次

84、避茸洽貌年膜乏谅须匣奉尹兴邹吹山晌蛙挣眩颐冤霄湖树叉翌嫉诬维彪第3章高级编程技术的实现第3章高级编程技术的实现第第3 3章章 高级编程技术的实现高级编程技术的实现图像技术:图像技术:SVGA模式显示BMP图像实例/*bmp文件头结构*/typedefstructtagBITMAPFILEHEADERintbfType;/*通常是BM。现在来看似乎判断OS/2的标识已无什么意义*/longbfSize;/*文件大小,以字节为单位*/intbfReserved1;/*保留,必须设置为0*/intbfReserved2;/*保留,必须设置为0*/longbfOffBits;/*从文件头开始到实际的图

85、象数据之间的字节的偏移量。这*/*个参数是非常有用的,因为位图信息头和调色板的长度会*/*根据不同情况而变化,可以用这个偏移值迅速的从文件中*/*读取到位数据。*/BITMAPFILEHEADER;应应用用实实例例 程序片段程序片段93不党夸茧流砧理蚤孵服按鄂令芬医典哀慧召挠鼠卯溪牢件买眨向锤沃烹窄第3章高级编程技术的实现第3章高级编程技术的实现第第3 3章章 高级编程技术的实现高级编程技术的实现图像技术:图像技术:SVGA模式显示BMP图像实例/*信息头结构*/typedefstructtagBITMAPINFOHEADERlongbiSize;/*信息头大小*/longbiWidth;/*

86、图像宽度*/longbiHeight;/*图像高度*/intbiPlanes;/*必须为1*/intbiBitCount;/*每像素位数,必须是1,4,8或24*/longbiCompression;/*压缩方法*/longbiSizeImage;/*实际图像大小,必须是4的倍数*/longbiXPelsPerMeter;/*水平方向每米像素数*/longbiYPelsPerMeter;/*垂直方向每米像素数*/longbiClrUsed;/*所用颜色数*/longbiClrImportant;/*重要的颜色数*/BITMAPINFOHEADER;应应用用实实例例 程序片段程序片段94隙温募阎

87、窟籍蹋蠢棱阁压宵簧免寅罪至秸渐帧扼霉梯丢等娥匹灰陵博袭躺第3章高级编程技术的实现第3章高级编程技术的实现第第3 3章章 高级编程技术的实现高级编程技术的实现图像技术:图像技术:SVGA模式显示BMP图像实例/*调色板*/typedefstructtagRGBQUADcharrgbBlue;/*蓝色分量*/charrgbGreen;/*绿色分量*/charrgbRed;/*红色分量*/charrgbReserved;RGBQUAD;应应用用实实例例 程序片段程序片段95适访嗽琢偷帖斡惠黄粕席减岔抵最涪鼎裙玛镭陵绰娇熙纳衅羌尚导捡廊狂第3章高级编程技术的实现第3章高级编程技术的实现第第3 3章章

88、高级编程技术的实现高级编程技术的实现图像技术:图像技术:SVGA模式显示BMP图像实例/*换页函数*/voidselectpage(registercharpage)unionREGSr;r.x.ax=0x4f05;r.x.bx=0;r.x.dx=page;/*选择页面*/int86(0x10,&r,&r);应应用用实实例例 程序片段程序片段96扳袖闸废贮住柄奇捕舱岔硫扩窗弥盯拦据膜治咕临卉虏椭铣绢铣葫伙裕扒第3章高级编程技术的实现第3章高级编程技术的实现第第3 3章章 高级编程技术的实现高级编程技术的实现图像技术:图像技术:SVGA模式显示BMP图像实例/*设置SVGA屏幕模式*/*101H

89、-256色640480模式*/*103H-256色800600模式*/*105H-256色1024768模式*/unsignedcharset_SVGA_mode(intvmode)unionREGSr;r.x.ax=0x4f02;r.x.bx=vmode;int86(0x10,&r,&r);return(r.h.ah);应应用用实实例例 程序片段程序片段97悬入趋梗鹤肩匡齐慎瘤吸手掳恐铜堑唬暇边庆介臻膜星啃伏谦娠激缴胚滑第3章高级编程技术的实现第3章高级编程技术的实现第第3 3章章 高级编程技术的实现高级编程技术的实现图像技术:图像技术:SVGA模式显示BMP图像实例/*获取当前SVGA屏幕

90、模式*/unsignedintget_SVGA_mode()unionREGSr;r.x.ax=0x4f03;int86(0x10,&r,&r);return(r.x.bx);应应用用实实例例 程序片段程序片段98转侣备吸捷啤滨踩军范召杀葵剥桨亨庙吻撬粳投声袍先嘱持楼菲没吱归砂第3章高级编程技术的实现第3章高级编程技术的实现第第3 3章章 高级编程技术的实现高级编程技术的实现图像技术:图像技术:SVGA模式显示BMP图像实例/*设置调色板*/voidset_SVGA_palette(unsignedcharr,unsignedcharg,unsignedcharb)intk;for(k=0;k

91、2);outportb(0x03C9,gk2);outportb(0x03C9,bk2);应应用用实实例例 程序片段程序片段99旷亩崔仰千勉轴设敦吧翅干饶战眉狱任戚凑痪脖智莆岭纱赞统翅拴如陀辆第3章高级编程技术的实现第3章高级编程技术的实现 第第3 3章章 高级编程技术的实现高级编程技术的实现主要内容主要内容操作手段显示方式图形绘制技术图像技术动画技术发声技术汉字显示技术精确的时间控制技术100费刺逮授汇决屉椰窄屎慷盖荔铡赵且瓦弗奎兽萍兢邪瞩刮胸影整烩卜陛淑第3章高级编程技术的实现第3章高级编程技术的实现第第3 3章章 高级编程技术的实现高级编程技术的实现动画技术动画技术在实际应用中,经常会遇

92、到要求产生动态画面的情况电影或动画片是由一张张图像组成的,利用人眼不能够分辨出时间间隔在25毫秒内的动态图像变化这一特性,当这些连续图像被放映时,从视觉效果上给人以动的感觉。101叼鼎穷望隆台也歉豫咸妄勺凸外陨撒哨渣昨记宛刁琉倡挫浸掖爱肛季播堡第3章高级编程技术的实现第3章高级编程技术的实现第第3 3章章 高级编程技术的实现高级编程技术的实现动画技术:动画技术:简单的实现方法利用cleardevice()和delay()函数相互配合,先画一幅图形,让它延迟一个时间,然后清屏,再画另一幅,如此反复,形成动态效果。102宽鹿悔湖湍条议掉份谦篡比辱吻恰解烯螺匡严评何毛簧律瞪蛮贞危恃佯厘第3章高级编程

93、技术的实现第3章高级编程技术的实现第第3 3章章 高级编程技术的实现高级编程技术的实现动画技术:动画技术:利用动态开辟图视口利用图视口设置技术,可以实现图视口动画效果例如可在不同图视口中设置同样的图像,而让图视口沿x轴方向移动设置,这次出现前要清除上次图视口的内容,这样就会出现图像沿x轴移动的效果。也就是,在位置动态变化,但大小不变的图视口中(用setviewpot()函数),设置固定图形(也可是微小变化的图像),这样虽呈现在观察者面前的是当前图视口位置在动态变化,但视觉上却象是看到图像在屏幕上动态变化一样。103薄抽幌昧些崎驹韵美职阴柜垛衣肪抒杂廖把碟针让刊赖疮毖痈耶畏荣僧缎第3章高级编程技

94、术的实现第3章高级编程技术的实现第第3 3章章 高级编程技术的实现高级编程技术的实现动画技术:动画技术:利用动态开辟图视口应应用用实实例例源程序源程序#include#includemain()inti,graphdriver,graphmode;graphdriver=DETECT;initgraph(&graphdriver,&graphmode,“”);for(i=0;i25;i+)setfillstyle(1,i);movebar(i*20);closegraph();movebar(intxorig)/*设窗口并画填色小立方体*/setviewport(xorig,0,639,199

95、,1);setcolor(5);bar3d(10,120,60,150,40,1);floodfill(70,130,5);floodfill(30,110,5);delay(250000);clearviewport();104琉杨瓷命服龚或谩恨海划朽私涕杂诫色沼钾脆师剪伴阴钨近迎附卑奠啼厕第3章高级编程技术的实现第3章高级编程技术的实现第第3 3章章 高级编程技术的实现高级编程技术的实现动画技术:动画技术:利用动态开辟图视口不断的沿x轴开辟图视窗口,就像一个大小一样的窗口沿x轴在移动,由于总有clearviewport函数清除上次窗口的相同立方体,因而视觉效果上,就像一个立方体从左向右移动

96、一样。程序中定义的movebar函数作用是开辟一个图视窗口,并画一个填色的立方体,保留一阵(delay(250000))然后清除它,主程序不断调用它,因每次顶点x坐标在增加,因而效果是立方体沿x轴从左向右在运动。应应用用实实例例 例程说明例程说明105噬卤狰肃抛镜续述马熬嘎韵榆漠辆柱综缸坚诸赞两牺锚姆锦嚏戮披唤涝沟第3章高级编程技术的实现第3章高级编程技术的实现第第3 3章章 高级编程技术的实现高级编程技术的实现动画技术动画技术采用上面的两种方法对较复杂图形不宜:一、画图形要占较长时间,二、图视口位置切换的时间就变得较长,因而动画效果就会变差。106缮汞台情冶涝再汪肚纱枝阜个裁肋缆恋死尉可首庇

97、仅亏古怠寓怪庚针暗静第3章高级编程技术的实现第3章高级编程技术的实现第第3 3章章 高级编程技术的实现高级编程技术的实现动画技术:动画技术:屏幕图像存储再放同制作幻灯片一样,将整个动画过程变成一个个片断,然后存到显示缓冲区内,当把它们按顺序重放到屏幕上时,就出现了动画效果,这可以用getimage()和putimage()函数来实现。这种方法较快,因它已事先将要重放的画面画好,之后要做的事就是计算应在什么位置重放存放好的屏幕图像了。107违粹张达按牌搬咏沫怠钠燎知店矩朗格渭香嘴航走埋蒲齿货陈誓茹皖豪氯第3章高级编程技术的实现第3章高级编程技术的实现第第3 3章章 高级编程技术的实现高级编程技术

98、的实现动画技术:动画技术:页交替的方法 图形方式下存储在VRAM中的一满屏图像信息称为一页,每页一般为64K字节,VRAM可以存储要显示的图像几个页。通过设置显示页函数,激活不同显示页实现动画效果。TurboC支持页的功能有限,按在图形方式下显示的模式最多支持4页(EGALO显示方式),一般为两页(注意对CGA,仅有一页),因存储图像的页显示时,一次只能显示一页,因此必须设定某页为当前显示的页(又称可视页),缺省时定为0页。108汐矾再撵祷痛梨斋炮隋佳金放栓庄区颜悦嗜窍滴雾忍烛乌晦涉醇卫钟允悬第3章高级编程技术的实现第3章高级编程技术的实现第第3 3章章 高级编程技术的实现高级编程技术的实现动

99、画技术:动画技术:页交替的方法 当前显示页(可视页):当前显示在屏幕上的页面当前编辑页(激活页):正在由用户编辑图形的页。这个页不等于显示页,即若用户不设定该页为当前显示页时,在该页上编辑的图形将不会在屏幕上显示出来。缺省时,设定0页为当前编辑页,又为当前显示页。109遂攫阎连俺阮斡瑰李济峪华鳞瓤娄轻赎错超贝栋伤到诺捶穿邓宠暮来肢竖第3章高级编程技术的实现第3章高级编程技术的实现第第3 3章章 高级编程技术的实现高级编程技术的实现动画技术:动画技术:页交替的方法 设置激活页和显示页的函数如下: void far setactivepage(int pagenum); void far setv

100、isualpage(int pagenum);这两个函数只能用于EGA、VGA等显示适配器。前者设置由pagenum指出的页为激活的页,后者设置可显示的页。当设定了激活的页,即编辑页后,则程序中其后的画图操作均在该页进行,若它不定为显示页,则其上的图像信息并不会在屏幕上显示出来。110撒饵寥苫溪搞伙之撑傅障拼肆活皖亥绵训嫡镶蕊激号箩脊粗铀艾菌花挫汽第3章高级编程技术的实现第3章高级编程技术的实现第第3 3章章 高级编程技术的实现高级编程技术的实现动画技术:动画技术:页交替的方法首先设置l页为编辑页,在上面画出一个红色边框、用淡绿色填充的圆,此图并不显示出来(因缺省时,定义0页为可视页)。接着又

101、定义0页为编辑页并清屏,也定义0页为可视页,并在其上画出一个用洋红色填充的方块,该方块将在屏幕上显示出来。接着进入do循环,设置l页为可视页,因而其上的圆便在屏幕上显示出来,方块的图像消失,用delay(2000)将圆图像保持2000毫秒即2秒,当不按键时,下一次循环又将0页设为可视页,因而方块的图像显示出来,圆图像又消失。保持2秒后,又重复刚开始的过程。这样我们就会看到:屏幕上同一位置洋红色圆和淡绿色方块交替出现,若将delay时间变少,将会出现动画的效果。 应应用用实实例例 例程描述例程描述111询港版坝且醛芬占淤耐提钉抒也恒旗涣藩娥苏贺帜养燥剥费哗函装旨宇呼第3章高级编程技术的实现第3章

102、高级编程技术的实现第第3 3章章 高级编程技术的实现高级编程技术的实现动画技术:动画技术:页交替的方法应应用用实实例例源程序源程序#include#includemain()inti,graphdriver,graphmode,size,page;graphdriver=DETECT;initgraph(&graphdriver,&graphmode,);cleardevice();setactivepage(1);/*设置l页为编辑页*/setbkcolor(BLUE);setcolor(RED);setfillstyle(1,10);circle(130,270,30);/*画圆*/flo

103、odfill(130,270,4);/*用淡绿色填充圆*/setactivepage(0);/*设置0页为编辑页*/cleardevice();/*清0页*/setfillstyle(1,5);bar(100,210,160,270);/*画方块并填充洋红色*/setvisualpage(0);/*设置0页为可视页*/page=1;dosetvisualpage(page);/*显示设定页的图像*/delay(2000);/*延迟2000ms*/page=page-1;if(page0)page=1;while(!kbhit();getch();closegraph();112侦旭金矗喳斧涕峰

104、悉豆摩牟常逮优巳绩沥揣冒野强耶恋锥酿省觉卉尉铜涤第3章高级编程技术的实现第3章高级编程技术的实现 第第3 3章章 高级编程技术的实现高级编程技术的实现主要内容主要内容操作手段显示方式图形绘制技术图像技术动画技术发声技术汉字显示技术精确的时间控制技术113浑陷蒋蠕拧苛鲁践求稗语尉桃臀槐伶宝报倦翌呻驾龋联硷恬聪缮巴疹拉烂第3章高级编程技术的实现第3章高级编程技术的实现第第3 3章章 高级编程技术的实现高级编程技术的实现发声技术发声技术计算机发声原理:在扬声器电路中,定时器的频率决定了扬声器发音的频率,通过设定定时器电路的频率使扬声器发出不同的声音。发声函数:voidsound(unsignedfr

105、equency);入口参数为扬声器要产生声音的频率。voidnosound(void); 函数用于关闭扬声器。114寝计捣请安蔼努锑侈短轮捎磊搀姚老均阐胎吱锅养略吁魏丸助寓瓣仔蜂怔第3章高级编程技术的实现第3章高级编程技术的实现第第3 3章章 高级编程技术的实现高级编程技术的实现发声技术:发声技术:声音函数voidsound(unsignedfrequency);入口参数为扬声器要产生声音的频率。voidnosound(void); 函数用于关闭扬声器。voiddelay(unsignedmilliseconds); 延时函数。115我唾叉芝栓敢题柴摊池竭那宝狰踩右尊而屑绚坚掺湍豢态校攘色熬掐

106、校坠第3章高级编程技术的实现第3章高级编程技术的实现第第3 3章章 高级编程技术的实现高级编程技术的实现发声技术:发声技术:例程应应用用实实例例每间隔10000millisecondspc扬声器发出不同频率的声音,直到频率大于5000hz。/*该程序每间隔10000millisecondspc扬声器发出不同频率的声音,直到频率大于5000hz*/#includemain()intfreq;for(freq=50;freq5000;freq+=50)sound(freq);delay(10000);nosound();116封蓬怒比姬惠溶宿乌跟闰暂亥昭宛够剃蹋淹献称淘昌哪慎钩校司硝莆敢送第3章高

107、级编程技术的实现第3章高级编程技术的实现第第3 3章章 高级编程技术的实现高级编程技术的实现发声技术:发声技术:计算机乐谱计算机乐谱思路:将各个频率存储在一个二维数组中,根据音阶字符、音符和节拍数,得到发音的音长,使用sound函数发音,使用delay函数控制。117瑶疹辙屑熊页堵苹耪屿趣锣磁国越空谭抬贬咙殆静锻渡己蛰审异藕逃鲤垦第3章高级编程技术的实现第3章高级编程技术的实现第第3 3章章 高级编程技术的实现高级编程技术的实现发声技术:发声技术:计算机乐谱计算机乐谱步骤:1.首先应有一张频率与音阶的对照表,然后定义音长基准、音阶和节拍数,例如,音长基准一般为300、600、900、1200,

108、音阶的设置如下:最高音:在音符前加“E”;高音:在音符前加“H”;中音:在音符前加“M”;低音:在音符前加“L”;118壕闽市跪傣肃始嫩鬼奢惧燥况砰嘱坪岂振锥项抱佩凡捣为毁稿笛哭沛滞哟第3章高级编程技术的实现第3章高级编程技术的实现第第3 3章章 高级编程技术的实现高级编程技术的实现发声技术:发声技术:计算机乐谱计算机乐谱2.节拍数以0.5表示,每个音的音长音长基数节拍数。接着将原乐谱转换成计算机乐谱,如:在计算机中可以表述为:600H10.5H10.5H10.5M70.5M61H31H20.5H30.5H20.5M60.5H21119救挫巨绳表燃凡沙渭膀鳃差糖吕踏艺防鹃忱荧陆魄答降袄总拢乔净

109、躇方弧第3章高级编程技术的实现第3章高级编程技术的实现第第3 3章章 高级编程技术的实现高级编程技术的实现发声技术:发声技术:计算机乐谱计算机乐谱 频率与音率与音阶的的对照表照表低音频率中音频率高音频率最高音频率11311262152311047214722962587211753165333036593131941764349469941397519653925784515686220644068806176072477494798871976120支瘩畜瓷栗谰枯腆撤寄膊钞望侩葫园罢楼烫喇冈褐然板频饮遵臻贮答镁吠第3章高级编程技术的实现第3章高级编程技术的实现第第3 3章章 高级编程技术的实

110、现高级编程技术的实现发声技术:发声技术:计算机乐谱计算机乐谱应应用用实实例例例程描述例程描述这段曲目的乐谱简单地由两个数组表示:freq96和dely96分别用于存储声音的频率和延时。采用图形方式,利用printtext()函数在屏幕上分别显示字符串Welcome !“,”Please press any key to start .“,”Enjoy yourself !”,“Press any key to end !” 和 “Thank you! Bye Bye .”。另外,在此程序中还调用了conio.h 中的函数kbhit(),用于判断是否有键按下,当没有键按下时返回0。 121锥活粪

111、帝驯堆找奶者工锄帆柔茬菊术倦桥撞鹏卜奠紊阉罗屿钞郡膊感绕汉第3章高级编程技术的实现第3章高级编程技术的实现第第3 3章章 高级编程技术的实现高级编程技术的实现发声技术发声技术应应用用实实例例源程序片段源程序片段i=0;while(iGBK=GB18030124垄帝坎丢场疡潦井垛搂蹦凶漾捣毛敦今盛逐走旺便罪患池猾搏吱刚仙谗叁第3章高级编程技术的实现第3章高级编程技术的实现第第3 3章章 高级编程技术的实现高级编程技术的实现汉字显示技术:汉字显示技术:汉字编码汉字编码汉字编码采用双字节编码方案。国标码:每个字节使用后面7位,最高位为0。机内码:国标码在计算机内使用的时候,为了区别于英文的ASCII

112、码,规定汉字每个字节的最高位为1,以表示这两字节为汉字。以“大”字为例子:国标码3473H:0011010001110011机内码B4F3H:1011010011110011125逊咆狭房涕僵姜鳃曙饿笑拇又星苍身茎益解腻利拷误同诸味吴堕炭痰脐喊第3章高级编程技术的实现第3章高级编程技术的实现第第3 3章章 高级编程技术的实现高级编程技术的实现汉字显示技术:汉字显示技术:字型编码字型编码为了显示或打印字符,需要事先对字符的字形进行编码。字形编码的一种方法是采用点阵字库,它是利用点阵来描述字符的字形笔画,然后这些点阵用一组二进制数来编码(有点的位置用1表示,无点的位置为0)。英文字母“T”用十六进

113、制表示为:00、FE、10、10、10、10、10、10126狄徒柜鳃际民实立燕路先厕萤埃凹奋朔犯凳萤疙跃附聪俞矿剑裤漏拉沿郑第3章高级编程技术的实现第3章高级编程技术的实现第第3 3章章 高级编程技术的实现高级编程技术的实现汉字显示技术:汉字显示技术:字型编码字型编码汉字可利用类似的原理进行字形编码。根据汉字输出精度的不同,常见的有1616点阵、2424点阵、3232点阵、4848点阵、6464点阵等。点阵越大,字形精度越高,但所占容量越大。对于1616点阵,1个汉字的字形描述需32字节。127候度辈悠下胞溺林紫稻越歼姨膝伴痕殷怖碘骡旋滁叭枫神督萝贷葡谱匡竣第3章高级编程技术的实现第3章高级

114、编程技术的实现第第3 3章章 高级编程技术的实现高级编程技术的实现汉字显示技术:汉字显示技术:字库字库:标准字符集中所有字符的同一规模字形点阵的二进制编码所组成的集合。国标码所有字符的1616点阵二进制编码的集合形成了1616点阵字库。汉字字库结构:整个字库分成94个区,每个区有94个汉字(即有94个位编号)。每个汉字在汉字库中有确定的区和位编号,用两个字节表示就是所谓的区位码。区位码的第一个字节表示区号,第二个字节表示位号,128撑耻双粱彩镊咐噬酣蜡鳃范惟限刁稽权役颊耙硫耿床偷循伎赖慨蛤亿疥冻第3章高级编程技术的实现第3章高级编程技术的实现第第3 3章章 高级编程技术的实现高级编程技术的实现

115、汉字显示技术:汉字显示技术:汉字字库区位码区位码字形编码在字库中的地址字形编码在字库中的地址例如,某字的区位码为QhWh(即为第Qh区的第Wh个汉字),那么在1616点阵的字库中,由于每个汉字占32个字节,该字的字形编码在汉字库中离起点的偏移位置(以字节为单位)Offset便可由以下公式计算而来:Offset =(94(Qh-1)+(Wh-1)32 129涤辑楼淬掺顽贪粗秸玄泣婆隋浪似忿踏易亿坞柏河棉昆谓洪织劝佐洛赊斑第3章高级编程技术的实现第3章高级编程技术的实现第第3 3章章 高级编程技术的实现高级编程技术的实现汉字显示技术:汉字显示技术:编码转换机内码机内码区位码区位码若汉字机内码为十六

116、进制数h2h1l2l1,则区号Qh相位号Wh分别为:Qh= h2h1-0xa0; Wh= l2l1-0xa0;若用十进制表示机内码为dld2,则Qh=dl-l60;Wh=d2-160;即区位码qw为:qw=100* Qh十十Wh;反过来,若已经知道了区位码qw。则也可求得区号和位号:Qh=qw/100; Wh=qw-100*Qh;130栓编灰隋校坐停樱剂四等苏楞蛆叮得谱讶涉畏纫著份聋鄙兰州墓刻贺砧崎第3章高级编程技术的实现第3章高级编程技术的实现第第3 3章章 高级编程技术的实现高级编程技术的实现汉字显示技术:汉字显示技术:例程应应用用实实例例源程序片段源程序片段/*打开字库文件打开字库文件*

117、/voidopen_hzk()hzk_p=fopen(“d:/zy/tc/hzk16”,“rb”);if(!hzk_p)printf(ThefileHZK16notexist!Entertosystemn);getch();closegraph();exit(1);131于喇吠恐鞘乌妈筷很渝锐盔沧卑冒拣殖仓辜现瘪桃姻熊澄浇绎叮肝池练橙第3章高级编程技术的实现第3章高级编程技术的实现第第3 3章章 高级编程技术的实现高级编程技术的实现汉字显示技术:汉字显示技术:例程应应用用实实例例源程序片段源程序片段/*读取字库文件中的汉字点阵读取字库文件中的汉字点阵*/voidget_hz(charincod

118、e,charbytes)unsignedcharqh,wh;unsignedlongoffset;qh=incode0-0xa0;/*得到区号*/wh=incode1-0xa0;/*得到位号*/offset=(94*(qh-1)+(wh-1)*32L;/*得到偏移位置*/fseek(hzk_p,offset,SEEK_SET);/*移文件指针到要读取的汉字点阵处*/fread(bytes,32,1,hzk_p);/*读取32字节的汉字点阵信息*/132调使祟披芽髓凋帛吻场癣撰堡剧赋惦位岿赫展章略灯恿柳肖锭乾沼高蚂屋第3章高级编程技术的实现第3章高级编程技术的实现第第3 3章章 高级编程技术的实

119、现高级编程技术的实现汉字显示技术:汉字显示技术:例程应应用用实实例例源程序片段源程序片段voiddishz(intx0,inty0,charcode,intcolor)unsignedcharmask=0x80,0x40,0x20,0x10,0x08,0x04,0x02,0x01;/*屏蔽点阵每行各位的数组*/inti,j,x,y,pos;charmat32;get_hz(code,mat);y=y0;for(i=0;i16;+i)x=x0;pos=2*i;for(j=0;jactual_cycle|(target_cycle0)action_loop();/*代表作一次动作的函数或代码,如移

120、动一下坦克和子弹等*/actual_cycle+;if(exit_flag=1)/*退出游戏*/while(1);/*新的0x1c软中断*/voidfarinterruptnew_timer(void)externvolatileinttarget_cycle;target_cycle+;outportb(0x20,0x20);148疡薛眺都央疏哇姑兜锻镭奔泥麦岳似磺渗毡董猫猫态秉阅帅舞捶颜疲录啃第3章高级编程技术的实现第3章高级编程技术的实现第第3 3章章 高级编程技术的实现高级编程技术的实现精确的时间控制技术精确的时间控制技术:实现方案方案二:屏幕的垂直回扫中断通过读取屏幕的垂直回扫中断来

121、控制游戏节奏。其接口地址为0x3da,通过(inportb(0x3da)&0x08);语句可以得到该中断返回值的第4位的值。该位有一个很好的特性的当屏幕在垂直回扫过程中时,它是值是,垂直回扫结束后它的值为,这样就形成了一种频率为60Hz(远远大于24Hz)的1和0的周期性变化。149椿每准笼并捉代颇上钟售裳计疵拳吮她兹射鬃蔗版侮掉妆奎今淹甥百抚绝第3章高级编程技术的实现第3章高级编程技术的实现第第3 3章章 高级编程技术的实现高级编程技术的实现精确的时间控制技术精确的时间控制技术:实现方案方案二关键代码do/*(游戏)循环*/*利用屏幕的垂直回扫周期来控制游戏节奏(60Hz)*/if(inportb(0x3da)&0x08)!=0&action_flag=0)/*垂直回扫过程中*/*如动画代码写在这里*/action_flag=1;elseif(inportb(0x3da)&0x08)=0&action_flag=1)/*垂直回扫过程结束后*/*如播放一个音符*/action_flag=0;while(1);150筋色脂亡牧屈弱我旱可豌佯迪嗅四框缉砾盯则挛漫候益赶浸所奋祖滞激腑第3章高级编程技术的实现第3章高级编程技术的实现

展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 办公文档 > 工作计划

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号