ncurses 与 panel

一下是ncurses使用面板库panel的一个demo程序。

  1. #include <ncurses.h>
  2. #include <panel.h>
  3. #include <string.h>
  4. void init_wins(WINDOW **wins, int n);
  5. void win_show(WINDOW *win, char *label, int label_color);
  6. void print_in_middle(WINDOW *win, int starty, int startx, int width, char *string, chtype color);
  7. int main()
  8. {
  9. WINDOW *my_wins[3];
  10. PANEL *my_panels[3];
  11. PANEL *top;
  12. int ch;
  13. int new_x;
  14. int new_y;
  15. int widht;
  16. int height;
  17. int panel_c;
  18. enum {
  19. set_size,
  20. move_,
  21. none_
  22. } status = none_;
  23. /*初始化curses */
  24. initscr();
  25. start_color();
  26. raw();
  27. noecho();
  28. keypad(stdscr, TRUE);
  29. curs_set(0);
  30. /* 初始化所有的颜色*/
  31. init_pair(1, COLOR_RED, COLOR_WHITE);
  32. init_pair(2, COLOR_GREEN, COLOR_BLACK);
  33. init_pair(3, COLOR_BLUE, COLOR_BLACK);
  34. init_pair(4, COLOR_CYAN, COLOR_BLACK);
  35. init_wins(my_wins, 3);
  36. my_panels[0] = new_panel(my_wins[0]);
  37. my_panels[1] = new_panel(my_wins[1]);
  38. my_panels[2] = new_panel(my_wins[2]);
  39. set_panel_userptr(my_panels[0],my_panels[1]);
  40. set_panel_userptr(my_panels[1],my_panels[2]);
  41. set_panel_userptr(my_panels[2],my_panels[0]);
  42. update_panels();
  43. attron(COLOR_PAIR(4));
  44. attroff(COLOR_PAIR(4));
  45. doupdate();
  46. top = my_panels[2];
  47. panel_c = 2;
  48. mvprintw(LINES-2, 0, "Use tab to browse through the windows (F1 to Exit) [%d]", panel_c + 1);
  49. while((ch = getch()) != KEY_F(1))
  50. {
  51. switch(ch) {
  52. case '\t':
  53. if (status == none_) {
  54. bool is_hide;
  55. top = (PANEL *) panel_userptr(top);
  56. is_hide = panel_hidden(top);
  57. if (panel_c == 2)
  58. panel_c = 0;
  59. else
  60. panel_c ++;
  61. mvprintw(LINES-2, 0, "Use tab to browse through the windows (F1 to Exit) [%d]", panel_c + 1);
  62. if (is_hide)
  63. printw(" [hide] ");
  64. else {
  65. top_panel(top);
  66. printw(" [show] ");
  67. }
  68. }
  69. break;
  70. case 'm': {
  71. WINDOW *win = panel_window(top);
  72. getbegyx(win, new_y, new_x);
  73. status = move_;
  74. mvprintw(LINES-2, 0, "Moveing Windows (ENTER to Exit) [%d] ", panel_c + 1);
  75. break;
  76. }
  77. case 'r': {
  78. WINDOW *win = panel_window(top);
  79. getbegyx(win, new_y, new_x);
  80. getmaxyx(win, height, widht);
  81. status = set_size;
  82. mvprintw(LINES-2, 0, "Set Windows Size (ENTER to Exit) [%d] %d %d ", panel_c + 1, height, widht);
  83. break;
  84. }
  85. case 's':
  86. if (status == none_)
  87. show_panel(top);
  88. break;
  89. case 'h':
  90. if (status == none_) {
  91. if (panel_hidden(top))
  92. show_panel(top);
  93. else
  94. hide_panel(top);
  95. }
  96. break;
  97. case KEY_RIGHT:
  98. if (status == move_)
  99. new_x ++;
  100. else
  101. widht ++;
  102. break;
  103. case KEY_LEFT:
  104. if (status == move_)
  105. new_x --;
  106. else
  107. widht --;
  108. break;
  109. case KEY_UP:
  110. if (status == move_)
  111. new_y --;
  112. else
  113. height --;
  114. break;
  115. case KEY_DOWN:
  116. if (status == move_)
  117. new_y ++;
  118. else
  119. height ++;
  120. break;
  121. case 10:
  122. status = none_;
  123. mvprintw(LINES-2, 0, "Use tab to browse through the windows (F1 to Exit) [%d]\n", panel_c + 1);
  124. break;
  125. default:
  126. mvprintw(LINES-3, 0, "ch = %d\n", ch);
  127. break;
  128. }
  129. if (status == move_)
  130. move_panel(top, new_y, new_x);
  131. else if (status == set_size) {
  132. char label[80] = {};
  133. WINDOW *old = panel_window(top);
  134. WINDOW *win = newwin(height, widht, new_y, new_x);
  135. replace_panel(my_panels[panel_c], win);
  136. delwin(old);
  137. sprintf(label, "Window Number %d", panel_c + 1);
  138. win_show(win, label, panel_c + 1);
  139. }
  140. update_panels();
  141. doupdate();
  142. }
  143. endwin();
  144. return 0;
  145. }
  146. // 初始化三个窗体并放入数组wins中
  147. void init_wins(WINDOW *wins[], int n) {
  148. char label[80] = {};
  149. int x = 10;
  150. int y = 2;
  151. for(int i = 0; i < n; i++) {
  152. wins[i] = newwin(10, 40, y, x);
  153. sprintf(label, "Window Number %d", i + 1); // 设置窗体名字
  154. win_show(wins[i], label, i + 1); // 绘制窗体内的内容
  155. y += 3;
  156. x += 7;
  157. }
  158. }
  159. void win_show(WINDOW *win, char *label, int label_color) {
  160. int startx;
  161. int starty;
  162. int height;
  163. int width;
  164. getbegyx(win, starty, startx);
  165. getmaxyx(win, height, width);
  166. box(win, 0, 0);
  167. mvwhline(win, 2, 1, '-', width-2); // 画一条线
  168. print_in_middle(win, 1, 0, width, label, COLOR_PAIR(label_color)); // 在中间显示文字
  169. }
  170. void print_in_middle(WINDOW *win, int y, int startx, int width, char *string, chtype color) {
  171. int x;
  172. if(win == NULL)
  173. win = stdscr;
  174. if(y == 0)
  175. getyx(win, y, x);
  176. x = startx + (width - strlen(string)) / 2;
  177. wattron(win, color);
  178. mvwprintw(win, y, x, "%s", string);
  179. wattroff(win, color);
  180. refresh();
  181. }

tab切换窗体,按m改变窗体位置,按r设定窗体大小。按h显示或隐藏窗体。

ncurses 与 panel的更多相关文章

  1. 从头开始构建LINUX [LFS 脚本]

    脚本共享在这 http://pan.baidu.com/s/1nt6yiH7 version-check.sh : 这个是检查HOST机器的软件依赖情况 host-dep.sh:针对ubuntu10_ ...

  2. [原]打造Python开发环境之Python环境

    人生苦短,我用Python 一.升级到python2.7 开发环境的系统是centos 6.0, 默认的python版本是2.6.6, 由于线上环境是python2.7,为了防止版本差异产生的问题,所 ...

  3. 重新安装python

    1. 在上次进行安装python的时候,很多东西不能用,例如后退键,删除键,都是不能在命令行中使用,主要原因是在编译python的时候,相关的安装包没有进行安装,从而导致出现乱码,在编译最新版本的py ...

  4. LFS7.4编译笔记(2)

    上一篇我们已经搭建好了临时系统,这一篇我们就开始正式构建我们的最终LFS系统. 首先切换到root,准备虚拟内核文件系统并挂载: su - export LFS=/mnt/lfs mkdir -pv ...

  5. CentOS6下编译安装Python2.7.6方法

    关于在CentOS6下编译安装Python2.7.6的方法非常的多了,小编以前也介绍过相关的文章了,下面一聚教程小编再来为各位介绍一下吧,希望文章能帮助到各位.   CentOS下面Python在升级 ...

  6. 2、CentOS下编译安装Python2.7.6(转)

    CentOS系统下面Python在升级到2.7.6的时候,没有找到安装包直接安装,只能通过源代码编译的方式来安装Python 2.7.6版本.这篇是编译和安装Python2.7.6的过程记录. Cen ...

  7. Python编译安装遇到的问题

    1.python在make时候报错 Python build finished, but the necessary bits to build these modules were not foun ...

  8. lfs(systemd版本)学习笔记-第3页

    我的邮箱地址:zytrenren@163.com欢迎大家交流学习纠错! lfs(systemd)学习笔记-第2页 的地址:https://www.cnblogs.com/renren-study-no ...

  9. lfs(systemv版本)学习笔记-第3页

    我的邮箱地址:zytrenren@163.com欢迎大家交流学习纠错! lfs(systemv版本)学习笔记-第2页的地址:https://www.cnblogs.com/renren-study-n ...

  10. 从零开始构建Linux

    目的:深入了解以Linux内核为基础的系统是如何组成,运行,以构建一个最基础的,纯净的系统. LFS构建步骤宿主机准备- linux操作系统安装- 使用独立硬盘,创建分区- 配置用户和组- 下载所有需 ...

随机推荐

  1. Note -「virtual tree」shorter vrt

    Part. 1 Preface 没什么 preface. Part. 2 实现 具体来说就是把所有关键点按 \(\text{dfn}\) 排序,去重,然后求出相邻结点的 \(\text{LCA}\), ...

  2. 记一次 .NET某新能源MES系统 非托管泄露

    一:背景 1. 讲故事 前些天有位朋友找到我,说他们的程序有内存泄露,跟着我的错题集也没找出是什么原因,刚好手头上有一个 7G+ 的 dump,让我帮忙看下是怎么回事,既然找到我了那就给他看看吧,不过 ...

  3. 使用 Sealos 构建低成本、高效能的私有云

    这个时候谈论私有云似乎有点反直觉?大部分人认知不是上云是大趋势嘛?我也比较认可上云,不过私有云也是云,今天给大家带来一个新的选择 -- 用云,只需一个 Sealos 就够了. 看看我们怎么做到更低的成 ...

  4. 2022 ICPC 杭州站

    gym 知乎 尝试先读题而不是写缺省源感觉不太好 E 一头雾水.F 是签到就先上去写了,结果读错题交了个样例都没过的代码,小改了一下就过了.G 不太会做.zsy 把 M 丢给我想了一下 然后 gjk ...

  5. 08-03_阅读flask上下文前夕补充、flask请求上下文、数据库连接池

    文章目录 阅读flask上下文前夕补充 01 偏函数 02 __add__的使用 03 chain函数 2 flask请求上下文 1 首先分析请求上下文对象(ctx)创立 2 把请求对象(ctx)添加 ...

  6. 单元测验3:亲密关系mooc

    单元测验3:亲密关系 查看帮助 返回   1 单选(2分) 在亲密关系中,有关权力的表述,以下说法不太准确的的是? A. 对关系付出越多,权力越大. B. 大部分人会倾向认为,在恋爱关系中,男女应该拥 ...

  7. Python--乱码转化为中文

    1. \u和\x的含义 \u:代表的是unicode码 \x:代表的是16进制码 2. 代码实现 :\x类型 # \xe4\xb8\xad\xe6\x96\x87 代表的意思是'中文' s = u'\ ...

  8. 计算机的数值转化与网络的IP地址分类与地址划分

    数值转换 数字系统由来 远古时代是没有数字系统非位置化数字系统: 罗马数字 (I-1.II-2.III-3.IV-4.V-5.VI-6.VII-7.VIII-8.IX-9.X-10) 位置话数字化系统 ...

  9. 新手面对安卓6.0以上的版本时出现一个关于文件权限检测的问题,报错为:“无法解析符号 'checkSelfPermission'”,解决办法

    [[注意]:这只是笔者在遇到这个问题时的解决方法,如果对您毫无帮助,请自寻他法!!!] 面对新手:在简单做一个音乐播放程序时,如果面对安卓6.0以上的版本,就会出现一个关于文件权限检测的问题,报错为: ...

  10. Redis7新特性简介及十大数据类型

    Redis是基于内存的K-V键值对内存数据库 浅谈Redis7新特性 主要是自身底层性能和资源利用率上的提高和优化. 多AOF文件支持 config命令增强 限制客户端内存使用 listpack紧凑列 ...