Книга: Основы программирования в 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();
}
- 12.3. Free Transform (Произвольное трансформирование)
- Формирование накладной на отпуск товара
- Формирование товарного отчета
- Настройка, формирование и печать отчетности
- Просмотр складских остатков и формирование ведомости
- 10.3.1. Формирование команды внедрения
- 5.4.2. Формирование списка товаров, работ, услуг
- Формирование и ведение штатного расписания
- Формирование расходной накладной
- Формирование пользовательского меню
- 12.4. Подменю Transform (трансформирование)
- Формирование платежного поручения