免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 2858 | 回复: 4
打印 上一主题 下一主题

Curses 编程,移动窗口 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2009-09-15 13:59 |只看该作者 |倒序浏览
这是一个介绍移动窗口的程序,可以按照程序的介绍进行编译,调制。

#include   <curses.h>
#include  <string.h>
#include   <ctype.h>

int main(int argc, char *argv[])
{
&nbsp;&nbsp;WINDOW *box_win, *box_clear;
&nbsp;&nbsp;int startx, starty, width, height;
&nbsp;&nbsp;int ch;
&nbsp;&nbsp;initscr();     /* 初始化并进入curses模式  */
&nbsp;&nbsp;cbreak();     /* 行缓冲禁止,传递所有控制信息 */
&nbsp;&nbsp;keypad(stdscr, TRUE);  /* 程序需要使用F1功能键   */
&nbsp;&nbsp;height = 6;
&nbsp;&nbsp;width = 16;
&nbsp;&nbsp;starty = (LINES - height) / 2; /*计算窗口中心位置的行数 */
&nbsp;&nbsp;startx = (COLS - width) / 2;  /*计算窗口中心位置的列数 */
&nbsp;&nbsp;printw("输入 F1 结束测试程序: ");
&nbsp;&nbsp;box_win = newwin(height, width, starty, startx);
&nbsp;&nbsp;box(box_win, 0, '-');
&nbsp;&nbsp;mvwprintw(box_win, 2, 3, "[ 测试窗口 ]");
&nbsp;&nbsp;mvwprintw(box_win, 3, 2, "===╘’☆╘’===");
&nbsp;&nbsp;overwrite(box_win, stdscr);
&nbsp;&nbsp;wrefresh(stdscr);
&nbsp;&nbsp;box_clear  = newwin(height, width, starty, startx);
&nbsp;&nbsp;wclear(box_clear);
&nbsp;&nbsp;while((ch = getch()) != KEY_F(1))
&nbsp;&nbsp;{
&nbsp;&nbsp;&nbsp;&nbsp;mvwin( box_clear , starty, startx );
&nbsp;&nbsp;&nbsp;&nbsp;overwrite(box_clear,  stdscr);
&nbsp;&nbsp;&nbsp;&nbsp;switch(ch) {
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;case KEY_LEFT:
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if( startx > 1 ) mvwin(box_win, starty, --startx);
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;break;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;case KEY_RIGHT:
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if( startx + 16 +1 < COLS) mvwin(box_win, starty, ++startx);
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;break;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;case KEY_UP:
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if( starty > 1 ) mvwin(box_win, --starty, startx);
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;break;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;case KEY_DOWN:
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if( starty + 6 +1 < LINES ) mvwin(box_win, ++starty, startx);
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;break;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;overwrite(box_win,  stdscr);
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;touchwin(stdscr);
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;wrefresh(stdscr);
&nbsp;&nbsp;&nbsp;&nbsp;}
&nbsp;&nbsp;&nbsp;&nbsp;if(box_win) delwin(box_win);
&nbsp;&nbsp;&nbsp;&nbsp;if( box_clear )  delwin(box_clear);
&nbsp;&nbsp;&nbsp;&nbsp;endwin();   /*结束 curses模式 */
&nbsp;&nbsp;&nbsp;&nbsp;return 0;
}

/*  cc  tt1.c  -o tt1  -lcurses  可以完成本程序的编译  */


编译后,你可以试着用方向按键,指挥屏幕上的一个测试窗口进行移动操作。

论坛徽章:
15
射手座
日期:2014-11-29 19:22:4915-16赛季CBA联赛之青岛
日期:2017-11-17 13:20:09黑曼巴
日期:2017-07-13 19:13:4715-16赛季CBA联赛之四川
日期:2017-02-07 21:08:572015年亚冠纪念徽章
日期:2015-11-06 12:31:58每日论坛发贴之星
日期:2015-08-04 06:20:00程序设计版块每日发帖之星
日期:2015-08-04 06:20:00程序设计版块每日发帖之星
日期:2015-07-12 22:20:002015亚冠之浦和红钻
日期:2015-07-08 10:10:132015亚冠之大阪钢巴
日期:2015-06-29 11:21:122015亚冠之广州恒大
日期:2015-05-22 21:55:412015年亚洲杯之伊朗
日期:2015-04-10 16:28:25
2 [报告]
发表于 2009-09-15 14:17 |只看该作者
原帖由 ljmmail 于 2009-9-15 13:59 发表
这是一个介绍移动窗口的程序,可以按照程序的介绍进行编译,调制。

#include   
#include  
#include   

int main(int argc, char *argv[])
{
&nbsp;&nbsp;WINDOW *box_win, *box_clear;
&nbsp;&nbs ...

经典!
现在很少使用字符终端方式开发应用软件了,有点恍若隔世的感觉,
好像到了古玩博物馆,想像着这些器物当年的辉煌。

20多年了,又见到这当年熟悉的代码。

[ 本帖最后由 yulihua49 于 2009-9-15 14:20 编辑 ]

论坛徽章:
0
3 [报告]
发表于 2009-09-15 18:58 |只看该作者
在curses.h库编程中碰到一个难题,自己无法解决,看两位兄台对curses.h比较熟。想请你们帮忙解决。

逻辑是这样的:
.......
int ch=getch();

if(ch==27)
   exit(0);
else
   ........

我的本意是只当按下ESC键后退出程序,可现在出现的问题是:
我按ESC和另外一个功能键都能退出。(那个功能键设置为"^[[3~")


能告诉我,你们怎么区分ESC(键值为"^[")和"^[[3~"功能键?

论坛徽章:
0
4 [报告]
发表于 2009-09-16 08:45 |只看该作者
注意,看看你的程序里有
cbreak();     /* 行缓冲禁止,传递所有控制信息 */
keypad(stdscr, TRUE);  /* 程序需要使用F1功能键   */

两行程序吗? 一般设置上面程序后,你才可以使用 F1 F2 等功能键的。

论坛徽章:
0
5 [报告]
发表于 2009-09-16 17:38 |只看该作者
当然有那两行。
所有的功能键都有反应。
只是说,我不知道该怎样在程序中区分ESC(^[)和F5(^[[3~)
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP