Ncurses菜单超出边界

时间:2015-03-31 11:48:15

标签: c menu window ncurses

我正在尝试做简单的菜单,但我无法让它适应盒子。你能告诉我我做错了什么吗?

 // 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;
}

这就是我的菜单的样子: enter image description here

2 个答案:

答案 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)

您需要为菜单创建子窗口。所以你可以在父窗口中移动它。