免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
楼主: owen22cn
打印 上一主题 下一主题

[SCO UNIX] curses问题,如何保存当前界面并刷新? [复制链接]

论坛徽章:
0
11 [报告]
发表于 2006-04-17 10:22 |只看该作者

继续讨论

兄弟我的问题可能没有说清楚,A和B都是用curses编程的应用,要的效果就是在A中一个菜单选择就直接进入B,退出B后回到刚才A的界面,所以

  1. system("testapp >/dev/null 2>&1;");
复制代码


这样肯定是不适用的。

至于窗口指针,MainWin,FormWin,BarWin都是按照curses标准方式创建了窗口的,源程序比较长,不能全部写出来,上面只是写了个类型定义。

如果只是System一下,那回到A就是黑屏,我的问题就是问如何能在从B回到A时立刻恢复A的屏幕。再重申一下,A,B都是curses程序,要的效果就是两个应用的界面互相切换。

谢谢各位!

论坛徽章:
0
12 [报告]
发表于 2006-04-17 10:39 |只看该作者

问题整理一下重发,谢谢大家

我目前编程碰到一个问题
1.在SCO Openserver系统下,有两个使用curses库编程生成的应用程序A和B。
2.A和B都是有实际显示界面的应用程序,用户是在这两个界面中进行操作的。
3.现在需要在A运行过程某个菜单选项中,选择就直接调用B(打开B的界面),我是用System("B");这个方法调用的。
4.在B执行完成退出后(关闭B的界面),返回A,但是这时A的界面就没有了,只有随着重新在A中的各项操作才慢慢的恢复回来。

问题:请问有什么办法能在调用B前保存A的当前界面,在B退出后能立即恢复A的界面呢?

有很多朋友出主意,基本是通过
touchwin(WINDOW *);
System("B");
wrefresh(WINDOW *);
方式,这三个函数的各种组合我都实验了,都没有效果,仍然是回到黑屏,请问大家有没有什么好方法,谢谢。

论坛徽章:
1
2015年辞旧岁徽章
日期:2015-03-03 16:54:15
13 [报告]
发表于 2006-04-17 11:33 |只看该作者
原帖由 owen22cn 于 2006-4-17 10:39 发表
我目前编程碰到一个问题
1.在SCO Openserver系统下,有两个使用curses库编程生成的应用程序A和B。
2.A和B都是有实际显示界面的应用程序,用户是在这两个界面中进行操作的。
3.现在需要在A运行过程某个菜单选项 ...


兄弟,这个很好办!

我记得不是很清楚了,你可以关注一下 wsave(WIN *w_sc) 看看,好像可以保存窗口显示信息的。

论坛徽章:
1
2015年辞旧岁徽章
日期:2015-03-03 16:54:15
14 [报告]
发表于 2006-04-17 11:35 |只看该作者
或者,我过两天写一个例程给你。

论坛徽章:
0
15 [报告]
发表于 2006-04-17 11:48 |只看该作者

现在给我一个简单例子就行

现在给我一个简单例子就行,我man了一下,没有关于wsave的说明啊。
程序是curses的,不是ncurses的,有这个函数么?
例子也可以发到我的信箱,owen22cn@gmail.com

论坛徽章:
1
2015年辞旧岁徽章
日期:2015-03-03 16:54:15
16 [报告]
发表于 2006-04-17 13:30 |只看该作者
楼上的兄弟,你把这两个程序编译后看看!

程序 a

  1. #include <stdio.h>
  2. #include <curses.h>

  3. int main(viod)
  4. {
  5.         chtype        ch;
  6.         WINDOW        *w_main;
  7.         initscr();
  8.         w_main = newwin(24,78,0,0);
  9.         box(w_main,0,0);
  10.         touchwin(w_main); wrefresh(w_main);
  11.         ch =wgetch(w_main);
  12.         system("b");
  13.         wmove(w_main,6,16);
  14.         touchwin(curscr); wrefresh(curscr);
  15.         ch = wgetch(w_main);
  16.         delwin(w_main);
  17.         endwin();
  18.         exit(0);
  19. }
复制代码


程序 b

  1. #include <stdio.h>
  2. #include <curses.h>

  3. int main(viod)
  4. {
  5.         chtype        ch;
  6.         WINDOW        *w_main1,*w_cs;
  7.         initscr();
  8.         w_main1 = newwin(24,78,0,0);
  9.         werase(w_main1);
  10.         touchwin(w_main1); wrefresh(w_main1);
  11.         w_cs = newwin( 22,76,1,1);
  12.         box(w_cs,0,0);
  13.         wmove(w_cs,6,16);
  14.         wprintw(w_cs,"this is example !");
  15.         touchwin(w_cs); wrefresh(w_cs);
  16.         ch = wgetch(w_cs);
  17.         delwin(w_main1); delwin(w_cs);
  18.         endwin();
  19.         exit(0);
  20. }
复制代码


运行程序 a ,在程序 a 中调用程序 b 。

论坛徽章:
1
2015年辞旧岁徽章
日期:2015-03-03 16:54:15
17 [报告]
发表于 2006-04-17 13:34 |只看该作者
刚刚写的,还没有来得及测试,你自己测试一下。

应该没有问题的。

论坛徽章:
0
18 [报告]
发表于 2006-04-17 14:38 |只看该作者

测试通过!感谢!

非常感谢snow888 !测试通过了。
只要在System后,调用touchwin(curscr); wrefresh(curscr);
这两个函数就可以了。
请问curscr是什么含义呢?
是指当前应用的全部屏幕么?
再次致意!

论坛徽章:
1
2015年辞旧岁徽章
日期:2015-03-03 16:54:15
19 [报告]
发表于 2006-04-17 14:54 |只看该作者
原帖由 owen22cn 于 2006-4-17 14:38 发表
非常感谢snow888 !测试通过了。
只要在System后,调用touchwin(curscr); wrefresh(curscr);
这两个函数就可以了。
请问curscr是什么含义呢?
是指当前应用的全部屏幕么?
再次致意!


在调用 touchwin(curscr); wrefresh(curscr); 之前,你的每一个对于窗口的改变都是保存在窗口指针中的,我是这样理解,这两句话实际上是把你在调用之前的窗口指针中的显示内容弹入显示缓冲区,然后通过 touchwin(w_a); wrefresh(w_a) 显示出来。

curscr 参数实际上是恢复实际窗口指针中最新的内容。

需要指出的是,如果你在调用touchwin(curscr); wrefresh(curscr); 之前已经对你前面的窗口 w_a 做了 wclear(w_a); 处理,那么将清除保存在窗口指针中的内容,显示出来的将会是白板。

谢就不必了,以后多交流。

论坛徽章:
0
20 [报告]
发表于 2006-04-17 15:00 |只看该作者

那为什么单独指定window不行呢?

那么我在程序中首先定义了全局
WINDOW *MainWin;

后面也创建了窗口,没有用Wclear,
调用System后,再用
touchwin(MainWin);
wrefresh(MainWin);
希望能指定刷新,为什么就不行呢?
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP