ncurses programming howto 书中源代码-5

/*
 * =====================================================================================
 *
 *       Filename:  16_3.c
 *
 *    Description:  panels
 *
 *        Version:  1.0
 *        Created:  2010骞?9鏈?7鏃?19鏃?7鍒?0绉? *       Revision:  none
 *       Compiler:  gcc
 *
 *         Author:  , [email protected]
 *        Company:  College of Information Engineering of CDUT
 *
 * =====================================================================================
 */
#include<panel.h>
#include<string.h>
#define NLINES 10
#define NCOLS 40

void init_wins(WINDOW **wins,int n);
void win_show(WINDOW *win,char *label,int label_color);
void print_in_middle(WINDOW *win,int starty,int startx,int width,char *string,chtype color);

int main()
{
    WINDOW *my_wins[3];
    PANEL *my_panels[3];
    PANEL *top;
   
    int ch;
   
    initscr();
    start_color();
    cbreak();
    noecho();
    keypad(stdscr,TRUE);
   
    init_pair(1,COLOR_RED,COLOR_BLACK);
    init_pair(2,COLOR_GREEN,COLOR_BLACK);
    init_pair(3,COLOR_BLUE,COLOR_BLACK);
    init_pair(4,COLOR_CYAN,COLOR_BLACK);

    init_wins(my_wins,3);

    my_panels[0]=new_panel(my_wins[0]);
    my_panels[1]=new_panel(my_wins[1]);
    my_panels[2]=new_panel(my_wins[2]);

    set_panel_userptr(my_panels[0],my_panels[1]);
    set_panel_userptr(my_panels[1],my_panels[2]);
    set_panel_userptr(my_panels[2],my_panels[0]);

    update_panels();

    attron(COLOR_PAIR(4));
    mvprintw(LINES-2,0,"Use tab to browse through the windows(F2 to exit)");
    attroff(COLOR_PAIR(4));
    doupdate();

    top=my_panels[2];

    while((ch=getch())!=KEY_F(2))
    {
        switch(ch)
        {
            case 9:
                top=(PANEL *)panel_userptr(top);
                top_panel(top);
                break;
        }
        update_panels();
        doupdate();
    }
    endwin();
    return 0;
}

void init_wins(WINDOW **wins,int n)
{
    int x,y,i;
    char label[80];
    y=2;
    x=10;
    for(i=0;i<n;i++)
    {
        wins[i]=newwin(NLINES,NCOLS,y,x);
        sprintf(label,"Window Number %d",i+1);
        win_show(wins[i],label,i+1);
        y+=3;
        x+=7;
    }
}

void win_show(WINDOW *win,char *label,int label_color)
{
    int startx,starty,height,width;
    getbegyx(win,starty,startx);
    getmaxyx(win,height,width);
    box(win,0,0);
    mvwaddch(win,2,0,ACS_LTEE);
    mvwhline(win,2,0,ACS_HLINE,width-2);
    mvwaddch(win,2,width-1,ACS_RTEE);
    print_in_middle(win,1,0,width,label,COLOR_PAIR(label_color));
}

void print_in_middle(WINDOW *win,int starty,int startx,int width,char *string,chtype color)
{
    int length,x,y;
    float temp;

    if(win==NULL)
        win=stdscr;
    getyx(win,y,x);
    if(startx!=0)
        x=startx;
    if(starty!=0)
        y=starty;
    if(width==0)
        width=80;
    length=strlen(string);
    temp=(width-length)/2;
    x=startx+(int)temp;
    wattron(win,color);
    mvwprintw(win,y,x,"%s",string);
    wattroff(win,color);
    refresh();
}

你可能感兴趣的:(ncurses programming howto 书中源代码-5)