欢迎您访问科普小知识本站旨在为大家提供日常生活中常见的科普小知识,以及科普文章!
您现在的位置是: 首页

汉字图形窗口界面设计方法及函数编程技巧

科普小知识 2023-11-16 22:27:21
...

摘要 该文讨论了汉字图形窗口界面设计的一般方法,给出了窗口生成,窗口管理,菜单生成与管理,鼠标与键盘管理等实现的子函数,并给出了部分c语言源程序。这些函数的组合可以设计出丰富的汉字图形窗口界面。

一、图形窗口设计函数

主要包括窗口生成与管理函数,如窗口生成,窗口打开,窗口关闭,窗口删除等。

1.窗口结构定义方法

typedef struct gwin {

int x0,y0,x1.y1; /*窗口位置及大小*/

int border; /*窗口边框类型*/

int wcolor; /*窗口背景颜色*/

char wstate; /*窗口状态标志*/

char far *buffer; /*指向窗口缓冲区指针*/

}gwin;

在gwin中,border为窗口的边框属性,可以根据不同要求设计出多种边框类型业,以美化窗口界面。

2.窗口子函数

窗口生成子函数:gwin * gwincreate(x0,y0,x1,y1,border,colo

r)

int x0,y0,x1,y1; /*窗口位置及大小*/

bordermode border; /*窗口边框类型*/

int color; /*窗口背景颜色*/

窗口显示子函数:gwindisplay(gwin *w)

w为用gwincreate生成的窗口指针,即此函数画出窗口。

窗口打开子函数:gwinopen(gwin * w)

此函数调用gwindisplay来显示窗口,并存储屏幕。WwW.11665.coM

窗口关闭子函数:gwinclose(gwin * w)

此函数关闭已打开的窗口,恢复屏幕,但此窗口数据还保存,可再次打开。

窗口删除子函数:gwinkill(gwin * w)此窗口彻底清除窗口,不可重新打开。

3.部分程序

下面给出实现上述功能的c语言程序

/*windows create*/

#include

#include

#include

#include

#include

#include

#define cr 0x0d

#define esc 0x1b

#define left 0x4b

#define right 0x4d

#define up 0x4d

#define down 0x50

#define open 1 /*窗口为打开状态*/

#define close 0 /*窗口为关闭状态*/

#define mouse 0 /*是否有鼠标移动*/

/*定义窗口边框类型*/

typedef enum {

noborder,/*普通窗口,系统默认值*/

tborder,/*窗口有凸边框类型*/

wborder,/*窗口有凹边框类型*/

twborder,/*窗口有凸凹边框类型*/

wtborder,/*窗口有凹凸边框类型*/

cborder,/*窗口有汉字边框类型*/

... /*其它窗口类型*/

}bordermode;

gwin * gwincreate(x0,y0,x1,y1,border,color)

int x0,y0,x1,y1;

bordermode border;

int color;

{

gwin *w;

w=malloc(sizeof(gwin));

w->x0=x0;

w->y0=y0;

w->x1=x1;

w->y1=y1;

if(border==noborder)w->border=noborder;

if(border==wborder)w->border=wborder;

if(border==tborder)w->border=tborder;

if(border==twborder)w->border=twborder;

if(border==wtborder)w->border=wtborder;

if(border==cborder)w->border=cborder;

w->wcoloe=color;

w->buffer=null;

return(w);

}

void gwindisplay(gwin * w)

{

if(w->border==noborder)drawgwin(w,noborder);

if(w->border==wborder)drawgwin(w,wborder);

if(w->border==tborder)drawgwin(w,tborder);

if(w->border==wtborder)drawgwin(w,twborder);

if(w->border==twborder)drawgwin(w,twborder);

if(w->border==cborder)drawgwin(w,cborder);

}

void gwinopen(gwin * w)

{

if(w->wstate==open)return 0;

w->buffer=(char far *)malloc((unsigned int))

-imagesize(w->x0,w->y0,w->x1,w->y1)

-getimage(w->x0,w->y0,w->x1,w->y1,w->buffer);

w->wstate=open;

gwindisplay(w);

}

void gwinclose(gwin * w)

{

if(w->wstate==close)return 0;

-putimage(w->x0,w->y0,w->buffer,-gpset);

free((char far *) w->buffer);

w->wstate=colse;

}

void gwinkill(gwin * w)

{

if(w->wstate==open)gwinclose(w);

free(w);

}

二、菜单窗口界面生成与管理子函数

1.菜单结构定义说明

typedef struct g

menu{

gwin * w; /*含有菜单的窗口*/

char * * chstring;/*菜单中汉字串指针*/

int xnum;/*水平方向菜单分布项*/

int ynum;/*垂直方向菜单分布项*/

int hzcolor/*汉字颜色*/

int mnow /*光标位置*/

int mtotal/*菜单总个数*/

}gmenu;

2.菜单生成与管理子函数

菜单生成子函数:gmenu * menucreate(x,y,xnum,ynum,border,h

zcolor,bcolor,chstring)

int x,y;/*菜单左上角位置*/

