您现在的位置: 中国男护士网 >> 考试频道 >> 计算机等级 >> 二级辅导 >> C语言 >> 辅导 >> 正文    
  C语言程序设计(第9章实用编程技巧)2 【注册男护士专用博客】          

C语言程序设计(第9章实用编程技巧)2

www.nanhushi.com     佚名   不详 

9.2 菜单设计技术
    菜单在用户编写的程序中占据相当一部分内容。设计一个高质量的菜单,不仅能使系统美观,更主要的是能够使操作者使用方便,避免一些误操作带来的严重后果。

9.2.1 下拉式菜单的设计
    下拉式菜单是一个窗口菜单,它具有一个主菜单,其中包括几个选择项,主菜单的每一项又可以分为下一级菜单,这样逐级下分,用一个个窗口的形式弹出在屏幕上,一旦操作完毕又可以从屏幕上消失,并恢复原来的屏幕状态。
    设计下拉式菜单的关键就是在下级菜单窗口弹出之前,要将被该窗口占用的屏幕区域保存起来,然后产生这一级菜单窗口,并可用光标键选择菜单中各项,用回车键来确认。如果某选择项还有下级菜单,则按同样的方法再产生下一级菜单窗口。
    用Turbo C 在文本方式时提供的函数gettext( ) 来放屏幕规定区域的内容,当需要时用puttext( )函数释放出来,再加上键盘管理函数bioskey( ),就可以完成下拉式菜单的设计。
    程序menu1.c是一个简单拉式菜单。运行时在屏幕上一行显示主菜单的内容,当按ALT+F则进入File子菜单,然后可用光标键移动色棒选择操作,用回车确认。用Esc键退出主菜单,并可用ALT+X退出菜单系统。

[例9-9] 下拉式菜单menu1.c
/*下拉式菜单menu1.c*/
#include<conio.h>
#include<stdio.h>
#include<stdlib.h>
#include<bios.h>
void main(void)
{
    int i,key,key0,key1,y,test;
    char *m[ ]={"File","Edit","Run","Compile","Projsct","Options","Debug","Break/watch "}; /*定义主菜单的内容*/
    char *f[ ]={"Load F3", /* 定义FILE 子菜单的内容*/
    "Pick ALT+F3",
    "New",
    "Save F2",
    "Write to",
    "Directory",
    "Change dir",
    "Os shell",
    "Quit ALT+X"};
    char buf[16*10*2],buf1[16*2]; /* 定义保存屏幕区域的数组变量*/
    textbackground(BLUE); /* 设置文本屏幕背景色*/
    clrscr( ); /* 屏幕背径着色*/
    window(1,1,80,1); /* 定义一个文本窗口*/
    textbackground(WHITE); /*设置窗口背景色*/
    textcolor(BLACK);
    clrscr( );
    window(1,1,80,2);
    for(i=0;i<8;i++)
        cprintf("%s",m[i]); /*显示主菜单的内容*/
    while(1)
    {
        key=0;
        while(bioskey(1) == 0); /*等待键盘输入*/
            key = bioskey(0); /*取键盘输入码*/
        key = key&0Xff? 0:key>>8; /*只取扩充键码*/
        if(key == 45) eXit(0); /*如果按ALT+X 键则退出*/
            if(key == 33) /* 如果按ALT+F 则显示子菜单*/
            {
                textbackground(BLACK);
                textcolor (WHITE);
                gotoxy(4,1);
                cprintf("%s",m[0]);
                gettext(4,2,19,11,buf);/*保存窗口区域的在原有内容*/
                window(4,2,19,11);
                textbackground(WHITE);
                textcolor(BLACK);
                clrscr( );
                window(4,2,19,12);
                gotoxy(1,1); /*作一个单线形边框*/


                putch(0xff);
                for(i=2;i<10;i++)
                {
                    gotoxy(1,i); putch(0×b3);
                    gotoxy(16,i); putch(0×b3);
                }
                gotoxy(1,10);
                putch(0Xc0);
                for(i=2;i<16;i++)
                    putch(0Xc4);
                putch(0Xd9);
                for(i=2;i<10;i++)
                {
                    gotoxy(2,i);
                    cprintf("%s",f[i-1]);
                }
                gettext(2,2,18,3,buf1);
                textbackground(BLACK);
                textcolor(WHITE);
                gotoxy(2,2);
                cprintf("%s",f[0]);
                y=2;
                key1=0;
                while((key0!=27)&&(key1!=45)&&(key0!=13))
                {/*输入为ALT+X,回车或ESC 键退出循环*/
                    while(bioskey(1)==0); /*等待键盘输入*/
                        key0=key1=bioskey(0); / *取键盘输入码* /
                        key0=key0&0Xff; / *只取扩充码* /
                        key1=key1&0Xff? 0:key1>>8;
                        if(key1==72||key1==80) /*如果为上下箭头键*/
                        {
                            puttext(2,y,18,y+1,buf1); /*恢复原来的信息*/


                            if(key1==72) y=y==2? 9:y-1; /*上箭头处理*/
                                if(key1==80) y=y==9? 2:y+1; /*下箭头处理*/
                                    getteXt(2,y,18,y+1,buf1); /*保存新色棒前产生这一位置屏幕内容*/
                            textbackground(BLACK); /*产生新色棒*/
                            textcolor(WHITE);
                            gotoxy(2,y);
                            cprintf("%s",f[y-1]);
                        }
                    }
                    if(key1 == 45) eXit(0); /*按ALT+X 退出*/
                        if(key0 == 13) /*回车按所选菜单项进行处理*/
                        {
                            switch(y)
                            {
                                case 1:
                                    break;
                                case 2:
                                    break;
                                case 9:
                                    eXit(0);
                                default:
                                    break;


                            }
            }
            else /*按E S C 键返回主菜单*/
            {
                window(1,1,80,2);
                puttext(4,2,19,11,buf); /*释放子菜单窗口占据的屏幕原来内容*/
                textbackground(WHITE);
                textcolor(BLACK);
                gotoxy(4,1);
                cprintf("%s",m[0]);
            }
        }
    }
}

9.2.2 选择式菜单的设计
    所谓选择式菜单,就是在屏幕上出现一个菜单,操作者可根据菜单上所提供的数字或字母按相应的键去执行特定的程序,当程序执行完后又回到主菜单上。
    这种菜单编制简单,操作方便,使用灵活,尤其适用于大型管理程序。如果在自动批处理文件上加入这种菜单后,操作者可根据菜单上的提示,进行相应的操作,这样可以简化许多步骤,对一般微机用户来说是比较适合的。

[例9-10] 选择式菜单程序menu2.c
#include<stdio.h>
#include<stdlib.h>
#include<conio.h>
main( )
{
    char ch;
    int i;
    do {
        system("cls");
        printf("\n\t1. into Turbo C ");
        printf("\n\t2. into Windows" );
        printf("\n\t3. into Wps");
        printf("\n\t4. into Dbase") ;
        printf("\n\t0. Quit \n\n");
        printf("\t Please select:");
        ch=getch( );
        switch(ch)
        {
            case '1': system("tc");break;
            case '2': system("win");break;
            case '3': system("wps");break;
            case '4': system("dbase");break;
            case '0': system("cls");eXit(1);
            default:
                printf("\n\t*** wrong !!! ***\n");
                for (i=0;i<600;i++);
                { ; }
        }
    }
    while(1);
}

9.2.3 实现阴影窗口的技巧
    目前,许多应用软件都采用了输出窗口技术,有的甚至使用了带有阴影的输出窗口。这种技术给人们以新鲜醒目的感觉,可达到事半功倍的作用。
    程序menu3.c是一个阴影窗口的例子。其中用到两个自编函数,一个是建立窗口函数set_win( ),另一个是建立带有阴影部分的窗口函数set_bkwin( )。这两个函数需要传递以下几个参数:
    int X1,y1,X2,y2,b,bc,tc
    char *head
    其中:x1、y1、x2、y2决定了窗口边框大小, b用来选择窗口的类型;当b = 0时,无边框,当b =1时,单线边框,当b = 2时,上下边框为双线,左右边框为单线,当b = 3时,双线边框,当b = 4时,上下边框为单线,左右边框为双线;参数b c用来决定窗口的背景颜色,其范围为0 ~ 7;参数t c决定窗口内字符的颜色,其范围为0 ~ 15; 参数head为窗口名称。


    在文本状态下,一个字符在屏幕缓冲区内要占用2个字节来存储。且字符内容在前属性在后,顺序存储。所谓属性,就是字符的背景颜色和字符颜色,我们可以通过改变其属性字节,来实现窗口的阴影。

[例9 - 11] 阴影窗口程序menu3.c
#include<stdio.h>
#include<string.h>
#include<conio.h>
#define screen (*screen_ptr)
typedef struct texel_struct
{
    unsigned char attr;
}teXel;
typedef texel screen_array[25][80];
screen_array far *screen_ptr = (screen_array far *) 0Xb800;
void set_win( int X1,int y1, int X2,int y2,int b,int bc, int tc,char *head);
void set_bkwin(int X1,int y1,int X2,int y2,int b,int bc,int tc,char *head);
void main(void )
{
    set_bkwin(1,2,25,18,2,2,1,"window");
    getch();
}
void set_bkwin(X1,y1,X2,y2,b,bc,tc,head)
int X1, y1, X2, y2, b, bc, tc;
char *head;
{
    int i, j;
    for(i=X1+1;i<X2+2;i++)
    {
        for(j=y2;j<y2+1;j++)
        screen[j][i].attr=8;
    }
    for(i=X2+1;i<X2+2;i++)
    {
        for(j=y1;j<y2+1;j++)
            screen[j][i].attr=8;
    }
    set_win(X1,y1,X2,y2,b,bc,tc,head);
}
void set_win(X1,y1,X2,y2,b,bc,tc,head)
int X1,y1,X2,y2,b,bc,tc;
char *head;
{
    int i,j;
    int c[4][6]={
        {0Xda, 0Xc4, 0Xbf,0Xb3, 0Xc0, 0Xd9 },
        {0Xd5, 0Xcd, 0Xb8,0Xb3, 0Xd4, 0Xbe },
        {0Xc9, 0Xcd, 0Xbb,0Xba, 0Xc8, 0Xbc },
        {0Xd6, 0Xc4, 0Xb7,0Xba, 0Xb3, 0Xbd },
    };
    j=(X2-X1)/2-strlen(head)/2+X1+1;
    textbackground(bc);
    textcolor(tc);
    if(b!=0)
    {
        window(1,1,80,25);
        gotoxy(X1,y1);
        putch(c[b-1][0]);
        for(i=X1+1;i<X2;i++)
            putch(c[b-1][1]);
        putch(c[b-1][2]);
        for(i=y1+1;i<y2;i++)
        {
            gotoxy(X1,i);
            putch(c[b-1][3]);
            gotoxy(X2,i);
            putch(c[b-1][3]);
        }
        gotoxy(X1,y2);
        putch(c[b-1][4]);
        for(i=X1+1;i<X2;i++)
            putch(c[b-1][1]);
    }
    if(head[0]!=NULL)
    {
        gotoxy(j,y1);
        textcolor(WHITE);
        textbackground(BLUE);
        cprintf("%s",head);
    }
    textcolor(tc);
    textbackground(tc);
    window(X1+1,y1+1,X2-1,y2-1);
    clrscr( );
}

 

文章录入:杜斌    责任编辑:杜斌 
  • 上一篇文章:

  • 下一篇文章:
  • 【字体: 】【发表评论】【加入收藏】【告诉好友】【打印此文】【关闭窗口
     

    联 系 信 息
    QQ:88236621
    电话:15853773350
    E-Mail:malenurse@163.com
    免费发布招聘信息
    做中国最专业男护士门户网站
    最 新 热 门
    最 新 推 荐
    相 关 文 章
    没有相关文章
    专 题 栏 目