LinuxSir.cn,穿越时空的Linuxsir!

 找回密码
 注册
搜索
热搜: shell linux mysql
查看: 1271|回复: 2

用ncurses生成的窗口怎样滚屏?

[复制链接]
发表于 2005-2-24 21:15:18 | 显示全部楼层 |阅读模式
我用ncurses生成的窗口来显示消息,如果消息超出了屏幕,就需要滚屏了
但是怎样才能只滚动窗口中的内容而窗口本身不动?
我用wsetscrreg设定了一个滚动区域,再用wscrl来滚动,虽然是滚动了,但是超出屏幕的文字也就不见了
如何使得屏幕的内容得以保存?
发表于 2008-4-18 13:36:04 | 显示全部楼层
#include <curses.h>
int main()
{
        initscr();
//    start_color();
           cbreak();
    noecho();
    keypad(stdscr, TRUE);

        WINDOW *win1,*win2;

        win1 = newwin(10,10,0,0);
        win2 = newwin(5,10,0,13);
        scrollok(win1, TRUE);
        scrollok(win2, TRUE);
        keypad(win2, TRUE);
//        wsetscrreg(win1, 2, 5);
//        idlok(win1,TRUE);
        box(win1,0,0);
        box(win2,0,0);
        refresh();
        wrefresh(win1);
        wrefresh(win2);
        long cur = 0;       
        long tmp_cur = 0;
        int win1_h = 10;
        int win2_h = 5;
        int x,y;
        int old_y = 0;
        long win_row = 0;

        int ch = 0;
        while(ch = wgetch(win2)){
               
                getyx(win1,y,x);
                if(old_y < y){
                        ++win_row;       
                }
               
                switch(ch){
                        case 'q':
                                goto end;
                        case KEY_UP:
                                if( cur > 0){
                                        --cur;
                                        copywin(win1, win2, cur, 0,0,0,4,9, FALSE);
                                }
                                break;
                        case KEY_DOWN:
                                if( cur < (win_row+1) - win2_h){
                                        ++cur;
                                        copywin(win1, win2, cur, 0,0,0,4,9, FALSE);
                                }
                                break;
                        default:
                                if(win_row+1 > win2_h)
                                        cur = (win_row+1) - win2_h;
                               
                                //copywin(win1, win2, cur, 0,0,0,4,9, FALSE);
                                waddch(win1, ch);
                                waddch(win2, ch);

                }

                old_y = y;
                //waddch(win2, ch);
                //waddch(win1, ch);
                //wrefresh(win1);
        }
       

                wrefresh(win2);
                //getch();
end:
                endwin();
}
回复 支持 反对

使用道具 举报

发表于 2008-4-20 23:56:42 | 显示全部楼层
curses库里有一个叫pad的结构,你可以查下它的相关资料

它的作用是建立一个所谓的逻辑屏幕,这个逻辑屏幕的设置可以远大于你电脑实际的屏幕,,完全可以把你的数据全部放这里,在你想滚屏按下一个键的时候,就截取这个逻辑屏幕的其中一部分显示出来就行了
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 返回顶部 返回列表