⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 图形处理.01

📁 经典C教程,带所有ANSI C的库函数说明及例子
💻 01
📖 第 1 页 / 共 4 页
字号:
图形处理
再谈main()主函数
    每一C 程序都必须有一main()函数,可以根据自己的爱好把它放
在程序的某个地方。有些程序员把它放在最前面,而另一些程序员把
它放在最后面,无论放在哪个地方,以下几点说明都是适合的。
    1. main() 参数
    在Turbo C2.0启动过程中,传递main()函数三个参数:argc,
argv和env。
     * argc:  整数,为传给main()的命令行参数个数。
     * argv:  字符串数组。
	      在DOS 3.X 版本中,argv[0] 为程序运行的全路径名;
	      对DOS 3.0 以下的版本,argv[0]为空串("") 。
	      argv[1] 为在DOS 命令行中执行程序名后的第一个字
		      符串;
	      argv[2] 为执行程序名后的第二个字符串;
	      ...
	      argv[argc]为NULL。     *env:  安符串数组。env[] 的每一个元素都包含ENVVAR=value
     形式的字符串。其中ENVVAR为环境变量如PATH或87。value 为ENVVAR
     的对应值如C:\DOS,C:\TURBOC(对于PATH) 或YES(对于87)。 Turbo
     C2.0启动时总是把这三个参数传递给main()函数,可以在
     用户程序中说明(或不说明)它们,如果说明了部分(或全部)参数,它
     们就成为main()子程序的局部变量。    请注意:一旦想说明这些参数,则必须按argc,argv, env的顺
序,如以下的例子:    main()
    main(int argc)
    main(int argc, char *argv[])
    main(int argc, char *argv[], char *env[])
    其中第二种情况是合法的,但不常见,因为在程序中很少有只用
argc,而不用argv[]的情况。
    以下提供一样例程序EXAMPLE.EXE, 演示如何在main()函数中使
用三个参数:/*program name EXAMPLE.EXE*/
#include <stdio.h>
#include <stdlib.h>
main(int argc,char *argv[],char *env[])
{
  int i;
  printf("These are the %d command-line arguments passed to  \
	  main:\n\n", argc);
  for(i=0; i<=argc; i++)
      printf("argv[%d]:%s\n", i, argv[i]);
      printf("\nThe environment string(s)on this system are: \
	      \n\n");
   for(i=0; env[i]!=NULL; i++)
       printf(" env[%d]:%s\n", i, env[i]);
    }
    如果在DOS 提示符下,按以下方式运行EXAMPLE.EXE:    C:\example first_argument "argument with blanks"  3  4
"last  butone" stop!    注意:可以用双引号括起内含空格的参数,如本例中的:"argument
with blanks"和"Last but one")。    应该提醒的是:传送main() 函数的命令行参数的最大长度为128
个字符 (包括参数间的空格),这是由DOS 限制的。文本窗口的定义
    Turbo C2.0的字符屏幕函数主要包括文本窗口大小的设定、窗口
颜色的设置、窗口文本的清除和输入输出等函数。    Turbo C2.0默认定义的文本窗口为整个屏幕,共有80列(或40列)
25行的文本单元,每个单元包括一个字符和一个属性,字符即ASCII
码字符,属性规定该字符的颜色和强度。
    Turbo C2.0可以定义屏幕上的一个矩形域作为窗口,使用
window()函数定义。窗口定义之后,用有关窗口的输入输出函数就可
以只在此窗口内进行操作而不超出窗口的边界。
    window()函数的调用格式为:     void window(int left, int top, int right, int bottom);
    该函数的原型在conio.h 中 (关于文本窗口的所有函数其头文件
均为conio.h,后面不再说明)。 函数中形式参数(int left, int top)
是窗口左上角的坐标,(int right, int bottom)是窗口的右下角坐标,
其中(left, top)和(right, bottom) 是相对于整个屏幕而言的。
Turbo C 2.0规定整个屏幕的左上角坐标为(1, 1),右下角坐标为
(80, 25)。并规定沿水平方向为 X轴,方向朝右;沿垂直方向为 Y轴,
方向朝下。若window()函数中的坐标超过了屏幕坐标的界限,则窗口
的定义就失去了意义,也就是说定义将不起作用,但程序编译链接时
并不出错。
    另外,一个屏幕可以定义多个窗口,但现行窗口只能有一个 (因
为DOS为单任务操作系统),当需要用另一窗口时,可将定义该窗口的
window() 函数再调用一次,此时该窗口便成为现行窗口了。
    如要定义一个窗口左上角在屏幕(20,5)处,大小为30列15行的窗
口可写成:     window(20, 5, 50, 25);文本窗口颜色的设置
    文本窗口颜色的设置包括背景颜色的设置和字符颜色的设置,使
用的函数及其调用格式为:    设置背景颜色:  void textbackground(int color);    设置字符颜色:  void textcolor(int color);    有关颜色的定义见下表。
 ━━━━━━━━━━━━━━━━━━━━━━━━━━
  符号常数         数值      含义         字符或背景
 ──────────────────────────
  BLACK             0         黑          两者均可
  BLUE              1         兰          两者均可
  GREEN             2         绿          两者均可
  CYAN              3         青          两者均可
  RED               4         红          两者均可
  MAGENTA           5        洋红         两者均可
  BROWN             6         棕          两者均可
  LIGHTGRAY         7        淡灰         两者均可
  DARKGRAY          8        深灰         只用于字符
  LIGHTBLUE         9        淡兰         只用于字符
  LIGHTGREEN        10       淡绿         只用于字符
  LIGHTCYAN         11       淡青         只用于字符
  LIGHTRED          12       淡红         只用于字符
  LIGHTMAGENTA      13       淡洋红       只用于字符
  YELLOW            14       黄           只用于字符
  WHITE             15       白           只用于字符
  BLINK             128      闪烁         只用于字符
━━━━━━━━━━━━━━━━━━━━━━━━━━━
    上表中的符号常数与相应的数值等价,二者可以互换。例如设定
兰色背景可以使用textbackground(1), 也可以使用textbackground
(BLUE),两者没有任何区别,只不过后者比较容易记忆,一看就知道
是兰色。
    Turbo C 另外还提供了一个函数,可以同时设置文本的字符和背
景颜色,这个函数的调用格式为:     void textattr(int attr);    其中: attr的值表示颜色形式编码的信息,每一位代表的含义如
下:       位      7   6   5   4      3   2   1   0
	       B   b   b   b      c   c   c   c
	      ↓  ┕━━━┙     ┖─────┘
	     闪烁  背景颜色         字符颜色
    字节低四位cccc设置字符颜色(0到15),4 ̄6三位bbb设置背景颜
