Ncurses 菜单越界
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;
}
我的菜单是这样的:
您需要为菜单创建一个子window。所以你可以在父window.
中移动它
如果您 post 在屏幕截图中给出结果的实际代码可能会有所帮助,因为我无法重现它。
不过,我确实看到了一些问题。首先,这一行:
set_menu_sub(local, derwin(window, count + 2, length, startx, starty));
请注意 count + 2
试图创建一个高度大于其父窗口的子窗口。根据 curs_window(3X)
手册页,derwin()
:
returns an error if the parent window pointer is null, or if any of its ordinates or dimensions is negative, or if the resulting window does not fit inside the parent window.
值得注意的是,在我的机器上,derwin()
returns NULL
失败并且没有设置 errno
,所以文档不一定都在那里.
另一件看起来很奇怪的事情是:
MENU* menu = create_menu(itemsCount, menuWindow, items, 2, 2, 5);
Curses windows 从它们的源开始是 0 寻址的,因此对于您的其余代码,这将尝试将您的菜单放在 menuWindow 的 {2,2} 处。也就是说,即使你修复了上面的问题,它仍然会用最后一个菜单项写在你的框的底部边框上。更重要的是,你的最后一个参数是 5
意味着你的菜单将只有五列 包括 menu_mark 字符串 .
如需进一步阅读,我建议您查看 menu.h
的 documentation,因为它们几乎涵盖了这种情况。
我正在尝试制作简单的菜单,但我无法将其放入框内。你能告诉我我做错了什么吗?
// 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;
}
我的菜单是这样的:
您需要为菜单创建一个子window。所以你可以在父window.
中移动它如果您 post 在屏幕截图中给出结果的实际代码可能会有所帮助,因为我无法重现它。
不过,我确实看到了一些问题。首先,这一行:
set_menu_sub(local, derwin(window, count + 2, length, startx, starty));
请注意 count + 2
试图创建一个高度大于其父窗口的子窗口。根据 curs_window(3X)
手册页,derwin()
:
returns an error if the parent window pointer is null, or if any of its ordinates or dimensions is negative, or if the resulting window does not fit inside the parent window.
值得注意的是,在我的机器上,derwin()
returns NULL
失败并且没有设置 errno
,所以文档不一定都在那里.
另一件看起来很奇怪的事情是:
MENU* menu = create_menu(itemsCount, menuWindow, items, 2, 2, 5);
Curses windows 从它们的源开始是 0 寻址的,因此对于您的其余代码,这将尝试将您的菜单放在 menuWindow 的 {2,2} 处。也就是说,即使你修复了上面的问题,它仍然会用最后一个菜单项写在你的框的底部边框上。更重要的是,你的最后一个参数是 5
意味着你的菜单将只有五列 包括 menu_mark 字符串 .
如需进一步阅读,我建议您查看 menu.h
的 documentation,因为它们几乎涵盖了这种情况。