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

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

这是我的菜单的样子: 在此处输入图片说明

#1楼 票数:1 已采纳

如果您将实际的代码发布给屏幕截图,可能会有所帮助,因为我无法复制它。

我确实在这里看到了几个问题。 首先,这一行:

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

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

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

值得注意的是,在我的机器上, derwin()在失败时返回NULL且未设置errno ,因此文档不一定全部存在。

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

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

诅咒窗口从其起点开始是0地址,因此,与其余代码一起,它将尝试将菜单置于menuWindow的{2,2}。 也就是说,即使您解决了上述问题,它仍将使用最后一个菜单项覆盖框的底部边框。 而且,您的最后一个参数为5意味着您的菜单将只有五列, 包括menu_mark字符串

为了进一步阅读,我鼓励您查看menu.h文档 ,因为它们几乎涵盖了这种情况。

#2楼 票数:0

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

  ask by Desana Daxnerová translate from so

未解决问题?本站智能推荐:

1回复

如何在ncurses中正确删除菜单?

我需要知道从屏幕上删除菜单的正确方法是什么。 菜单发布在我专门为它创建的窗口中,请参阅代码: 如果我调用makemenu()然后以这种方式销毁它,菜单会在下一个getch()调用时消失(例如),我希望它在我销毁时消失。 我应该使用哪些命令? 谢谢
1回复

基本Ncurses菜单

我试图用C做一个基本菜单。我应该用ncurses lib来做。 我正在使用本教程: YouTube上的视频 但是我的版本存在一些问题:1)菜单无法正确打印,仅在选择菜单项时才会显示。 然后高光不会消失2)菜单上的选项不会在顶部打印 你能帮助我吗? Menu的想法是好的还是我应该
1回复

Ncurses菜单-记住选择

我正在使用Ncurses库执行一些交互式菜单,但我不知道该怎么做。 我有一个简单的菜单,没有几个选项,我打开了O_ONEVALUE因此可以同时选择许多选项,在发布菜单之前,我会获得所有菜单项并将它们标记为已选中或未选中,具体取决于我保存在某处的位掩码否则,但是在发布菜单时,每个选项都被关闭,这
1回复

如何重绘ncurses菜单

我正在使用基于ncurses的工具,该工具具有4个平铺的窗口,并且在屏幕底部具有命令栏。 窗口形成一个2x2的网格,如下所示: 左上角的大小是固定的,因此,在调整应用大小时,宽度会发生2个变化,高度会发生3个变化,两个方向都发生4个变化。 在开始在窗口4中放置菜单(使用menu.
1回复

在ncurses菜单中禁用菜单标记

我正在尝试使用ncurses创建启动菜单。 我想删除选定的项目标记(默认为“-”)。 man set_menu_mark告诉我可以更改该字符串,但不能删除它。 有什么建议吗? 为了避免您的反贫困问题过滤器,我必须附加一些代码...
1回复

Ncurses:如何在不丢失当前位置的情况下刷新菜单?

如何在不丢失当前位置的情况下重新加载菜单中的数据? 例如,当用户“选择”项目时,执行改变数据的动作。 (更新项目,删除项目或在菜单中添加新项目。)我想重新加载菜单但仍然将光标保持在刚刚选择的项目上。 最好的方法是什么? 作为参考,这个问题似乎非常接近,但我认为它不包括添加/删除
2回复

ncurses在屏幕上的多种颜色

我想用ncurses.h和多种颜色制作一个菜单。 我的意思是这样的: 但是,如果我使用init_pair() , attron()和attroff() ,整个屏幕的颜色是相同的,而不是像我预期的那样。 这段代码出了什么问题? 谢谢你的每一个答案!
2回复

ncurses.h,即使刷新后,wprintw也无法正常工作

我正在使用库ncurses,当我尝试调用wprintw() ,然后在右侧窗口中执行wrefresh时,它什么也不会打印。 当我执行此操作时,什么也不显示。 我在Ubuntu 14.04 LTS上,我使用gcc进行编译: 然后在gnome-terminal中执行