📄 有没有unix下curses中的菜单函数good.htm
字号:
<br /> 利用 curses 所提供的视窗处理函式, 我们可以做出像 ONLINE HELP 的 POP<br /> -UP 画面. 当按下某键後, 一个新的视窗将像 " 跳 " 出来一般覆盖原来的画<br /> 面. 当关掉此视窗後, 又不会影响到原来被覆盖的画面.<br /><br /><br /> 下面的例子, 我们及模拟 ONLINE HELP 的形式, 当按下 'h' 键时, 视窗即出现<br /><br /><br /> #include <curses.h><br /><br /> main()<br /> {<br /> int ch,x,y;<br /> WINDOW *win;<br /><br /> initscr(); ←┐<br /> cbreak; │ 启动 curses 模式<br /> noecho(); │<br /> nonl(); ←┘<br /><br /> win=newwin(4,30,LINES/2-3, COLS/2-15);/* 建立一个新视窗, 其中LINES,COLS<br />*/<br /> box(win,'|','-'); /* 为 curses 内定值,<br />即萤幕行/列数*/<br /> mvwaddstr(win,1,4,"This is another screen");<br /> mvwaddstr(win,2,2,"Press anykey to continue..");<br /><br /> for (y=0;y<LINES;++y) /* 以'@'填满萤幕 */<br /> for (x=0;x<COLS;++x)<br /> mvprintw(y,x,"@");<br /><br /> for(;;) {<br /> refresh();<br /> ch=getch();<br /> switch(ch) {<br /> case 'q': /* 按 'q' 键离开 */<br /> endwin();<br /> exit(0);<br /><br /> case '\t': /* 按 [TAB] 键 呼叫另一视窗 */<br /> touchwin(win); /* wrefresh() 前需 touchwin() */<br /> wrefresh(win);<br /> getch(); /* 按任意键关闭视窗 */<br /> touchwin(stdscr);<br /> break;<br /><br /> default:break;<br /> }<br /> }<br /> }<br /><br /><br /> 执行结果:<br /><br /> ┌————————————————————————————┐<br /> │ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ │<br /> │ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ │<br /> │ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ │<br /> │ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ │<br /> │ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ │<br /> │ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ │<br /> │ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ │<br /> │ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ │<br /> │ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ │<br /> │ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ │<br /> │ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ │<br /> │ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ │<br /> │ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ │<br /> └————————————————————————————┘<br /> ↑ 原来画面被 '@' 填满, 按下[TAB]键後<br /> ↓ 出现 POP-UP 画面.<br /> ┌————————————————————————————┐<br /> │ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ │<br /> │ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ │<br /> │ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ │<br /> │ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ │<br /> │ @@@@@@@@@@@@@□---------------------------+@@@@@@@@@@@ │<br /> │ @@@@@@@@@@@@@| This is another screen |@@@@@@@@@@@ │<br /> │ @@@@@@@@@@@@@| Press anykey to continue.. |@@@@@@@@@@@ │<br /> │ @@@@@@@@@@@@@□---------------------------+@@@@@@@@@@@ │<br /> │ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ │<br /> │ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ │<br /> │ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ │<br /> │ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ │<br /> │ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ │<br /> └————————————————————————————┘<br /><br /><br /> ■ 视窗的卷动<br /><br /> 视窗的卷动, 掖Q用来配合视窗的处理, 当我们持续对视窗输出直到视窗的游<br /> 标移动至最後一列时, 如果我们再输出一列或是输出一个换行字元时, 视窗可<br /> 整个往上卷动一行. 这对我们撰写一个编辑程式时, 是尤其重要的, 一个画面<br /> 无法卷动的编辑器, 势必无法处理超过一个萤幕大小的档案.<br /><br /> 视窗的卷动是预设为关闭的, 并以 scrollok() 来控制开闭.<br /><br /> scrollok(win,TRUE); 开启<br /> scrollok(win,FALSE); 关闭<br /><br /><br /> 下面的例子因为不断地输出 0,1,2.. 故将以一个 40 * 10 的视窗不停的卷动<br /><br /> #include <curses.h><br /><br /> main()<br /> {<br /> int i;<br /> WINDOW *scrwin,*boxwin;<br /><br /> initscr(); ←┐<br /> cbreak; │ 启动 curses 模式<br /> noecho(); │<br /> nonl(); ←┘<br /><br /> scrwin=newwin(10,40,LINES/2-6,COLS/2-25); /* 设定另一视窗大小 */<br /> boxwin=newwin(12,42,LINES/2-7,COLS/2-26); /* 设定外框视窗大小 */<br /><br /> scrollok(scrwin,TRUE); /* 开启视窗卷动功能 */<br /><br /> box(boxwin,'|','-');<br /> refresh();<br /> wrefresh(boxwin);<br /><br /> for (i=0;;++i) /* 不断地在视窗内输出 0-8 的数字,使视窗卷动<br />*/<br /> {<br /> wprintw(scrwin,"%d",i%9);<br /> wrefresh(scrwin);<br /> }<br /> }<br /><br /><br /> 执行结果:<br /> ┌——————————————————————┐<br /> │ □---------------------□ │<br /> │ |3456780123456780123412| ↑ 视 │<br /> │ |3456780123456780123456| │ 窗 │<br /> │ |7801234567801234567801| │ 不 │<br /> │ |2345678012345678012345| │ 停 │<br /> │ |6780123456780123456780| │ 往 │<br /> │ |1234567801234567801234| │ 上 │<br /> │ |5678012345678012345678| │ 卷 │<br /> │ |0123456780123456780123| │ 动 │<br /> │ □---------------------□ │<br /> │ │<br /> └——————————————————————┘<br /><br /><br /> ■ □例 - 模拟 joe 分割画面同时编辑两个档案<br /><br /> 在下面的例子里, 我们应用了多视窗处理的函式, 改良上回介绍的编辑器,<br /> 在这个程式里, 我们可以同时编辑两个画面, 并以 [ESC] 做不同视窗间的<br /> 切换. 同时, 按下 [TAB] 键, 会出现 POP-UP 的 ONLINE HELP.<br /><br /><br /> #include <curses.h><br /><br /> void initial();<br /><br /> main()<br /> {<br /> WINDOW *win[2],*curwin,*helpwin;<br /> int nowwin;<br /> int x,y;<br /> int i;<br /> int ch;<br /><br /> initial();<br /><br /> win[0]=newwin(LINES/2-1,COLS-1,0,0); /* 设定两个视窗的大小*/<br /> win[1]=newwin(LINES/2-1,COLS-1,LINES/2,0);<br /><br /> helpwin=newwin(3,30,2,COLS/2-15 ); /* ONLINE HELP 的大小 */<br /> box(helpwin,'|','-');<br /> mvwaddstr(helpwin,0,10,"ONLINE HELP"); /* ONLINE HELP 的内容 */<br /> mvwaddstr(helpwin,1,4,"Hit any key to continue..");<br /><br /> for (i=0;i<COLS-1;++i) /* 画两个视窗间的界限 */<br /> mvaddch(LINES/2-1,i,'-');<br /><br /> nowwin=0; /* 先指定游标在第一视窗 */<br /> curwin=win[nowwin];<br /> getyx(curwin,y,x);<br /> move(0,0);<br /> refresh();<br /><br /> refresh();<br /><br /> do {<br /> ch=getch();<br /> switch(ch) {<br /><br /> case KEY_UP: --y; /* 判断是否"↑"键被按下 */<br /> break;<br /> case KEY_DOWN: ++y; /* 判断是否"↓"键被按下 */<br /> break;<br /> case KEY_RIGHT: ++x; /* 判断是否"→"键被按下 */<br /> break;<br /> case KEY_LEFT: --x; /* 判断是否"←"键被按下 */<br /> break;<br /> case '\r': /* 判断是否 ENTER 键被按下 */<br /> ++y;<br /> x=0;<br /> break;<br /> case '\t':
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -