2015-03-31 69 views
1

我正在尝试做简单的菜单,但我无法让它适合框。你能告诉我我做错了什么吗?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

回答

1

如果你发布实际的代码给screencap中的结果,可能会有帮助,因为我无法复制它。

虽然我确实在这里看到了一些问题。首先,这条线:

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); 

诅咒窗口从它们的起源与您的代码的其余部分0解决,所以,这是要尝试把你的菜单{2, 2} menuWindow。也就是说,即使你解决了上述问题,它仍然会用最后一个菜单条目覆盖框的底部边框。更重要的是,您的最后一个参数是5意味着您的菜单只有五列,其中包括menu_mark字符串

如需进一步阅读,我鼓励您查看documentationmenu.h,因为它们几乎覆盖了这种确切的情况。

0

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