在ncurses中创建动态菜单

时间:2015-08-12 20:08:53

标签: ncurses

我一直试图在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,它是如何运行的。任何见解都会非常感谢。

Pictures of Program

0 个答案:

没有答案