C程序中图片调用技巧
  摘要:介绍如何在C程序中调用图片,这将有助于加强C程序的界面的美观性.
  关键词: VGA 、BMP、13h.h、TIMER.H、Logo。
  一、问题的引入:
   C语言使用愈来愈普及,愈来愈深层次。Turbo C提供了更强的图形函数库,它支持微机CGA﹑EGA﹑VGA等多种图形适配器的各种图形模式,提供了绘制各种图形﹑输出各种字体的图形库函数,并具有丰富的对图形进行着色﹑填充的功能。在图形程序及软件的编制与开发中,Turbo C绘图已越来越受到广大用户的青睐。 Turbo C图形的实现是基于在Turbo C基本知识的基础上,在了解了这些之后,我们就可以运用基本作图函数来实现一些工作。但是Turbo C是基于DOS核心的,最多实现16种颜色的显示,所以实现的图形也是比较简单、单一的。而一些较复杂的图形,用Turbo C是无法实现的。但是我们可以通过另一种办法来实现,在C程序中调用图片,这样就可以省去了在C中绘制图形的麻烦,并且图片我们可以利用其他的工具进行更优化的处理。
  二、问题解决的方法:
   有了这个想法以后,马上查资料,在网上发现一个叫作《潜艇大站》的游戏,在里面有调用图片的功能,通过认真研究以后,终于分离出了这段代码。
  三、程序功能说明:
   在这段程序中,可以调用的图片格式为BMP。图片大小为:320*200。
  四、关键程序介绍:
   在主程序中调用了两个头文件,这两个头文件在C函数库中是没有的,其功能分别是:13h.h为VGA13h作图模式下的一些基本函数。timer.h为这个程序运行的时钟系统。在主程序中有三个子函数,分别为:StepIn(调色板渐入函数)、StepOut(调色板渐出函数)、Logo(显示开始画面函数)。在13h.h中包括的函数有Pset(向后台活动页写像素)、wait(等待键盘输入)、setmode(设置VGA 13H模式)、closemode(设置文本模式)、void setpal(设置调色板)、ScanKey(从键盘缓冲区内直接读出扫描码)、ClearScreen(画背景)、ReFresh(刷新屏幕)。在timer.h中包括的函数有:BiosTimer(获取BIOS计数器数值)、TimerEvent(时间事件)、CreateTimer(创建一个时钟)、KillTimer(删除一个时钟)、KillAllTimer(删除所有时钟)。
  五、程序清单:
  1.主程序:
  #include<stdio.h>
  #include<dos.h>
  #include<stdlib.h>
  #include"13h.h"
  #include"timer.h"
  int Step=0;
  BYTE PAL[256][3];
  void StepIn()
  {
   int i;
   for(i=0;i<256;i++) setpal(i,PAL[i][0]*Step/64,PAL[i][1]*Step/64,PAL[i][2]*Step/64);
   Step++;
   if (Step>64) KillAllTimer();
  }
  void StepOut()
  {
   int i;
   for(i=0;i<256;i++) setpal(i,PAL[i][0]*Step/64,PAL[i][1]*Step/64,PAL[i][2]*Step/64);
   Step--;
   if (Step<1) KillAllTimer();
  }
  void Logo()
  {
   FILE *bmp;
   int i,r,g,b,x,y;
   setmode();
   bmp=fopen("logo.bmp","rb");
   fseek(bmp,54,SEEK_SET);
   for (i=0;i<256;i++)
   {
   PAL[i][2]=fgetc(bmp)>>2;
   PAL[i][1]=fgetc(bmp)>>2;
   PAL[i][0]=fgetc(bmp)>>2;
   fgetc(bmp);
   setpal(i,0,0,0);
   }
   for (y=0;y<200;y++)
   for (x=0;x<320;x++) pokeb(0xa000,y*320+x,fgetc(bmp));
   fclose(bmp);
   CreateTimer(1,StepIn);
   while (ScanKey()!=57&&TimerUsed) TimerEvent();
   Step=64;
   StepIn();
   wait();
   CreateTimer(1,StepOut);
   while (ScanKey()!=57&&TimerUsed) TimerEvent();
   Step=0;
   StepOut();
   closemode();
   }
  void main()
  {
   Logo();
  }
  2.13h.h代码:
  # define BYTE unsigned char
  # define BOOL BYTE
  # define WORD unsigned int
  # define DWORD unsigned long
  # define TRUE 1
  # define FALSE !TRUE
  WORD FONT_SEG;
  WORD FONT_OFF;
  void far * Video;
  void GetFontAdd()
  {
   struct REGPACK regs;
   regs.r_bx=0x0300;
   regs.r_ax=0x1130;
   intr(0x10,&regs);
   FONT_SEG=regs.r_es;
   FONT_OFF=regs.r_bp;
  }
  void Pset(int x,int y,BYTE color)
  {
   if ((x>=0)&&(x<320)&&(y>=0)&&(y<200))
   *((BYTE far*)Video+y*320+x)=color;
  }
  void wait()
  {
   _AX=0;
   geninterrupt(0x16);
  }
  void setmode()
  {
   _AX=0x13;
   geninterrupt(0x10);
   GetFontAdd();
  }
  void closemode()
  {
   _AX=0x3;
   geninterrupt(0x10);
  }
  void setpal(int Color,BYTE r,BYTE g,BYTE b)
  {
   outportb(0x3c8,Color);
   outportb(0x3c9,r);
   outportb(0x3c9,g);
   outportb(0x3c9,b);
  }
  void locate(int Line,int Col
  )
  {
   _DH=Line;
   _DL=Col
  ;
   _AH=2;
   _BX=0;
   geninterrupt(0x10);
  }
  BYTE ScanKey(void)
  {
   int start,end;
   WORD key=0;
   start=peek(0,0x41a);
   end=peek(0,0x41c);
   if (start==end) return(0);
   else
   {
   key=peek(0x40,start);
   start+=2;
   if (start==0x3e) start=0x1e;
   poke(0x40,0x1a,start);
   return(key/256);
   }
  }
  void ClearScreen()
  {
   int x,y;
   for (y=0;y<5;y++) for (x=0;x<320;x++) Pset(x,y,16);
   for (y=5;y<10;y++) for (x=0;x<320;x++) Pset(x,y,104);
   for (y=10;y<15;y++) for (x=0;x<320;x++) Pset(x,y,33);
   for (y=15;y<20;y++) for (x=0;x<320;x++) Pset(x,y,103);
   for (y=20;y<25;y++) for (x=0;x<320;x++) Pset(x,y,32);
   for (y=25;y<30;y++) for (x=0;x<320;x++) Pset(x,y,64);
   for (y=30;y<40;y++) for (x=0;x<320;x++) Pset(x,y,99);
   for (y=40;y<60;y++) for (x=0;x<320;x++) Pset(x,y,97);
   for (y=60;y<100;y++) for (x=0;x<320;x++) Pset(x,y,53);
   for (y=100;y<200;y++) for (x=0;x<320;x++) Pset(x,y,2);
  }
  void ReFresh(void)
  {
   movedata(FP_SEG(Video),FP_OFF(Video),0xa000,0,64000);
  }
  3.timer.h代码:
  # define MAXTIMER 10
  struct TM
  {
   DWORD Interval; 
   DWORD LastTimer; 
   BOOL Enable; 
   BOOL Used; 
   void (*Pointer)(); 
  };
  struct TM tmTM[MAXTIMER+1];
  int TimerUsed=0;
  DWORD BiosTimer(void)
  {
   DWORD BIOSTIMER=0;
   BIOSTIMER=peek(0x0,0x46e);
   BIOSTIMER<<=8;
   BIOSTIMER+=peek(0x0,0x46c);
   return (BIOSTIMER);
  }
  void TimerEvent()
  {
   int i;
   DWORD TimerDiff;
   for (i=1;i<=MAXTIMER;i++)
   {
   if (tmTM[i].Used&&tmTM[i].Enable)
   {
   TimerDiff=BiosTimer()-tmTM[i].LastTimer;
   if (tmTM[i].Interval<=TimerDiff)
   {
   tmTM[i].Pointer();
   tmTM[i].LastTimer=BiosTimer();
   }
   }
   }
  }
  int CreateTimer(DWORD Interval,void (*Pointer)())
  {
   int i=0;
   if (TimerUsed==MAXTIMER) return NULL;
   while (tmTM[++i].Used);
   tmTM[i].Pointer=Pointer;
   tmTM[i].Interval=Interval;
   tmTM[i].Enable=TRUE;
   tmTM[i].Used=TRUE;
   tmTM[i].LastTimer=BiosTimer();
   TimerUsed++;
   return i;
  }
  void KillTimer(int *TimerID)
  {
   if (tmTM[*TimerID].Used)
   {
   TimerUsed--;
   tmTM[*TimerID].Used=FALSE;
   }
   *TimerID=0;
  }
  void KillAllTimer()
  {
   int i;
   for (i=0;i<=MAXTIMER;i++) tmTM[i].Used=FALSE;
   TimerUsed=0;
  }

C程序中图片调用技巧相关推荐

  1. C程序中图片调用技巧(程序来自潜艇大站游戏)

    C程序中图片调用技巧 摘要:介绍如何在C程序中调用图片,这将有助于加强C程序的界面的美观性. 关键词: VGA .BMP.13h.h.TIMER.H.Logo. 一.问题的引入:   C语言使用愈来愈 ...

  2. java如何调用linux命令_java程序中如何调用linux命令

    java程序中如何调用linux命令 作为一个Java开发人员,有些常用的Linux命令必须掌握.即时平时开发过程中不使用Linux(Unix)或者mac系统,也需要熟练掌握Linux命令.因为很多服 ...

  3. 小程序中图片太大应该怎么处理

    在小程序中图片格式为png时任然特别大的时候应该先将图片放在服务器上,然后从服务器上选取所用的图片 在小程序中有放置请求接口的配置文件config.js 在小程序页面中要使用大图时候 (1)先引入co ...

  4. matlab vb调用,VB程序中实现调用MATLAB的方法

    收稿日期:2000207227 作者简介:王跃强(1978-),男,硕士研究生,主要研究方向:光电检测及其自动化. 文章编号:1001-9081(2001)02-0095-02 VB 程序中实现调用M ...

  5. 记录在小程序中前端调用百度 Ocr 识别身份证信息

    微信小程序因为业务扩展需要用户身份证信息,这里记录一下在小程序中通过百度ocr识别的一个开发过程记录. 1. 注册百度云账号 首先,我们要去百度云注册个账号,百度云注册 ,已经注册过可以忽略这部.注册 ...

  6. .sh文件是什么语言_shell命令在C语言程序中的调用

    我们知道linux中有很多系统函数,那么如果在程序中可能使用系统函数,那是十分方便的,比如我们需要将日期和时间写入到file文件中去,使用系统命令行函数可以这样: 因此在标准C语言中定义了system ...

  7. HTML Help Workshop制作chm帮助文件和在应用程序中的调用

    最近在使用微软公司提供的HTML   Help   Workshop工具包 制作chm帮助文件, 现在总结如下:     一.制作前的HTML文件准备工作 由于chm帮助文件是基于HTML文件特征的, ...

  8. java主程序怎样调用子程序_存过和函数以及在Java程序中的调用

    存储过程,函数都是数据库的对象. 创建和调用 存储在数据库中的子程序,是由plsql语言写的,完成特定功能的程序. 函数可以返回值,存过不能返回值.除此之外,一致. create procedure ...

  9. c++语言程序中,要调用的函数必须在main()函数中定义,惠州学院C++考试复习题

    惠州学院C++复习题 一.选择题 1.C++的源文件的扩展名是_____C____. A.h B.obj C.cpp D.exe 2.下列选项能够作为C++变量名的是___C____. A.false ...

