C指针原理(67)-Ncurses-文本终端的图形

来源:互联网 发布:剑三道姑捏脸数据 编辑:程序博客网 时间:2024/04/28 23:03

麦好的AI乐园博客所有内容是原创,如果转载请注明来源

http://blog.csdn.net/myhaspl/


case 9:

top = (PANEL *)panel_userptr(top);

top_panel(top);

update_panels();

doupdate();

nowwinid=(++nowwinid)%3;

sprintf(filename,"myed%d.dat",nowwinid);

break;

                        case KEY_F(10):

                                //存盘

                                mvprintw(LINES-3,2,"                     ");

                                mvprintw(LINES-3,2,"保存当前内容吗?     ");

                                mvprintw(LINES-2,2,"    ");

                                mvprintw(LINES-1,2,"     \n");

                                refresh();

                                ans=getch();

                                if (ans=='Y' ||ans=='y')

                                {

                                        mvprintw(LINES-3,2,"                     ");

                                        fp1 = fopen(filename,"wb");

                                        if (fp1!=NULL){

                                                int jg= putwin(mywins[nowwinid],fp1);

                                                fclose(fp1);

                                                if (jg==OK)  mvprintw(LINES-1,2,"保存成功!\n");

                                        }

                                        mvprintw(LINES-3,2,"保存当前内容吗?     ");

                                        mvprintw(LINES-2,2,"\n");

                                        refresh();

                                }else

                                        mvprintw(LINES-2,2,"\n");

                                        refresh();

                                break;

                        case KEY_F(9):

                                //读取存盘

                                mvprintw(LINES-3,2,"                    ");

                                mvprintw(LINES-3,2,"读取保存内容吗?    ");

                                mvprintw(LINES-2,2,"    ");

                                mvprintw(LINES-1,2,"     \n");

                                refresh();

                                ans=getch();

                                if (ans=='Y' ||ans=='y')

                                {

                                        if (isExist(filename)) {

                                        fp2 = fopen(filename,"rb");

                                        if (fp2!=NULL){

                                                WINDOW *newwin=getwin(fp2);

                                                if (newwin!=NULL) {

                                                        WINDOW *temp=mywins[nowwinid];

                                                        mywins[nowwinid]=newwin;

delwin(temp);

PANEL *temppan=mypanels[nowwinid];

mypanels[nowwinid] = new_panel(mywins[nowwinid]);

del_panel(temppan);

set_panel_userptr(mypanels[0],mypanels[1]);

set_panel_userptr(mypanels[1],mypanels[2]);

set_panel_userptr(mypanels[2],mypanels[0]);

top = mypanels[nowwinid];

top_panel(top);

update_panels();

doupdate();

                                                        mvprintw(LINES-1,2,"读取成功!\n");

 

                                                }

                                                fclose(fp2);

                                        }

                                        }

 

                                        mvprintw(LINES-3,2,"读取保存内容吗?    ");

                                        mvprintw(LINES-2,2,"\n");

                                        refresh();

                                }else

                                        mvprintw(LINES-2,2,"\n");

                                        refresh();

                                break;

                        case KEY_F(12):

                                //删除某行

                                wdeleteln(mywins[nowwinid]);

                                winsertln(mywins[nowwinid]);

                                box(mywins[nowwinid],ACS_VLINE,ACS_HLINE);

                                break;

                        case KEY_DC:

                                //删除某字符

                                mvwprintw(mywins[nowwinid],y,x," ");

                                break;

                        default:

                                mvwprintw(mywins[nowwinid],y,x,"%c",c);

                                ++x;

                                if (x>=width-1){

                                        ++y;

                                        x=1;

                                }

                                if (y>=height-1){

                                        y=1;

                                }

doupdate();

                }

        }

return 0;

}

dp@dp:~/cursestest % gcc -lncursesw -lpanel a.c -o mytest

dp@dp:~/cursestest % ./mytest

编写含有表单的程序,一般步骤如下:

1. 初始化并进入curses

2. 用new_field()函数创建表单域。你可以指定域的高度,宽度以及它在表单中的位

置。

3. 指定已创建的表单域所作用的表单,并用new_form()函数创建表单。

4. 用post_form()函数来递送表单,并刷新屏幕。

5. 用一个循环来处理用户请求,通过form_driver()函数对表单做相应的更新。

6. 用unpost_form()函数取消表单的递送。

7. 用free_form()函数释放已分配给表单的内存。

8. 用free_field()函数释放已分配给菜单项的内存。

9. 退出curses 模式

下面演示了表单的操作基础

#include <form.h>

int main()

FIELD *field[3];

FORM *my_form;

int ch;

/* 初始化curses */

initscr();

cbreak();

noecho();

keypad(stdscr, TRUE);

/* 初始化表单域*/

field[0] = new_field(1, 10, 4, 18, 0, 0);

field[1] = new_field(1, 10, 6, 18, 0, 0);

field[2] = NULL;

/* 设置表单域*/

set_field_back(field[0],A_UNDERLINE); /* 为选项打印一条下滑线*/

field_opts_off(field[0],O_AUTOSKIP);

/* 在域(输入框)填满后光标不会自动跳到下一个表单域*/

set_field_back(field[1],A_UNDERLINE);

field_opts_off(field[1],O_AUTOSKIP);

/* 创建并递送表单*/

my_form = new_form(field);

post_form(my_form);

refresh();

mvprintw(4, 10, "name:");

mvprintw(6, 10, "age:");

refresh();

move(4,15);

/* 用循环获取用户请求,F12退出*/

while((ch = getch()) != KEY_F(12))

switch(ch)

case KEY_DOWN:

/* 跳至下一个表单域*/

form_driver(my_form,REQ_NEXT_FIELD);

/* 跳到当前缓冲的末尾*/

/* 精确地在输入最后一个后字符跳出这个表单域*/

form_driver(my_form,REQ_END_LINE);

break;

case KEY_UP:

/* 移动到前一个表单域*/

form_driver(my_form,REQ_PREV_FIELD);

form_driver(my_form,REQ_END_LINE);

break;

default:

/* 如果输入的是普通字符, 就把它打印出来*/

form_driver(my_form,ch);

break;

}

}

/* 取消表单并释放内存*/

unpost_form(my_form);

free_form(my_form);

free_field(field[0]);

free_field(field[1]);

endwin();

return 0;

}

dp@dp:~/cursestest % gcc -lncursesw -lform b.c -o mytest

dp@dp:~/cursestest % ./mytest


0 0
原创粉丝点击