2

画面からメニューを削除する正しい方法を知る必要があります。メニューは、私が特別に作成したウィンドウ内に表示されます。コードを参照してください。

void makeMenu() {
  MENU *menu;
  WINDOW *win;
  ITEM **items;
  int choicesC = 4;

  items = (ITEM**) calloc(choicesC, sizeof (ITEM*));
  for (int i = 0; i < choicesC; i++) {
      items[i] = new_item(choices[i], choices[i]);
  }

  menu = new_menu(items);

  win = newwin(10, 40, 4, 4);
  keypad(win, true);

  set_menu_win(menu, win);
  set_menu_sub(menu, derwin(win, 6, 38, 3, 1));

  set_menu_mark(menu, "*  ");

  box(win, 0, 0);

  post_menu(menu);
  wrefresh(win);


  int c;
  bool continueB=true;
  while ((c = wgetch(win)) != KEY_F(1)  && continueB) {
      switch (c) {
          case KEY_DOWN:
              menu_driver(menu, REQ_DOWN_ITEM);
              break;
          case KEY_UP:
              menu_driver(menu, REQ_UP_ITEM);
              break;

          case 10:
              if (current_item(menu)->index== 3) continueB=false;
              break;
      }
      wrefresh(win);
  }

  unpost_menu(menu);
  for (int i=0; i<choicesC; i++){
      free_item(items[i]);
  }
  free_menu(menu);

  /* I can't figure out which commands to 
     call to instantly delete and redraw the menu
  wclear(win);
  wrefresh(win);
  delwin(win);
  clear();
  refresh();
  */
}

この方法で呼び出しmakemenu()てから破棄すると、次の getch() 呼び出しでメニューが消えます (たとえば)。破棄すると消えてしまいます。そのためにどのコマンドを使用すればよいですか?

ありがとう

4

1 に答える 1

4

まあ、私はそれを理解し、これが正しい解決策だと思います。問題は、そのメニューのサブウィンドウunpost_menu(*MENU)のみを破棄するため、フレーム ウィンドウを自分で削除する必要があることです。クリーンアップ手順は次のようになります。

(...)
unpost_menu(menu);
for (int i=0; i<choicesC; i++){
    free_item(items[i]);
}
free_menu(menu);
wborder(win, ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' '); // Erase frame around the window
wrefresh(win); // Refresh it (to leave it blank)
delwin(win); // and delete

refresh()もちろん、メニューの背後に何かがあった場合を除き、この後はする必要はありません。その場合は、再塗装する必要があります。

于 2013-03-07T10:57:27.490 に答える