int xnum,ynum;/*菜单在x,y方向个数*/

bordermode border;/*菜单边框类型*/

int hzcolor; /*汉字颜色*/

int bcolor; /*菜单背景颜色*/

char * * chstring; /*汉字串*/

菜单打开子函数:menuopen(gmenu * m)

m为用menugreate生成的菜单直针。

菜单驱动子函数:menudrive(gmenu * m)

此函数提供用鼠标或键盘选择菜单项的方法。

菜单关闭子函数:menuclose(gmenu *m)

此函数关闭已打开的菜单,恢复屏幕,但此菜单数据还保存,可再次打开。

菜单删除子函数:menukill(gmenu * m)

此菜单被彻底清除,不可重新打开。

3.实现上述功能子函数的源程序代码

gmenu * menucreate(x,y,xnum,ynum,border,hzcolor,bcolor,c

hstring)

int x,y,xnum,ynum;

bordermode border;

int hzcolor,bcolor;

char * * chstring;

{

gwin *w,gmenu *m;

m=malloc(sizeof(gmenu));

m->=chstring=chstring;

m->=xnum=xnum;

m->=ynum=ynum;

m->=hzcolor=hzcolor;

m->=mnow=1

m->=mtotal=number_of_menu(m->=chstring);

w=(gwin *)gwincreate(x,y,x+xnum * longest(chstring),

y+(ynum-1)+c0,border,bcolor);

m->=w=w

return m;

}

其中,number_of_menu(string)为求串中菜单项个数的函数,longest(string)为求串中最长项长度的函数。

其它子函数可参照窗口函数设计出,此处限于篇幅,不再给出。

三、下拉式菜单设计方法

有了第一,第二节的窗口设计及菜单设计函数,可以很方便的定义出下拉式及弹出式菜单,菜单可以层层嵌套,主子关系及热键可以*定义,有了窗口及菜单函数,可以组合设计出风格迥异的应用程序界面。本节的子函数包括:根菜单生成(主菜单)、下拉式菜单生成、菜单连接、菜单初始化、菜单驱动、菜单关闭、菜单删除。

1.下拉式菜单结构定义方法

typedef struct pmenu{

gmenu * m;/*定义菜单*/

int pstate; /*下拉式菜单状态*/

int pid; /*菜单标识码*/

struct pmenu *father; /*定义父菜单*/

struct pmenu *son /*定义子菜单*/

char hotkey[maxson+1];/*定义热键*/

}pmenu;

2.下拉式菜单生成与管理子函数

根菜单生成子函数:pmenu *proot(pid,x,y,border,hzcolor,bco

lor,chstring)

int pid;/*根菜单标识码,一般为000*/

int x,y;/*菜单在x,y方向个数*/

bordermode border;/*菜单边框类型*/

int hzcolor;/*汉字颜色*/

int bcolor;/*菜单背景颜色*/

char * * chstring;/*汉字串*/

下拉式菜单生成子函数:pmenu *pcreate(pid,x,y,border,hzcol

or bcolor,chstring

参数含义同上,pid值一般取为100,200,300等,利用此函数可生成普通弹出式菜单。

菜单连接子函数:void plink(pmenu * p1,int n,pmenu * p2)

此函数建立两个菜单p1,p2之间的主次关系,p1为父菜单,p2为子菜单,执行此菜单,则把p2挂在了p1的第n个菜单项上。

下拉式菜单初始化子函数:pint();

菜单关闭子函数:pclose();

菜单删除子函数:pkill();

菜单中定义热键子函数:hotkey(pmenu *p1,int n,int vascii);

pmenu *p1;/*下拉式菜单p1*/

int n;/*菜单p1中菜单个数*/

int vascii;/*定义热键的ascii码值*/

利用此函数可定义弹出式菜单p1中任意项n的键盘热键,该键的ascii码值为vascii。

3.实现上述功能子函数的源程序代码

pmenu *rp,*cp;

pmenu * proot(pid,x,y,border,hzcolor,bcolor,chstring)

int pid,x,y;

bordermode border;

int hzcolor,bcolor;

char * * chstring;

{

pmenu *p;

int i;

rp=cp=malloc(sizeof(pmenu));

p->pstate=close;

p->pid=pid;

p->m=menucreate(x,y,num_of_menu(chstring),1,border,hzc

olor,bcolor,chstring);

p->father=null;

for(i=1;i

{

p->son[i]=null;

p->hotkey[i]=0;

}

return(p);

}

void plink(pmenu *p1,int n,pmenu *p2)

{

p1-son[n]=p2;

p2->father=p1;

}

其它子函数可参照菜单函数设计出,此处限于篇幅,不再给出。

四、其它辅助函数

计算菜单项个数的函数

int number_of_menu(char * * chstring)

{

int i;

for(i=0;chstring[i]!=null;i++);

return(i);

}

键盘与鼠标处理子函数

int get_key_mouse(int *x,int *y)

此函数用来同时接收键盘及鼠标,有按键时返回该键的ascii码,有鼠标操作时返回鼠标的x,y座标,提供给程序作处理。