Arial Century Courier Georgia Tahoma Verdana Times New Roman
-
+
"update track information",
"quit",
0,
};
На этом инициализация закончена. Теперь можно переходить к функциям программы, но сначала необходимо составить общее представление о взаимосвязях всех 16 функций. Функции разделены на три программных секции:
отображение меню;
добавление компакт-дисков в базу данных;
извлечение и отображение данных компакт-диска.
Визуальное представление дано на рис. 6.9.
Рис. 6.9
Функция
main
позволяет выбирать пункты меню, пока не выбран вариант выхода из меню (
quit ). Далее приведен соответствующий код.
int main {
int choice;
initscr;
do {
choice = getchoice("Options:", current_cd[0] ? extended_menu : main_menu);
switch (choice) {
case 'q':
break;
case 'a':
add_record;
break;
case 'c':
count_cds;
break;
case 'f':
find_cd;
break;
case 'l':
list_tracks;
break;
case 'r':
remove_cd;
break;
case 'u':
update_cd;
break;
}
} while (choice != 'q');
endwin;
exit(EXIT_SUCCESS);
}
Теперь давайте подробно рассмотрим функции, связанные с тремя секциями программы.
В этой секции рассматриваются три функции, относящиеся к пользовательскому интерфейсу программы.
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++;