最新文章

  1. 生成keystore是报错拒绝访问(已测试)
  2. 职场中有哪些沟通的小技巧?
  3. 混色,半透明的设定,以及我们视角即屏幕处在-1层,-1层的物体是看不见的
  4. 王者荣耀服务器响应超时,“团战”打游戏,为什么你的网络信号总是连接超时?...
  5. react 数组新增_React 新特性 Hooks 讲解及实例(二)
  6. 5912. 每一个查询的最大美丽值
  7. 信息技术及其发展_中科院心理研究所隋南教授受邀来校并做“生命科学:研究模式的演变及其整合趋势”学术报告...
  8. 重建Oracle 11g R2控制台
  9. 为什么安装了增强功能,VirtualBox菜单自动调整显示尺寸还是灰色,不能用
  10. 个人wiki搭建资料整理
  11. linux tac命令_Linux tac命令入门
  12. 【2022】合肥市市赛冲刺【小学组】
  13. MacOS 使用SwitchHosts修改 hosts 不生效的原因及解决方法
  14. 小程序input的type属性 text、number、idcard、digit
  15. 健康生活 多用肥皂少用洗涤剂
  16. simulink模糊逻辑控制器的使用小结
  17. php自定义微博尾巴,新浪微博怎么自定义小尾巴 新浪微博自定义小尾巴方法
  18. 麻烦你先搞懂这几个问题,简历再写熟悉数据库!!!
  19. 【转载】如何巧用IPD,建立完善的产品研发管理体系?
  20. 蔚来大逆转:去年最惨,现在最富

热门文章

  1. 皮具封边发黑_皮革封边怎么能有黑线!?
  2. 简图记录-《血酬定律》阅读总结
  3. ubuntu不能上网解决方法
  4. 解析百度谷歌地址栏参数意义
  5. 请用正则表达式匹配出QQ号(假设QQ号码为5—10位);
  6. 学习《中观》五个问题解答
  7. 为什么我们要学习编程?
  8. Java Web技术总结
  9. @noescape @escaping @autoclosure
  10. 如何解决Keil报错error: #411: a parameter is not allowed ...