📄 有没有unix下curses中的菜单函数good.htm
字号:
<br /> void initial();<br /><br /> main()<br /> {<br /> int x=StartX; /* 宣告 x,y 并设定其初值 */<br /><br /> int y=StartY;<br /> int ch; /* 宣告 ch 为整数,配合 getch() 使用 */<br /><br /><br /> initial(); /* 呼叫 initial(), 启动 curses 模式, */<br /><br /> /* 并完成其它设定 */<br /><br /><br /> box(stdscr,'|','-'); /* 画方框 */<br /><br /><br /> attron(A_REVERSE); /* 开启反白模式 */<br /><br /> mvaddstr(0,20,"Curses Program"); /* 在 (20,0) 处输出反白字元 */<br /><br /> attroff(A_REVERSE); /* 关闭反白模式 */<br /><br /><br /> move(x,y); /* 将光标移至初始位置 */<br /><br /><br /> do { /* 以无限回圈不断等待输入 */<br /><br /> ch=getch(); /* 等待自键盘输入字元<br /> switch(ch) { /* 判断输入字元为何 */<br /><br /><br /> case KEY_UP: --y; /* 判断是否"↑"键被按下 */<br /><br /> break;<br /> case KEY_DOWN: ++y; /* 判断是否"↓"键被按下 */<br /><br /> break;<br /> case KEY_RIGHT: ++x; /* 判断是否"→"键被按下 */<br /><br /> break;<br /> case KEY_LEFT: --x; /* 判断是否"←"键被按下 */<br /><br /> break;<br /> case '\r': /* 判断是否 ENTER 键被按下 */<br /><br /> ++y;<br /> x=0;<br /> break;<br /> case '\t': /* 判断是否 TAB 键被按下 */<br /><br /> x+=7;<br /> break;<br /> case 127: /* 判断是否 BACKSPACE 键被按下 */<br /><br /> mvaddch(y,--x,' ');/* delete 一个字元 */<br /><br /> break;<br /><br /> case 27: endwin(); /* 判断是否[ESC]键被按下 */<br /><br /> exit(1); /* 结束 curses 模式 */<br /><br /> /* 结束此程序 */<br /><br /><br /> default:<br /> addch(ch); /* 如果不是特殊字元, 将此字元印出 */<br /><br /> x++;<br /> break;<br /> }<br /> move(y,x); /* 移动光标至现在位置 */<br /><br /> } while (1);<br /> }<br /><br /> void initial() /* 自定开启 curses 函数 */<br /><br /> {<br /> initscr();<br /> cbreak();<br /> nonl();<br /> noecho();<br /> intrflush(stdscr,FALSE);<br /> keypad(stdscr,TRUE);<br /> refresh();<br /> }<br /><br /><br /><br /> ■ 後记<br /><br /> 学完了上述的一些命令, 相不相信您已经可以写出一个漂亮的全屏幕编辑<br /> 器了? 事实上, curses 提供的函数不下 200 个, 可是笔者认为, 一切再<br /> 复杂的函数都可以用本文提到的一些组合变化而成, 学了太多的函数, 只<br /> 是徒增自己困扰罢了. 当然, 如果您对其它函数有兴趣, 可以自行参阅<br /> curses 说明档. ( 方法: % man curses ) 本文不过行抛砖引玉之效, 也<br /> 希望未来能陆续出现更多同学自行创作的程序.<br /><br /> * 任何疑问及建议, 欢迎 e-mail 至 <a href="mailto:ljh@CCCA.NCTU.edu.tw">ljh@CCCA.NCTU.edu.tw</a>. 谢谢 ! *<br /><br /><br /><br /> 注一:<br /> 请参考 /usr/share/lib/termcup<br /> /usr/share/lib/terminfo/s/sun<br /><br /> 注二:<br /> 1.如果是 BSD 的版本, 需使用<br /> cc [file.c] -lcurses -ltermcap 来完成 compile.<br /> 2.计中工作站不知何故将原来的 /usr/5bin/cc 更改为 /usr/5bin/cc.org<br /> 因此, 您若想在计中工作站 compile curses 程序.需以 /usr/5bin/cc.org<br /> 取代 /usr/5bin/cc , 否则 compile 可能发生错误.<br /> 3.较旧版的 curses 需同时引进 curses 和 termlib 这两个 library,<br /> 因此, 您必须使用 /usr/5bin/cc [file.c] -lcurses -ltermlib 来 compile.<br /><br /> 注三:<br /> 根据笔者的经验, 上下左右方向键应可正常使用而不会发生问题, 但其它<br /> 如 PgUp,PgDn,功能键,Home,End 等特殊键, 很容易因机器, 键盘不同而无<br /> 法使用, 因此, 若您的程序须要在不同的机器上使用, 建议您只用方向键来<br /> 控制, 其它的特殊键少用为妙.<br /> 至於 PgUp,PgDn 一些特殊键的控制方法, 由於较为复杂, 有兴趣的同学可参<br /> 考 tin 原始程序 curses.c 内所使用的一些方法.<br /><br /><br /><br /><br />--------------------------------------------------------------------------------<br /><br /> <br /> <br /><br /><br />UNIX 屏幕导向程序的发展利器 - curses (之二) <br /><br />作者:林建宏<br /><br /> 在上期为您介绍完了 curses.h 函式库的一些基本函式呼叫後在, 在本期里<br /> , 我们将继续为您介绍 curses 有关多视窗处理的函式. 有了这些函式, 我们<br /> 可以在程式里同时处理多个不同的视窗. 如 joe 编辑器内我们可将萤幕切割<br /> 成好几个小萤幕, 并且可以在这些不同的萤幕间做切换并编辑不同的档案, 这<br /> 就是多视处理的应用. 另外, 有关 POP-UP 视窗的制作, 以及视窗的卷动, 在<br /> 本文里, 我们将以简单的例子, 告诉您这些功能是如何做到的. 关於一些较基<br /> 本函式的用法, 我们将不再特别介绍. 如果您尚未熟悉 curses 基本函式使用<br /> 方法, 请参阅上一期 (80 期 ) 通讯.<br /><br /><br /> ■ 视窗的建立<br /><br /> 视窗的建立, 以 newwin() 这个函式来完成. 同时, 需宣告此视窗为 WINDOW<br /> 结构变数.<br /><br /> WINDOW *newwin(lines,colums,start_y,start_x);<br /><br /><br /> WINDOW *win;<br /> win=newwin(10,20,0,0);<br /><br /> 如此, 将以 (0,0) 为原点, 取一个 10 列 20 行的矩形为一新的视窗. 今後<br /> 我们只要呼叫 win 这个变数, 就可以对这新视窗做处理.<br /><br /> 如: wmove(win,3,2);<br /><br /><br /> ■ 多视窗处理函式的格式<br /><br /> 这一类函式和一般的基本函式极为类似, 几乎每一个基本函式都有一个对应的<br /> 视窗处理函式. 一般将 'w' 加在函式的里头作为区别, 'w' 乃 'window' 之<br /> 意. 另外, 因为可同时处理多个视窗, 在呼叫使用时, 需特别指定欲处理的视<br /> 窗. 当然, 如果您指定对 stdscr 做处理, 由於是对标准输出入萤幕处理, 其<br /> 作用将相当於一般基本的函式.<br /><br /> 如:<br /><br /> wmove(win,y,x) 即对 win 这个视窗做 move() 动作.<br /> wmove(stdscr,y,x) 相当於 move(y,x)<br /><br /> 介绍一些较重要的函式<br /><br /> wmove(win,y,x)<br /> touchwin(win)<br /> wrefresh(win)<br /> mvwaddstr(win,y,x,str)<br /> wattron(attr)<br /> delwin(win)<br /> subwin(win,ny,nx,y,x)<br /><br /> 其他函式多和基本函式互为对应, 故不全部列出, 详细名称可参考 curses<br /> 的 online manual.<br /><br /> ■ 视窗内的座标系<br /><br /> 视窗内的座标系, 将以此视窗的起始点为新原点, 并以其相对位置作为新的<br /> 座标. 举例来说<br /><br /> win=newwin(10,20,5,5);<br /> wmove(win,2,3);<br /><br /> 将以 (5,5) 为新原点, y 方向移动 2 单位, x 方向移动 3 单位. 因此实际<br /> 上, 游标将移动至 y=7 x=8 的位置上.<br /><br /><br /> ■ POP-UP 视窗的建立<br />
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -