Книга: Основы программирования в Linux

Формирование меню

Формирование меню

В этой секции рассматриваются три функции, относящиеся к пользовательскому интерфейсу программы.

1. Функция getchoice, вызываемая из функции main, — это основная функция данной секции. В функцию getchoice передается приглашение greet и указатель choices на базовое или расширенное меню (в зависимости от того, выбран ли компакт-диск). Вы также увидите, как main_menu или extended_menu передаются как параметры в описанную ранее функцию main.

int get_choice(char *greet, char* choises[]) {
 static int selected_row = 0;
 int max_row = 0;
 int start_screenrow = MESSAGE_LINE, start_screencol = 10;
 char **option;
 int selected;
 int key = 0;
 option = choices;
 while (*option) {
  max_row++;
  option++;
 }
 if (selected_row >= max_row)
  selected_row = 0;
 clear_all_screen();
 mvprintw(start_screenrow - 2, start_screencol, greet);
 keypad(stdscr, TRUE);
 cbreak();
 noecho();
 key = 0;
 while (key != 'q' && key != KEY_ENTER && key != 'n') {
  if (key == KEY_UP) {
   if (selected_row == 0) selected_row = max_row - 1;
   else selected_row--;
  }
  if (key == KEY_DOWN) {
   if (selected_row == (max_row - 1)) selected_row = 0;
   else selected_row++;
  }
  selected = *choices[selected_row];
  draw_menu(choices, selected_row, start_screen_row, start_screencol);
  key = getch();
 }
 keypad(stdscr, FALSE);
 nocbreak();
 echo();
 if (key == 'q') selected = 'q';
 return(selected);
}

2. Обратите внимание на то, как две локальные функции clear_all_screen и draw_menu вызываются внутри функции getchoice. Первой рассмотрим функцию draw_menu:

void draw_menu(char* options[], int current_highlight, int start_row, int start_col) {

 int current_row = 0;
 char **option_ptr;
 char *txt_ptr;
 option_ptr = options;
 while (*option_ptr) {
  if (current_row == current_highlight) attron(A_STANDOUT);
  txt_ptr = options[current_row];
  txt_ptr++;
  mvprintw(start_row + current_row, start_col, "%s", txt_ptr);
  if (current_row == current_highlight) attroff(A_STANDOUT);
  current_row++;
  option_ptr++;
 }
 mvprintw(start_row + current_row + 3, start_col,
  "Move highlight then press Return ");
 refresh();
}

3. Далее рассмотрим функцию clear_all_screen, которая, как ни странно, очищает экран и перезаписывает заголовок. Если компакт-диск выбран, отображаются его данные:

void clear all_screen() {
 clear();
 mvprintw(2, 20, "%s", "CD Database Application");
 if (current_cd[0]) {
  mvprintw(ERROR_LINE, 0, "Current CD: %s: %sn", current_cat, current_cd);
 }
 refresh();
}

Оглавление книги


Генерация: 1.153. Запросов К БД/Cache: 3 / 0
поделиться
Вверх Вниз