uses
  ncurses,menu;

const
  choices : array[0..5] of pchar = (
                        'Choice 1',
                        'Choice 2',
                        'Choice 3',
                        'Choice 4',
                        'Exit',
                        nil
                  );
procedure print_in_middle(win : PWINDOW;starty,startx,width : longint;_string : pchar;color : chtype);
  var
    length,x,y : longint;
    temp : single;
  begin
	if win=nil then
          win:=stdscr;
	getyx(win, y, x);
	if startx <> 0 then
	  x := startx;
	if starty <> 0 then
		y := starty;
	if width=0 then
          width := 80;

	length := strlen(_string);
	temp := (width - length)/ 2;
	x := startx + round(temp);
	wattron(win, color);
	mvwprintw(win, y, x, '%s', [_string]);
	wattroff(win, color);
	refresh;
  end;

var
  my_items : ppitem;
  c : longint;
  my_menu : pmenu;
  my_menu_win : pwindow;
  i,n_choices : longint;
  
begin
	{ Initialize curses }
	initscr;
	start_color;
        cbreak;
        noecho;
	keypad(stdscr, 1);
	init_pair(1, COLOR_RED, COLOR_BLACK);

	{ Create items }
        n_choices := high(choices);
        getmem(my_items,n_choices*sizeof(pitem));
        for i:=0 to n_choices-1 do
          my_items[i] := new_item(choices[i], choices[i]);

	{ Create menu }
        my_menu := new_menu(ppitem(my_items));

	{ Create the window to be associated with the menu }
        my_menu_win := newwin(10, 40, 4, 4);
        keypad(my_menu_win, 1);
     
	{ Set main window and sub window }
        set_menu_win(my_menu, my_menu_win);
        set_menu_sub(my_menu, derwin(my_menu_win, 6, 38, 3, 1));

	{ Set menu mark to the string ' * ' }
        set_menu_mark(my_menu, ' * ');

	{ Print a border around the main window and print a title }
        box(my_menu_win, 0, 0);
	print_in_middle(my_menu_win, 1, 0, 40, 'My Menu', COLOR_PAIR(1));
	mvwaddch(my_menu_win, 2, 0, ACS_LTEE);
	mvwhline(my_menu_win, 2, 1, ACS_HLINE, 38);
	mvwaddch(my_menu_win, 2, 39, ACS_RTEE);
	mvprintw(LINES - 2, 0, 'F1 to exit',[]);
	refresh();
        
	{ Post the menu }
	post_menu(my_menu);
	wrefresh(my_menu_win);

        c:=wgetch(my_menu_win);
	while(c<> KEY_F(1)) do
	  begin
	    case c of
	      KEY_DOWN:
		menu_driver(my_menu, REQ_DOWN_ITEM);
              KEY_UP:
	        menu_driver(my_menu, REQ_UP_ITEM);
	    end;
            wrefresh(my_menu_win);
            c:=wgetch(my_menu_win);
	  end;	

	{ Unpost and free all the memory taken up }
        unpost_menu(my_menu);
        free_menu(my_menu);
        for i:=0 to n_choices-1 do
          free_item(my_items[i]);
	endwin();
end.
