Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Приложения.doc
Скачиваний:
6
Добавлен:
09.11.2019
Размер:
374.78 Кб
Скачать

Приложение 5. Библиотека Menu.H и пример ее использования Библиотека Menu.H

#include "MyCrt.h"

#include <string.h>

using namespace std;

#pragma once;

struct sMenu {

// Количество команд NumberComands <= 20; Текст команды <= 60 символов

int NormAttr; // Цвет не выбранного элемента меню

int ActiveAttr; // Цвет выбранного элемента меню

int SelectedComand; // Номер выбранного элемента меню (от 1 до NumberComands)

int NumberComands; // Количество элементов меню

wchar_t Comands[20][61]; // Тексты элементов меню

int X; // Положение меню на экране

int Y; // Положение меню на экране

};

int ComandMaxLen(sMenu &M)

// Возвращает длину самой длинной команды меню

{

size_t Max = wcslen(M.Comands[0]);

for (int i = 1; i < M.NumberComands; ++i)

if (wcslen(M.Comands[i]) > Max)

Max = wcslen(M.Comands[i]);

return Max;

}

void SetActiveComand(sMenu &M, short ActCom)

// Выделяет в меню выбранную команду

{

int CL = ComandMaxLen(M);

ChangeTextAttribute(M.NormAttr, M.X, M.Y + M.SelectedComand - 1, CL);

ChangeTextAttribute(M.ActiveAttr, M.X, M.Y + ActCom - 1, CL);

GoToXY(M.X + CL, M.Y + ActCom - 1);

M.SelectedComand = ActCom;

}

void DisplayMenu(sMenu &M, int X, int Y )

// Выводит меню на экран

{

M.X = X;

M.Y = Y;

for (int i = 0; i < M.NumberComands; ++i)

{

GoToXY(X, Y + i);

wcout << M.Comands[i] << endl;

}

SetActiveComand(M, M.SelectedComand);

}

int MenuNavigator(sMenu &M, int X, int Y, wchar_t &c)

// Осуществляет перемещение по меню и возвращает номер выбранной команды.

// Параметр "с" соответствует коду клавиши, с помощью которой была выбрана команда

{

CursorVisible(false);

DisplayMenu(M, X, Y);

do

{

if (!ReadKey(c))

{

if (c == 72) // Up

if (M.SelectedComand > 1)

SetActiveComand(M, M.SelectedComand - 1);

else

SetActiveComand(M, M.NumberComands);

if (c == 80) // Dn

if (M.SelectedComand < M.NumberComands)

SetActiveComand(M, M.SelectedComand + 1);

else

SetActiveComand(M, 1);

}

}

while (c != 27 && c != 13);

CursorVisible(true);

return M.SelectedComand;

}

int MenuChoice(sMenu &M, int X, int Y, wchar_t &c)

// Чистит экран и выводит меню в точку (X, Y)

{

ClrScr();

return MenuNavigator(M, X, Y, c);

}

int MenuChoice(sMenu &M, wchar_t &c)

{

// Экран не чистится. Выводит меню в точку, где находится курсор

return MenuNavigator(M, WhereX(), WhereY(), c);

}

Пример использования библиотеки Menu.H

// MenuExample.cpp: определяет точку входа для консольного приложения.

//

#include "stdafx.h"

#include <MyCrt.h>

#include <Menu.h>

using namespace std;

void InitMenu(sMenu &M)

{

sMenu B = {

0x9F, // Цвет не выбранного элемента меню

0x70, // Цвет выбранного элемента меню

1, // Начальный номер выбранного элемента меню

7, // Количество элементов меню

// Тексты элементов меню:

L" Команда 1 ",

L" Команда 2 ",

L" Команда 3 ",

L" Команда 4 ",

L" Команда 5 ",

L" Команда 6 ",

L" Выход "

};

M = B;

}

void InitMenu1(sMenu &M)

{

sMenu B = {

0x9F, // Цвет не выбранного элемента меню

0x70, // Цвет выбранного элемента меню

1, // Начальный номер выбранного элемента меню

2, // Количество элементов меню

// Тексты элементов меню:

L" Команда 31 ",

L" Команда 32 ",

};

M = B;

}

void ComandExecute1(int Com, wchar_t c)

{

switch (Com)

{

case 1: ;

case 2: ;

ClrScr();

cout << 3 << Com << " " << c << endl;

_getwch();

break;

}

}

void ComandExecute(int Com, wchar_t c)

{

switch (Com)

{

case 1: ;

case 2: ;

case 4: ;

case 5: ;

case 6: ;

case 7:

ClrScr();

cout << Com << " " << c << endl;

_getwch();

break;

case 3:

sMenu M1;

InitMenu1(M1);

cout << "->";

Com = MenuChoice(M1, c);

if (c != 27)

ComandExecute1(Com, c);

break;

}

}

int _tmain(int argc, _TCHAR* argv[])

{

setlocale (LC_ALL, ".866");

ConSize(80, 25);

ScrSize(80, 25);

TextColor(0x9F);

ClrScr();

sMenu M;

InitMenu(M);

wchar_t c;

int Key;

do

{

Key = MenuChoice(M, 20, 5, c);

if (c != 27)

ComandExecute(Key, c);

}

while (Key != 7);

return 0;

}