C_GUI编程入门

来源:互联网 发布:coc挂机软件 编辑:程序博客网 时间:2024/04/30 03:49

C_GUI编程入门

Made by Edward.Xu

序:首先感谢BORLAND公司为我们提供了一个这么基础库让我们学习CGUI编程,虽然现在时代已经基本不用这种编程方式了,不过通过学习最基础的GUI编程,我们能从中体会到很多在MFC或者SWING中我们体会不到的东西。这份CGUI编程教程只是本人的粗陋潜学,还有很多不恰当的地方,还请多多见谅。本GUI编程仅能在TC平台下编译,VC上不能编译,敬请注意。

北京理工大学珠海学院  徐方鑫

E-mail:280599580@qq.com

 

第一章:认识GUI编程

在程序设计中,往往我们最后编译的结果都是通过控制台输出所获得的一系列数据,随着科技一天天的进步,人们对程序的美观的要求也逐渐加深,所以渐渐的,图型显示就变的比较重要了。

显示器的显示方式有文本方式和图形方式两种,这里讲述文本方式下屏幕输出的控制,并介绍一些有关屏幕处理的函数。本文所介绍函数均包含于conio.h这个头文件当中,因此在用户程序中使用这些函数时,必须用includeconio.h包含在程序中。

第二章:初识GUI应用函数

1.文本方式控制函数      Void textmode(int newmode);

这里的参数newmode既可以是下表中的方式代码,也可以是大写的方式名。

方式

方式名

显示列*行数和颜色

0

BW40

40*25黑白显示

1

C40

40*25彩色显示

2

BW80

80*25黑白显示

3

C80

80*25彩色显示

7

MONO

80*25单色显示

-1

LASTMODE

上一次的显示方式

一般建议使用C80或者C40的显示方式。LASTMODE方式指上一次设置的文本显示方式,它常用于在图形方式到文本方式的切换。

2.文本方式颜色控制函数

a.文本属性设置函数     Void textattr(int attr);

该函数设置文本显示的属性,包括字符显示颜色(前景色),背景色及字符显示是否闪烁等,其参数可以用一个字节,即8位数来描述,各位含义如下表。

闪烁

绿

加亮

绿

BLINK

R

G

B

I

R

G

B

闪烁

背景色

前景色

其中低四位用来设置字符显示颜色(对应颜色值0~15),4~6为用来设置显示背景色(对应颜色值0~7),第七位最高,用来显示的字符是否闪烁。

例:蓝底红字             textattr(RED+(BLUE<<4));

    白底蓝字(闪)       textattr((WHITE<<4)+BLUE_BLINK);

    或(方式值)         textattr(128+1+(15<<4));

    或(十六进制)       textattr(0xf1);

 

颜色表

颜色名

显示色

用处

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

闪烁

用于前景色

 

b.文本字符颜色设置函数   void textcolor(int color);

该函数设置文本字符颜色,即是前景色,只能在彩色显示的模式下才可进行。参数可以是方式值也可以是大写的方式名(按颜色表为准)。

c.文本背景色设置函数     void textbackfround(int color);

该函数设置文本背景色,只能在彩色显示的模式下才可进行。参数可以是方式值也可以是大写的方式名(只能是颜色表前八种颜色)。

d.高亮度显示字符         void highvideo(void);

e.低亮度显示字符         void lowvideo(void);

f.通常亮度显示字符        void normvideo(void);

3.窗口设置和文本输出函数

a.窗口设置函数    void window(int x1,int y1,int x2,int y2);

其中(x1,y1)为窗口左上角坐标,(x2,y2)为窗口右下角坐标,这些坐标以整个屏幕为参考系。当定义窗口时,若定义坐标超过屏幕坐标界限(即显示模式的界限),则该窗口不会建立。

利用窗口函数可以在屏幕上定义多个不同的窗口,以显示不同的信息。定义一个窗口后,前面所讲过的函数textattr,textcolortextbackground仅对此窗口起作用,窗口以外不受影响。当定义多个窗口后,上文中函数的作用域仅为最后一个定义的窗口。

b.控制台文本输出函数

int cprintf(char *format,…);

int cputs(char *str);

int cputch(int ch);

