我正在尝试做简单的菜单,但我无法让它适应盒子。你能告诉我我做错了什么吗?
// 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;
}
这就是我的菜单的样子:
答案 0 :(得分:1)
如果你发布了在screencap中给你结果的实际代码,那可能会有所帮助,因为我无法重现它。
但我确实在这里看到了一些问题。首先,这一行:
set_menu_sub(local, derwin(window, count + 2, length, startx, starty));
请注意count + 2
尝试制作高度大于其父级的子窗口。根据{{1}}手册页curs_window(3X)
:
如果父窗口指针为空,或者其任何纵坐标或尺寸为负,或者生成的窗口不适合父窗口,则返回错误。
值得注意的是,在我的计算机上,derwin()
在失败时返回derwin()
并且未设置NULL
,因此文档不一定都在那里。
另一件看起来很奇怪的事是:
errno
Curses窗口的来源是0,因此对于其余的代码,这将尝试将菜单放在menuWindow的{2,2}处。也就是说,即使您修复了上述内容,它仍然会使用最后一个菜单条目覆盖您框中的底部边框。更重要的是,您的上一个参数MENU* menu = create_menu(itemsCount, menuWindow, items, 2, 2, 5);
表示您的菜单只有五列,包括menu_mark字符串。
如需进一步阅读,我建议您查看5
的{{3}},因为它们几乎涵盖了这一情况。
答案 1 :(得分:0)
您需要为菜单创建子窗口。所以你可以在父窗口中移动它。