Deutsch

Меню как в Q&A 20.04.2025

15  
uscheswoi_82 патриотВчера, 20:07
Вчера, 20:07 

Всем привет! Скучно и я решил поиграться, создал своё меню где-то за 2 часа, как вот это, правда немного криво, но когда будет время и желания, я подправлю код:



Подсказку я сделаю позже:



Программировал я на этом:













Вот код:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <conio.h>
#include <bios.h>

#define MENU_COUNT  6 /* Количество меню 5 */
#define M_LEFT 14 /* Меню влево 14 */
#define M_TOP  10 /* Меню вверх 10 */
#define M_WIDTH 40 /* Ширина меню 40 */
#define M_HEIGHT 20 /* Высота меню 20 */

#define KEY_ESC    283   /* Клавиша ESC */
#define KEY_LEFT   19200 /* Клавиша влево */
#define KEY_RIGHT  19712 /* Клавиша вправо */
#define KEY_UP     18432 /* Клавиша вверх */
#define KEY_DOWN   20480 /* Клавиша вниз */

/* Меню */
char *menus[] = {"Ф - Файл",
                 "О - Отчёт",
                 "Р - Редактор",
                 "А - Ассистент",
                 "У - Утилиты",
                 "В - Выход"};

/* Для рисования меню */
void draw_menu(int x, int y) {
  int j=0;
  textattr(CYAN * 0x10 + BLACK);
  for(j=0; j<MENU_COUNT; j++) {
    gotoxy(x, y+j);
    cprintf("%s", menus[j]);
  }
}

/* Для рисования меню с выделеным элементом */
void draw_menu_sel(int sel, int x, int y) {
  int j=0;
  for(j=0; j<MENU_COUNT; j++) {
     gotoxy(x, y + j);
     if(j == sel)
       textattr(CYAN * 0x10 + WHITE);
     else
       textattr(CYAN * 0x10 + BLACK);

     cprintf("%s", menus[j]);
  }
}

int main(void) {
  int x, y, key, sel, j;
  /* Устанавливает синий фон, белые буквы */
  textattr(BLUE * 0x10 + CYAN);
  /* Очищает экран */
  clrscr();
  /* Устанавливает чёрный фон, чёрные буквы */
  textattr(BLACK * 0x10 + BLACK);
  /* Рисует чёрный прямоугольник */
  for(y=M_TOP+1; y<M_HEIGHT+1; y++) {
    for(x=M_LEFT+1; x<M_WIDTH+1; x++) {
      gotoxy(x, y);
      cprintf(" ");
    }
  }

  /* Устанавливает фон циановый, а буквы белые */
  textattr(CYAN * 0x10 + WHITE);
  /* Рисует циановый прямоугольник */
  for(y=M_TOP; y<M_HEIGHT; y++) {
    for(x=M_LEFT; x<M_WIDTH; x++) {
      gotoxy(x, y);
      cprintf(" ");
    }
  }

  /* Переходит для рисование меню */
  gotoxy(M_LEFT, M_TOP);
  textattr(CYAN * 0x10 + WHITE);
  /* Отображает Главное меню */
  cprintf("       Главное меню");
  gotoxy(M_LEFT, M_TOP+1);
  /* Отображает  ------------------------ */
  cprintf(" ------------------------ ");

  /* Инициализация */
  key = -1;
  sel = 0;

  /* Печатает на экране быструю подсказку */
  gotoxy(1, 21);
  textattr(BLUE * 0x10 + CYAN);
  for(j=1; j<80; j++) {
    gotoxy(j, 21);
    cprintf("-");
  }
  gotoxy(1, 22);
  cprintf("Q&A версия 55.0      Copyright(c) 1990-2025 uscheswoi_82     All right reserved");
  textattr(BLUE * 0x10 + WHITE);
  gotoxy(1, 23);
  cprintf("Напоминание:Выберете утилиты для настройки принтера");
  textattr(BLUE * 0x10 + CYAN);
  gotoxy(1, 24);
  cprintf("ESC или В-выход из программы   F1-Отображение подсказки  <----| - Выбрать");

  /* Рисует меню */
  draw_menu(M_LEFT + 6, M_TOP + 3);
  /* Рисует меню */
  draw_menu_sel(0, M_LEFT + 6, M_TOP + 3);
  /* Цикл, пока не нажмёт пользователь на клавишу ESC */
  while(key != KEY_ESC) {
    /* Ждёт нажатие клавиши */
    key = bioskey(0);
    /* Определяет какая клавиша нажата */
    switch(key) {
      case KEY_UP:
 /* Если нажата клавиша вниз, проверяет где находится курсор меню */
 if(sel > 0) sel --;
      break;
      case KEY_DOWN:
 /* Если нажата клавиша вверх, проверяет где находится курсор меню */
 if(sel < MENU_COUNT - 1) sel ++;
      break;
    }
    /* Рисует меню */
    draw_menu_sel(sel, M_LEFT + 6, M_TOP + 3);
  }
  /* Если нажали клавишу ESC */
  /* Устанавливает фон чёрный, а цвет букв серый */
  textattr(BLACK * 0x10 + LIGHTGRAY);
  /* Очищает экран */
  clrscr();
}



Вуаля! А вот и результат:



Если я кому-то отвечаю, это не значит что я ему симпатизирую, каждый остаётся при своём мнение
#1