ncurses programming howto 书中源代码-6

来源:互联网 发布:javascript忍者秘籍 编辑:程序博客网 时间:2024/06/10 00:32

/*
 * =====================================================================================
 *
 *       Filename:  16_5.c
 *
 *    Description:  move and change panel's size
 *
 *        Version:  1.0
 *        Created:  2010骞?9鏈?8鏃?14鏃?0鍒?6绉? *       Revision:  none
 *       Compiler:  gcc
 *
 *         Author:  cdutyangshaokun@163.com
 *        Company:  College of Information Engineering of CDUT
 *
 * =====================================================================================
 */
#include<string.h>
#include<stdlib.h>
#include<panel.h>
typedef struct _PANEL_DATA
{
    int x,y,w,h;
    char label[80];
    int label_color;
    PANEL *next;
}PANEL_DATA;
#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);
void set_user_ptrs(PANEL **panels,int n);

int main()
{
    WINDOW *my_wins[3];
    PANEL *my_panels[3];
    PANEL_DATA *top;
    PANEL *stack_top;
    WINDOW *temp_win,*old_win;
    int ch;
    int newx,newy,neww,newh;
    int size=FALSE,move=FALSE;

    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_user_ptrs(my_panels,3);
    update_panels();

    attron(COLOR_PAIR(4));
    mvprintw(LINES-3,0,"Use 'm' for moving ,'r' for resizing");
    mvprintw(LINES-2,0,"Use tab to browse through the windows(f2 to exit)");
    attroff(COLOR_PAIR(4));
    doupdate();

    stack_top=my_panels[2];
    top=(PANEL_DATA *)panel_userptr(stack_top);
    newx=top->x;
    newy=top->y;
    neww=top->w;
    newh=top->h;
    while((ch=getch())!=KEY_F(2))
    {
        switch(ch)
        {
            case 9:
                top=(PANEL_DATA*)panel_userptr(stack_top);
                top_panel(top->next);
                stack_top=top->next;
                top=(PANEL_DATA*)panel_userptr(stack_top);
                newx=top->x;
                newy=top->y;
                neww=top->w;
                newh=top->h;
                break;
            case 'r':
                size=TRUE;
                attron(COLOR_PAIR(4));
                mvprintw(LINES-4,0,"Enter Resizing: Use Arrow keys to resize and press <ENTER>to end resizing");
                refresh();
                attroff(COLOR_PAIR(4));
                break;
            case 'm':
                attron(COLOR_PAIR(4));
                mvprintw(LINES-4,0,"Enter Mvoing:Use Arrow Keys to Move and press <ENTER> to end move");
                refresh();
                attroff(COLOR_PAIR(4));
                move=TRUE;
                break;
            case KEY_LEFT:
                if(size==TRUE)
                {
                    --newx;
                    ++neww;

                }
                if(move==TRUE)
                {
                    --newx;
                }
                break;
            case KEY_RIGHT:
                if(size==TRUE)
                {
                    ++newx;
                    --neww;
                }
                if(move==TRUE)
                {
                    ++newx;

                }
                break;
            case KEY_UP:
                if(size==TRUE)
                {
                    --newy;
                    ++newh;
                }
                if(move==TRUE)
                {
                    --newy;
                }
                break;
            case KEY_DOWN:
                if(size==TRUE)
                {
                    ++newy;
                    --newh;
                }
                if(move==TRUE)
                    ++newy;
                break;
            case 10:/*enter 瀵瑰簲鐨勭紪鍙?/
                move(LINES-4,0);
                clrtoeol();
                refresh();
                if(size==TRUE)
                {
                    old_win=panel_window(stack_top);
                    temp_win=newwin(newh,neww,newy,newx);
                    replace_panel(stack_top,temp_win);
                    win_show(temp_win,top->label,top->label_color);
                    delwin(old_win);
                    size=FALSE;
                   
                }
                if(move==TRUE)
                {
                    move_panel(stack_top,newy,newx);
                    move=FALSE;
                }
                break;
        }
        attron(COLOR_PAIR(4));
        mvprintw(LINES-3,0,"Use 'm' for moving ,'r' for resizing");
        mvprintw(LINES-2,0,"Use tab to browse through the windows(f2 to exit)");
        attroff(COLOR_PAIR(4));
        refresh();
        update_panels();
        doupdate();
        if((ch=getch()==KEY_F(2)))
        {
            endwin();
            return 0;
        }
    }

}
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();
}
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 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 set_user_ptrs(PANEL **panels,int n)
{
    PANEL_DATA *ptrs;
    WINDOW *win;
    int x,y,w,h,i;
    char temp[80];
    ptrs=(PANEL_DATA*)calloc(n,sizeof(PANEL_DATA));
    for(i=0;i<n;i++)
    {
        win=panel_window(panels[i]);
        getbegyx(win,y,x);
        getmaxyx(win,h,w);
        ptrs[i].x=x;
        ptrs[i].y=y;
        ptrs[i].w=w;
        ptrs[i].h=h;
        sprintf(temp,"Window number yskcg %d",i+1);
        strcpy(ptrs[i].label,temp);
        ptrs[i].label_color=i+1;
        if(i+1==n)
        {
            ptrs[i].next=panels[0];
        }
        else
            ptrs[i].next=panels[i+1];
        set_panel_userptr(panels[i],&ptrs[i]);
    }
}

原创粉丝点击