色(0到7),第7位B设置字符是否闪烁。假如要设置一个兰底黄字,定
义方法如下:    textattr(YELLOW+(BLUE<<4));    若再要求字符闪烁,则定义变为:    textattr(128+YELLOW+(BLUE<<4);
    注意:
    (1) 对于背景只有0 到7 共八种颜色,若取大于7 小于15的数,
则代表的颜色与减 7后的值对应的颜色相同。
    (2) 用textbackground()和textcolor() 函数设置了窗口的背景
与字符颜色后,在没有用clrscr()函数清除窗口之前,颜色不会改变,
直到使用了函数clrscr(),整个窗口和随后输出到窗口中的文本字符
才会变成新颜色。
    (3) 用textattr()函数时背景颜色应左移4位,才能使3位背景颜
色移到正确位置。
    下面这个程序使用了关于窗口大小的定义、颜色的设置等函数,
在一个屏幕上不同位置定义了7个窗口,其背景色分别使用了7种不同
的颜色。#include <stdio.h>
#include <conio.h>
main()
{
  int i;
  textbackground(0);            /* 设置屏幕背景色 */
  clrscr();                     /* 清除文本屏幕 */
  for(i=1; i<8; i++)
     {
      window(10+i*5, 5+i, 30+i*5, 15+i); /* 定义文本窗口 */
      textbackground(i);        /* 定义窗口背景色 */
      clrscr();                 /* 清除窗口 */
      }
      getch();
 }
窗口内文本的输入输出函数
    一、窗口内文本的输出函数    int cprintf("<格式化字符串>", <变量表>);    int cputs(char *string);    int putch(int ch);    cprintf() 函数输出一个格式化的字符串或数值到窗口中。它与
printf()函数的用法完全一样,区别在于cprintf() 函数的输出受窗
口限制,而printf() 函数的输出为整个屏幕。
    cputs()函数输出一个字符串到屏幕上,它与puts() 函数用法完
全一样, 只是受窗口大小的限制。
    putch()函数输出一个字符到窗口内。
    注意:
    (1)使用以上几种函数, 当输出超出窗口的右边界时会自动转到
下一行的开始处继续输出。当窗口内填满内容仍没有结束输出时,窗
口屏幕将会自动逐行上卷直到输出结束为止。    二、窗口内文本的输入函数    int getche(void);    该函数在前面已经讲过,需要说明的是,getche()函数从键盘上
获得一个字符,在屏幕上显示的时候,如果字符超过了窗口右边界,
则会被自动转移到下一行的开始位置。
    下面这个程序给上例中加入了一些文本的输出函数。#include <stdio.h>
#include <conio.h>
int main()
{
  int i;
  char *c[]={"BLACK", "BLUE", "GREEN", "CYAN", "RED",
	     "MAGENTA", "BROWN", "LIGHTGRAY"};
  textbackground(0);            /* 设置屏幕背景色 */
  clrscr();                     /* 清除文本屏幕 */
  for(i=1; i<8; i++)
      {
       window(10+i*5,5+i,30+i*5,15+i); /* 定义文本窗口 */
       textbackground(i);        /* 定义窗口背景色 */
       clrscr();                 /* 清除窗口 */
      }
  getch();
  return 0;
 }
有关屏幕操作的函数
    void clrscr(void);    清除当前窗口中的文本内容, 并把光标定位在窗口的左上角
(1, 1)处。    void clreol(void);    清除当前窗口中从光标位置到行尾的所有字符, 光标位置不变。    void gotoxy(x, y);    该函数很有用, 它用来定位光标在当前窗口中的位置。这里x,y
是指光标要定位处的坐标(相对于窗口而言),当x,y超出了窗口的大小
时,该函数就不起作用了。
    int gettext(int xl,int yl,int x2,int y2,void *buffer);
    int puttext(int x1,int y1,int x2,int y2,void *buffer);    gettext()函数是将屏幕上指定的矩形区域内文本内容存入
buffer 指针指向的一个内存空间。内存的大小用下式计算:     所用字节大小=行数*列数*2
其中:
     行数=y2-y1+1        列数=x2-x1+1    puttext()函数则是将gettext()函数存入内存buffer中的文字内
容拷贝到屏幕上指定的位置。
    int movetext(int x1, int x2, int y2, int x3, int y3);    movetext()函数将屏幕上左上角为(x1, y1),右下角为(x2, y2)
的一矩形窗口内的文本内容拷贝到左上角为(x3, y3)的新的位置。该
函数的坐标也是相对于整个屏幕而言的。
    注意:
    1. gettext()函数和puttext() 函数中的坐标是对整个屏幕而言
的, 即是屏幕的绝对坐标,而不是相对窗口的坐标。
    2. movetext()函数是拷贝而不是移动窗口区域内容, 即使用该
函数后, 原位置区域的文本内容仍然存在。#include<conio.h>
main()
{
  int i;
  char *f[]={"Load    F3","Pick  Alt-F3","New    ",
	     "Save    F2","Write to    ","Directory",
	     "Change dir","Os shell    ","Quit Alt-X"};
  char buf[11*16*2];
  clrscr();
  textcolor(YELLOW);
  textbackground(BLUE);
  clrscr();
  gettext(10, 2, 24, 11, buf);
  window(10, 2, 24, 11);
  textbackground(RED);
  textcolor(YELLOW);
  clrscr();
  for(i=0; i<9; i++)
      {
	gotoxy(1, i+1);
	cprintf("%s", f[i]);
      }
  getch();
  movetext(10, 2, 24, 11, 40, 10);
  puttext(10, 2, 24, 11, buf);
  getch();
 }
    下面再介绍一些函数:    void highvideo(void);   设置显示器高亮度显示字符
    void lowvideo(void);    设置显示器低亮度显示字符
    void normvideo(void);   使显示器返回到程序运行前
			    的显示方式
    int wherex(void);       这两个函数返回当前窗口下
			    光标的x,y坐标
    int wherey(void);    Turbo C 提供了非常丰富的图形函数,所有图形函数的原型均在
graphics. h 中,本节主要介绍图形模式的初始化、独立图形程序的
建立、基本图形功能、图形窗口以及图形模式下的文本输出等函数。
另外,使用图形函数时要确保有显示器图形驱动程序*BGI,同时将集
成开发环境Options/Linker中的Graphics lib选为on,只有这样才能
保证正确使用图形函数。图形模式的初始化
    不同的显示器适配器有不同的图形分辨率。即是同一显示器适配
器,在不同模式下也有不同分辨率。因此,在屏幕作图之前,必须根
据显示器适配器种类将显示器设置成为某种图形模式,在未设置图形
模式之前,微机系统默认屏幕为文本模式(80列,25行字符模式),此
时所有图形函数均不能工作。设置屏幕为图形模式,可用下列图形初

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -