【问题标题】:Ncurses menu out of bordersNcurses 菜单越界
【发布时间】:2015-03-31 11:48:14
【问题描述】:

我正在尝试制作简单的菜单,但我无法将其放入盒子中。你能告诉我我做错了什么吗?

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

这就是我的菜单的样子:

【问题讨论】:

    标签: c menu window ncurses


    【解决方案1】:

    如果您在屏幕截图中发布能够为您提供结果的实际代码可能会有所帮助,因为我无法重现它。

    不过,我确实看到了一些问题。首先,这一行:

    set_menu_sub(local, derwin(window, count + 2, length, startx, starty));
    

    注意count + 2 试图创建一个高度大于其父窗口的子窗口。根据curs_window(3X) 手册页,derwin()

    如果父窗口指针为空,或者它的任何纵坐标或尺寸为负数,或者结果窗口不适合父窗口,则返回错误。

    值得注意的是,在我的机器上,derwin() 在失败时返回NULL,并且没有设置errno,因此文档不一定都在那里。

    另外一个看起来很奇怪的是:

    MENU* menu = create_menu(itemsCount, menuWindow, items, 2, 2, 5);
    

    Curses 窗口从它们的源开始是 0 寻址的,因此对于您的其余代码,这将尝试将您的菜单放在 menuWindow 的 {2,2} 处。也就是说,即使您修复了上述问题,它仍然会使用最后一个菜单条目覆盖框的底部边框。更重要的是,您的最后一个参数是 5 意味着您的菜单将只有五列包括 menu_mark 字符串

    为了进一步阅读,我建议您查看 documentationmenu.h,因为它们几乎涵盖了这种确切的场景。

    【讨论】:

      【解决方案2】:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2017-04-04
        • 2014-05-31
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-07-19
        相关资源
        最近更新 更多