Основы программирования в Linux
Часть 108 из 324 Информация о книге
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];<i> draw_menu(choices, selected_row, start_screen_row, start_screencol);</i>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<i>void clear all_screen() {</i>clear();mvprintw(2, 20, "%s", "CD Database Application");if (current_cd[0]) {mvprintw(ERROR_LINE, 0, "Current CD: %s: %s\n", current_cat, current_cd);}refresh();}Управление базой данных
В этом разделе описаны функции пополнения или обновления базы данных компакт-дисков. Функции
,add_recordиupdate_cdвызываются из функцииremove_cd.mainДобавление записей1. Добавьте сведения о новом компакт-диске в базу данных.
<i>void add_record {</i>char catalog_number[MAX_STRING];char cd_title[MAX_STRING];char cd_type[MAX_STRING];char cd_artist[MAX_STRING];char cd_entry[MAX_STRING];int screenrow = MESSAGE_LINE;int screencol = 10;<i> clear_all_screen();</i>mvprintw(screenrow, screencol, "Enter new CD details");screenrow += 2;mvprintw(screenrow, screencol, "Catalog Number: " );<i> get_string(catalog_number);</i>screenrow++;mvprintw(screenrow, screencol, " CD Title: ");<i> get_string(cd_title);</i>screenrow++;mvprintw(screenrow, screencol, " CD Type: ");<i> get_string(cd_type);</i>screenrow++;mvprintw(screenrow, screencol, " Artist: ");<i> get_string(cd_artist);</i>screenrow++;mvprintw(PROMPT_LINE-2, 5, "About to add this new entry:");sprintf(cd_entry, "%s, %s, %s, %s",catalog_number, cd_title, cd_type, cd_artist);mvprintw(PROMPT_LINE, 5, "%s", cd_entry);refresh();move(PROMPT_LINE, 0);<i> if (get_confirm()) {</i><i> insert_title(cd_entry);</i>strcpy(current_cd, cd_title);strcpy(current_cat, catalog_number);}}2. Функция
приглашает к вводу и считывает строку из текущей позиции экрана. Она также удаляет завершающую новую пустую строку:get_string