⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 有没有unix下curses中的菜单函数good.htm

📁 curses界面编程
💻 HTM
📖 第 1 页 / 共 5 页
字号:
<br />    利用 curses 所提供的视窗处理函式, 我们可以做出像  ONLINE HELP 的 POP<br />    -UP 画面. 当按下某键後, 一个新的视窗将像 &quot; 跳 &quot; 出来一般覆盖原来的画<br />    面. 当关掉此视窗後, 又不会影响到原来被覆盖的画面.<br /><br /><br />    下面的例子, 我们及模拟 ONLINE HELP 的形式, 当按下 'h' 键时, 视窗即出现<br /><br /><br />   #include &lt;curses.h&gt;<br /><br />   main()<br />    {<br />     int ch,x,y&#59;<br />     WINDOW *win&#59;<br /><br />     initscr()&#59;   ←┐<br />     cbreak&#59;        │ 启动 curses 模式<br />     noecho()&#59;      │<br />     nonl()&#59;      ←┘<br /><br />     win=newwin(4,30,LINES/2-3, COLS/2-15)&#59;/* 建立一个新视窗, 其中LINES,COLS<br />*/<br />     box(win,'|','-')&#59;                     /* 为 curses 内定值,<br />即萤幕行/列数*/<br />     mvwaddstr(win,1,4,&quot;This is another screen&quot;)&#59;<br />     mvwaddstr(win,2,2,&quot;Press anykey to continue..&quot;)&#59;<br /><br />     for (y=0&#59;y&lt;LINES&#59;++y)     /* 以'@'填满萤幕 */<br />      for (x=0&#59;x&lt;COLS&#59;++x)<br />        mvprintw(y,x,&quot;@&quot;)&#59;<br /><br />      for(&#59;&#59;) {<br />       refresh()&#59;<br />       ch=getch()&#59;<br />       switch(ch) {<br />         case 'q':                /* 按 'q' 键离开 */<br />                   endwin()&#59;<br />                   exit(0)&#59;<br /><br />         case '\t':              /* 按 [TAB] 键 呼叫另一视窗   */<br />           touchwin(win)&#59;        /* wrefresh() 前需 touchwin() */<br />           wrefresh(win)&#59;<br />           getch()&#59;              /* 按任意键关闭视窗 */<br />           touchwin(stdscr)&#59;<br />           break&#59;<br /><br />         default:break&#59;<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)&#59;    开启<br />    scrollok(win,FALSE)&#59;   关闭<br /><br /><br />    下面的例子因为不断地输出 0,1,2.. 故将以一个 40 * 10 的视窗不停的卷动<br /><br />      #include &lt;curses.h&gt;<br /><br />      main()<br />       {<br />         int i&#59;<br />         WINDOW *scrwin,*boxwin&#59;<br /><br />         initscr()&#59;     ←┐<br />         cbreak&#59;          │ 启动 curses 模式<br />         noecho()&#59;        │<br />         nonl()&#59;        ←┘<br /><br />         scrwin=newwin(10,40,LINES/2-6,COLS/2-25)&#59; /* 设定另一视窗大小 */<br />         boxwin=newwin(12,42,LINES/2-7,COLS/2-26)&#59; /* 设定外框视窗大小 */<br /><br />         scrollok(scrwin,TRUE)&#59;  /* 开启视窗卷动功能 */<br /><br />         box(boxwin,'|','-')&#59;<br />         refresh()&#59;<br />         wrefresh(boxwin)&#59;<br /><br />         for (i=0&#59;&#59;++i)         /* 不断地在视窗内输出 0-8 的数字,使视窗卷动<br />*/<br />           {<br />           wprintw(scrwin,&quot;%d&quot;,i%9)&#59;<br />           wrefresh(scrwin)&#59;<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 &lt;curses.h&gt;<br /><br />   void initial()&#59;<br /><br />   main()<br />    {<br />     WINDOW *win[2],*curwin,*helpwin&#59;<br />     int nowwin&#59;<br />     int x,y&#59;<br />     int i&#59;<br />     int ch&#59;<br /><br />     initial()&#59;<br /><br />     win[0]=newwin(LINES/2-1,COLS-1,0,0)&#59;       /* 设定两个视窗的大小*/<br />     win[1]=newwin(LINES/2-1,COLS-1,LINES/2,0)&#59;<br /><br />     helpwin=newwin(3,30,2,COLS/2-15 )&#59;        /* ONLINE HELP 的大小 */<br />     box(helpwin,'|','-')&#59;<br />     mvwaddstr(helpwin,0,10,&quot;ONLINE HELP&quot;)&#59;    /* ONLINE HELP 的内容 */<br />     mvwaddstr(helpwin,1,4,&quot;Hit any key to continue..&quot;)&#59;<br /><br />     for (i=0&#59;i&lt;COLS-1&#59;++i)              /* 画两个视窗间的界限 */<br />       mvaddch(LINES/2-1,i,'-')&#59;<br /><br />     nowwin=0&#59;                          /* 先指定游标在第一视窗 */<br />     curwin=win[nowwin]&#59;<br />     getyx(curwin,y,x)&#59;<br />     move(0,0)&#59;<br />     refresh()&#59;<br /><br />     refresh()&#59;<br /><br />     do {<br />       ch=getch()&#59;<br />       switch(ch) {<br /><br />             case KEY_UP: --y&#59;             /* 判断是否&quot;↑&quot;键被按下       */<br />                          break&#59;<br />             case KEY_DOWN: ++y&#59;           /* 判断是否&quot;↓&quot;键被按下       */<br />                          break&#59;<br />             case KEY_RIGHT: ++x&#59;          /* 判断是否&quot;→&quot;键被按下       */<br />                          break&#59;<br />             case KEY_LEFT: --x&#59;           /* 判断是否&quot;←&quot;键被按下       */<br />                          break&#59;<br />             case '\r':                    /* 判断是否 ENTER 键被按下    */<br />                       ++y&#59;<br />                       x=0&#59;<br />                       break&#59;<br />             case '\t':               

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -