[英]Ncurses menu out of borders
我正在尝试做简单的菜单,但是我无法将其放入盒子中。 你能告诉我我在做什么错吗?
// main
ITEM** items = // items initialization
WINDOW* menuWindow = create_newwin(itemsCount + 2, 38, 3, 5, true);
keypad(menuWindow, TRUE);
MENU* menu = create_menu(itemsCount, menuWindow, items, 2, 2, 5);
refresh();
post_menu(menu);
wrefresh(menuWindow);
// create win
WINDOW *create_newwin(const int height, const int width, const int starty, const int startx, const bool framed){
WINDOW *local_win = newwin(height, width, starty, startx);
if (framed) box(local_win, 0 , 0);
wrefresh(local_win);
return local_win;
}
//create menu
MENU* create_menu(const unsigned int count, WINDOW* window, ITEM** items, const unsigned int startx, const unsigned int starty, const unsigned int length){
MENU* local = new_menu((ITEM **)items);
menu_opts_off(local, O_ONEVALUE);
set_menu_win(local, window);
set_menu_sub(local, derwin(window, count + 2, length, startx, starty));
set_menu_format(local, count, 1);
set_menu_mark(local, " ");
return local;
}
这是我的菜单的样子:
如果您将实际的代码发布给屏幕截图,可能会有所帮助,因为我无法复制它。
我确实在这里看到了几个问题。 首先,这一行:
set_menu_sub(local, derwin(window, count + 2, length, startx, starty));
注意count + 2
尝试创建一个高度大于其父窗口的子窗口。 根据curs_window(3X)
手册页derwin()
:
如果父窗口指针为null,或其任何纵坐标或尺寸为负,或者结果窗口不适合父窗口,则返回错误。
值得注意的是,在我的机器上, derwin()
在失败时返回NULL
且未设置errno
,因此文档不一定全部存在。
另一个看起来很奇怪的是:
MENU* menu = create_menu(itemsCount, menuWindow, items, 2, 2, 5);
诅咒窗口从其起点开始是0地址,因此,与其余代码一起,它将尝试将菜单置于menuWindow的{2,2}。 也就是说,即使您解决了上述问题,它仍将使用最后一个菜单项覆盖框的底部边框。 而且,您的最后一个参数为5
意味着您的菜单将只有五列, 包括menu_mark字符串 。
为了进一步阅读,我鼓励您查看menu.h
的文档 ,因为它们几乎涵盖了这种情况。
您需要为菜单创建一个子窗口。 因此,您可以在父窗口中移动它。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.