如何重绘 ncurses 菜单

How to redraw an ncurses menu

我正在开发一个基于 ncurses 的工具,它有 4 个平铺 windows,屏幕底部有一个命令栏。 windows 形成一个 2x2 网格,如下所示:

+----+----------------+
| 1  |  2             |
+----+----------------+
| 3  |  4             |
|    |                |
|    |                |
|    |                |
+----+----------------+

左上角的大小是固定的,所以当应用调整大小时,宽度变化 2 次,高度变化 3 次,双向变化 4 次。

在我开始将菜单(使用 menu.h)放入 window 之前,我的重绘代码工作正常 4。现在,如果我将 window 调整得太小,部分菜单将被截断,但是当您再次将 window 变大时,它不会重新绘制被删除的内容。在重绘代码中执行 post_menu() 不会重绘它。

重新绘制菜单的正确方法是什么?我每次都必须处理它并从头开始重新创建它吗?我的代码中确实有只在必要时重绘的逻辑(数据更改、window 调整大小等),因此它不会无缘无故地在每个周期创建一个新菜单,但这似乎仍然有点笨拙。必须有一种简单的方法来重绘您已经创建的菜单。这是什么?

重新创建结构是最简单的方法。

表单和菜单库使用您键入的键的抽象。该抽象不包括调整大小功能。

可以 运行 wresize 菜单中的每个 windows,例如 menu.h 中的这些行

  WINDOW        *win;                   /* Window containing menu          */
  WINDOW        *sub;                   /* Subwindow for menu display      */
  WINDOW        *userwin;               /* User's window                   */
  WINDOW        *usersub;               /* User's subwindow                */

但要完成这项工作需要对图书馆进行一些研究。有一个在 ncurses-examples(名为 cardfile)中调整 form 大小的示例,但没有 menus 的类似示例。

延伸阅读: