我一直试图在ncurses中创建一个动态菜单一段时间,最后取得了一些成功。但是我担心我实现这一目标的方式存在风险。以下是我的代码:
(x,y,z)
我担心上述代码的原因是因为当我在m_post.c中查看unpost_menu和post_menu的ncurses方法时,我开始担心我的当前代码是如何工作的。在unpost_menu.c的代码中,来自ncurses,它看起来像是这样,
void ListBox::CreateMenu()
{
my_items = (ITEM **) calloc(2,sizeof(ITEM *));
char * choices[] = {"Search Results", (char *) NULL};
my_items[0] = new_item(choices[0], (char *) NULL);
my_items[1] = new_item((char *) NULL, (char *) NULL);
my_menu = new_menu((ITEM**) my_items);
set_menu_win(my_menu, list_window);
der_window = derwin(list_window, h-2,w-2, 1, 1);
//set_menu_sub(my_menu, derwin(list_window, h-2,w-2, 1, 1));
set_menu_sub(my_menu, der_window);
set_menu_format(my_menu, h-2, 1);
set_menu_mark(my_menu, " > ");
post_menu(my_menu);
n_choices = 2;
}
void ListBox::UpdateRange(std::string search, int after_colon)
{
int start = 0;
int end = 0;
if(search_map.count(search.substr(after_colon)))
{
start = search_map[search.substr(after_colon)][0];
end = search_map[search.substr(after_colon)][1];
}
unpost_menu(my_menu);
for(int i = 0; i < n_choices; i++){free_item(my_items[i]);}
if(start == 0 && end == 0)
{
NoResults();
return;
}
my_items = (ITEM **) calloc(int((end-start)+ 1),sizeof(ITEM *));
int count = 0;
for(int i = start; i < end; i++)
{
my_items[count] = new_item(vec[i].c_str(), (char *) NULL);
count++;
}
my_items[int(vec.size())] = new_item((char *) NULL, (char *) NULL);
set_menu_items(my_menu, my_items);
post_menu(my_menu);
wrefresh(list_window);
n_choices = int(end-start) +1 ;
}
void ListBox::NoResults()
{
my_items = (ITEM **) calloc(2,sizeof(ITEM *));
char * choices[] = {"NO RESULTS", (char *) NULL};
my_items[0] = new_item(choices[0], (char *) NULL);
my_items[1] = new_item((char *) NULL, (char *) NULL);
set_menu_items(my_menu, my_items);
post_menu(my_menu);
wrefresh(list_window);
n_choices = 2;
}
我注意到在unpost_menu中有一个对delwin的调用;但是我的代码工作正常,如果没有结果,它会正确显示没有结果,如果有结果,它会正确显示结果。我想知道是否有人有任何洞察力可能实际发生的事情。
我的程序的基本描述如下。 CreateMenu()函数只调用一次,即调用ListBox构造函数时。然后我的程序等待用户输入搜索查询,如果有结果则返回结果。如果没有结果则不返回任何结果。一切看起来都运行正常,但是我很困惑,因为在unpost_menu方法中调用了delwin,它是如何运行的。任何见解都会非常感谢。