这三个输出函数不同于标准输出函数printf之类,它们受窗口的控制,窗口内显示的光标就是他们开始的位置,当输出行右边超过窗口的左边界时,自动移动到窗口内下一行开始输出,当输出到窗口底部边界时,窗口内的内容将自动上卷(类似于翻页),直至输出完为止。

4.清屏和光标操作函数

a.清屏函数

void clrscr(void);       清除窗口中文本

void clreol(void);       清除当前窗口中从光标开始位置到本行结尾的所有字符(但不改变光标位置)

void delline(void);      清除光标所在那一行字符

b.光标操作函数

void gotoxy(int x,int y);

该函数把光标移动到窗口内的(x,y)处,x,y坐标是相对于窗口而言,它多和cprintf函数配合,以指定输出开始位置。

5.屏幕文本移动与存储函数

a.屏幕文本移动函数     void movetext(int x1,inty1,int x2,int y2,int x3,int y3);

该函数是将坐标起始为(x1,y1)终止为(x2,y2)的矩形方块内文本拷贝到左上角坐标为(x3,y3)的新矩形框内,这里x,y的坐标是以整个屏幕为窗口坐标系,该函数与开设的窗口无关,且原来矩形区文本不变。

b屏幕文本存储函数     void gettext(int x1,int y1,int x2,int y2,void *buffer);

该函数是将坐标起始为(x1,y1)终止为(x2,y2)的矩形方块内文本拷贝到由buffer指针指向的一个内存缓冲区内。这个缓冲区大小可以计算,由于在屏幕上显示的一个字符占两个字节(一个是字符本身的ASCII码,第二个字节是属性字节,表示其显示的前景色,背景色以及是否闪烁等)

缓冲取字节总数=矩形内行数*每行列数*2

c.屏幕文本取出函数     void puttext(int x1,int y1,int x2,int y2,void *buffer);

该函数是将把buffer指针指向的缓冲区内所存文本复制到屏幕上以坐标起始为(x1,y1)终止为(x2,y2)的矩形方块内。

6.状态查询函数

a.屏幕文本显示有关信息的函数

void gettextinfo(struct texy_info *f);

这里的text_info是在conio.h头文件中定义的一个结构,该结构的定义是

Struct text_info

{

       unsigned char winleft;                  /*窗口左上角x坐标*/

       unsigned char wintop;                  /*窗口左上角y坐标*/

       unsigned char winright;                 /*窗口右下角x坐标*/

       unsigned char winbottom;               /*窗口左下角x坐标*/

       unsigned char attributes;                /*文本属性*/

       unsigned char normattr;                 /*通常属性*/

       unsigned char currmode;                /*当前文本方式*/

       unsigned char screenheight;              /*屏高*/

       unsigned char screenwidth;              /*屏宽*/

       unsigned char curx;                     /*当前光标的x*/

       unsigned char curyt;                     /*当前光标的y*/

b.当前光标位置的函数

int wherex(void);

int wherey(void);

通过这两个函数可分别得到当前窗口中光标的xy坐标

 

第三章: 实例分析

文本下拉框设计

Code:
  1. /*学生用户信息窗体坐标*/           
  2.   
  3. #define X1 20                    
  4.   
  5. #define Y1 2                                 
  6.   
  7. #define X1_LENTH 10          
  8.   
  9. /*这里可以通过修改坐标来实现弹出的窗口的位置变化,如当前,即框是画在(20.2)的位置上,框长10个字符,宽2个字符。*/  
  10.   
  11.     
  12.   
  13. #define Y1_LENTH 1   
  14.   
  15. /*学生用户信息函数*/  
  16.   
  17. int information_file()   
  18.   
  19. {   
  20.   
  21.     int key_BOARD,y,x,x1_lenth;   
  22.   
  23.     window(X1,Y1,(X1+X1_LENTH),(Y1+Y1_LENTH));   
  24.   
  25.     textbackground(LIGHTGRAY);   
  26.   
  27.     clrscr();   
  28.   
  29.     textcolor(WHITE);      //背景色设为浅灰色,前景色白色,输出两个选项:1.Editor,2.Back   
  30.   
  31.     cprintf("1.Editor/r/n");   
  32.   
  33.     cprintf("2.Back");   
  34.   
  35.     x=X1;   
  36.   
  37.     y=Y1;   
  38.   
  39.     x1_lenth=X1_LENTH;   
  40.   
  41.     nowbar_file(x,y,x1_lenth);   
  42.   
  43.     gotoxy(1,1);   
  44.   
  45.     for(;key_BOARD!=KEY_ENTER;)  //进入一个以ENTER键为退出的FOR循环当中,   
  46.   
  47.                                                                  //CASE-DOWN是键盘的下移键,CASE-UP是键盘的上                                                                   //移键,通过BAR函数的调用来实现光标的显示。   
  48.     
  49.   
  50.     
  51.   
  52.     {      
  53.   
  54.         key_BOARD=key();   
  55.   
  56.         switch(key_BOARD){   
  57.   
  58.         case KEY_DOWN:{   
  59.   
  60.         ++y;   
  61.   
  62.         if(y==(Y1+Y1_LENTH+1)) y=Y1;   
  63.   
  64.         nowbar_file(x,y,x1_lenth);   
  65.   
  66.         if(y!=Y1) nowbardown_file(x,y,x1_lenth);   
  67.   
  68.         else nowbardown_file(x,Y1+Y1_LENTH+1,x1_lenth);   
  69.   
  70.         gotoxy(1,(y-Y1+1));   
  71.   
  72.         break;}   
  73.   
  74.         case KEY_UP:{   
  75.   
  76.         --y;   
  77.   
  78.         if(y==(Y1-1)) y=Y1+Y1_LENTH;   
  79.   
  80.         nowbar_file(x,y,x1_lenth);   
  81.   
  82.         if(y!=(Y1+Y1_LENTH)) nowbarup_file(x,y,x1_lenth);   
  83.   
  84.         else nowbarup_file(x,Y1-1,x1_lenth);   
  85.   
  86.         gotoxy(1,(y-Y1+1));   
  87.   
  88.         break;}   
  89.   
  90.         }   
  91.   
  92.     };   
  93.   
  94.     return y;   
  95.   
  96. }   
  97.   
  98. /*登陆函数*/  
  99.   
  100. void nowbar(int y)   
  101.   
  102. {   
  103.   
  104.     int i;   
  105.   
  106.     typedef struct textl_struct   
  107.   
  108. {   
  109.   
  110.     unsigned char ch;   
  111.   
  112.     unsigned char attr;   
  113.   
  114. }texel;   
  115.   
  116.     texel t;   
  117.   
  118.     for(i=36;i<=46;i++)   
  119.   
  120. {   
  121.   
  122.     gettext(i,y,i,y,&t);   
  123.   
  124.     t.attr=(BLUE<<4)+WHITE;   
  125.   
  126.     puttext(i,y,i,y,&t);   
  127.   
  128. };   
  129.   
  130.     return;   
  131.   
  132. }   
  133.   
  134. void nowbardown(int y)   
  135.   
  136. {   
  137.   
  138.     int i;   
  139.   
  140.     typedef struct textl_struct   
  141.   
  142. {   
  143.   
  144.     unsigned char ch;   
  145.   
  146.     unsigned char attr;   
  147.   
  148. }texel;   
  149.   
  150.     texel t;   
  151.   
  152.     y--;   
  153.   
  154.     for(i=36;i<=46;i++)   
  155.   
  156. {   
  157.   
  158.     gettext(i,y,i,y,&t);   
  159.   
  160.     t.attr=(RED<<4)+WHITE;   
  161.   
  162.     puttext(i,y,i,y,&t);   
  163.   
  164. };   
  165.   
  166.     return;   
  167.   
  168. }   
  169.   
  170. void nowbarup(int y)   
  171.   
  172. {   
  173.   
  174.     int i;   
  175.   
  176.     typedef struct textl_struct   
  177.   
  178. {   
  179.   
  180.     unsigned char ch;   
  181.   
  182.     unsigned char attr;   
  183.   
  184. }texel;   
  185.   
  186.     texel t;   
  187.   
  188.     y++;   
  189.   
  190.     for(i=36;i<=46;i++)   
  191.   
  192.     {   
  193.   
  194.     gettext(i,y,i,y,&t);   
  195.   
  196.     t.attr=(RED<<4)+WHITE;   
  197.   
  198.     puttext(i,y,i,y,&t);   
  199.   
  200. };   
  201.   
  202. return;   
  203.   
  204. }   
  205.   
  206.     
  207.   
  208.     
  209.   

 

原创粉丝点击