2012-04-20 12 views
3

item_nameをncursesメニューからどのように置き換えることができるかを調べようとしています。 man pagesから、私はset_item_nameか何か類似したものを見つけることができません。このための回避策がある場合、任意のアイデアですか? ncurses&Cの文字列メニュー項目を置き換える方法

例えば、 KEY_ENTER

#include <curses.h> 
#include <menu.h> 

char *choices[] = { 
    "Choice 1", "Choice 2", "Choice 3", "Choice 4", "Exit", 
}; 

int main() { 
    ITEM **my_items, *cur_item; 
    int c, i; 
    MENU *my_menu; 

    initscr(); 
    cbreak(); 
    noecho(); 
    keypad(stdscr, TRUE); 

    my_items = (ITEM **) calloc(6, sizeof(ITEM *)); 
    for (i = 0; i < 5; ++i) 
     my_items[i] = new_item(choices[i], choices[i]); 
    my_items[5] = (ITEM*) NULL; 

    my_menu = new_menu((ITEM **) my_items); 
    post_menu(my_menu); 
    refresh(); 

    while ((c = getch()) != KEY_F(1)) { 
     switch (c) { 
     case KEY_ENTER: 
      // e.g. replace "Choice 1" w/ "String 1" 
      break; 
     case KEY_DOWN: 
      menu_driver(my_menu, REQ_DOWN_ITEM); 
      break; 
     case KEY_UP: 
      menu_driver(my_menu, REQ_UP_ITEM); 
      break; 
     } 
    } 
    free_item(my_items[0]); 
    free_item(my_items[1]); 
    free_menu(my_menu); 
    endwin(); 
} 

答えて

1

にワット"Choice 1"/"String 1"を交換して再び期待される方法であるset_menu_items()を呼び出すように見えます。

+0

ありがとう、それは理にかなっています! – user1024718

1

はい、あなたはITEM構造のための構造定義を見つけることができます含まfile menu.h、見、set_item_name();

ファーストを書くことができますset_item_name()不足しているため、回避策があります。引数について

void set_item_name (ITEM *itm, const char* name) 
{ int len = strlen(name); 
    char* n;  
    if (itm->name.str!=NULL) free((void*)(itm->name).str); 
    n=strdup(name); 
    itm->name.length=len; 
    itm->name.str=n; 
} 

: はあなたがのような関数を書くことができていることがわかりあっ探し

  • ITMは、あなたが

  • 名を変更したいメニュー項目へのポインタをされていますメニュー名として使用する文字列。

私は、ドロップダウンメニューに「チェックボックス」アイテムを作成するには、このルーチンを使用し、(linux debian 6.0libncurses5 (5.7)上でテスト)動作するようです。

関連する問題