⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 menu.cpp

📁 c语言写的VB编译器
💻 CPP
字号:
////////////////////////////////////////////
//                                        //
//    Menu.cpp                            //
//    菜单类实现                          //
//    系统菜单专用                        //
//    最后更新时间:2004年4月23日11:34    //
//                                        //
////////////////////////////////////////////



#include <string.h>
#include <conio.h>

#include "Menu.h"

extern Window winEdit;

Menu::Menu()
{
	// 初始化

	// 无菜单项
	TotItem = -1;
}

Menu::~Menu()
{
}

void Menu::SetName(const char MenuName[MaxLenOfMenuName], const int Seat)
{
	// 设置名字
	strcpy(Name, MenuName);

	// 设置高亮字符位置
	BrightSeat = Seat;
}

void Menu::SetMessage(const char Mess[MaxLenOfMessage])
{
	// 设置说明信息
	strcpy(Message, Mess);
}

void Menu::SetPosition(const int Seat)
{
	// 设置位置
	Position = Seat;
}

void Menu::SetWide(const int Width)
{
	// 设置宽度
	Wide = Width;
}

void Menu::AddItem(const char NewItem[MaxLenOfItem], const char Message[MaxLenOfMessage], const int Seat)
{
	// 添加菜单项

	TotItem ++;

	// 设置菜单项名
	strcpy(Item[TotItem], NewItem);

	// 设置菜单项说明信息
	strcpy(ItemMessage[TotItem], Message);

	// 设置菜单项高亮字符位置
	ItemBrightSeat[TotItem] = Seat;

	if (NewItem[0] == '-')
	{
		// 是分隔符

		Separate[TotItem] = true;
	}
	else
	{
		// 不是分隔符

		Separate[TotItem] = false;
	}
}

void Menu::ActiveMenu()
{
	// 激活菜单

	// 打印菜单名
	gotoxy(Position - 1, 1);
	SetColor(BLACK, GREEN);
	cprintf(" %s ", Name);

	// 打印高亮字符
	gotoxy(Position + BrightSeat, 1);
	SetColor(RED, GREEN);
	cprintf("%c", Name[BrightSeat]);

	if (MenuOn)
	{
		// 菜单是打开的,需打开菜单
		Open();
	}
	else
	{
		// 打印菜单底部信息栏
		PrintMessage();
	}
}

void Menu::InactiveMenu()
{
	// 隐藏菜单

	// 打印菜单名
	gotoxy(Position - 1, 1);
	SetColor(BLACK, WHITE);
	cprintf(" %s ", Name);

	// 打印高亮字符
	gotoxy(Position + BrightSeat, 1);
	SetColor(RED, WHITE);
	cprintf("%c", Name[BrightSeat]);

	if (MenuOn)
	{
		// 菜单是打开的,需关闭菜单
		Close();
	}
}

void Menu::ActiveItem(const int ItemNo)
{
	// 隐藏菜单项

	// 打印菜单项名
	gotoxy(Position, ItemNo + 3);
	SetColor(BLACK, GREEN);
	cprintf(" %s ", Item[ItemNo]);

	// 打印菜单项高亮字符
	SetColor(RED, GREEN);
	PrintChar(ItemNo + 3, Position + ItemBrightSeat[ItemNo] + 1, Item[ItemNo][ItemBrightSeat[ItemNo]]);

	// 打印菜单项说明信息
	PrintMessage(ItemNo);
}

void Menu::InactiveItem(const int ItemNo)
{
	// 隐藏菜单项

	if (IsSeparator(ItemNo))
	{
		// 分隔符

		// 打印边框符号
		SetColor(BLACK, WHITE);
		PrintChar(ItemNo + 3, Position - 1, 195);

		// 打印分隔符
		for (int i = 0; i < Wide + 1; i++)
		{
			PrintChar(ItemNo + 3, Position + i, 196);
		}

		// 打印边框符号
		PrintChar(ItemNo + 3, Position + Wide + 1, 180);
	}
	else
	{
		// 不是分隔符

		PrintItemName(ItemNo);
	}
}

void Menu::Open()
{
	// 打开菜单

	// 设置颜色
	SetColor(BLACK, WHITE);

	// 打印上下边框
	for (int i = Position; i < Position + Wide + 1; i++)
	{
		PrintChar(2, i, 196);
		PrintChar(TotItem + 4, i, 196);
	}

	// 打印左右边框
	for (i = 3; i <= TotItem + 3; i++)
	{
		PrintChar(i, Position - 2, 32);
		PrintChar(i, Position - 1, 179);
		PrintChar(i, Position + Wide + 1, 179);
		PrintChar(i, Position + Wide + 2, 32);
	}

	// 打印4个角
	PrintChar(2, Position - 2, 32);
	PrintChar(2, Position - 1, 218);
	PrintChar(2, Position + Wide + 1, 191);
	PrintChar(2, Position + Wide + 2, 32);
	PrintChar(TotItem + 4, Position - 2, 32);
	PrintChar(TotItem + 4, Position - 1, 192);
	PrintChar(TotItem + 4, Position + Wide + 1, 217);
	PrintChar(TotItem + 4, Position + Wide + 2, 32);

	// 打印菜单项
	for (i = 0; i <= TotItem; i++)
	{
		InactiveItem(i);
	}

	// 激活第1项
	ActiveItem(0);

	// 打印菜单右侧阴影
	SetColor(LIGHTGRAY, BLACK);
	for (i = 0; i <= TotItem + 2; i++)
	{
		if (x0 + i <= TotRoomLine)
		{
			// 阴影下是编辑窗口文本

			PrintChar(i + 3, Position + Wide + 3, Text[x0 + i]->Line[Position + Wide + 1]);
			PrintChar(i + 3, Position + Wide + 4, Text[x0 + i]->Line[Position + Wide + 2]);
		}
		else
		{
			// 阴影下为空

			PrintChar(i + 3, Position + Wide + 3, ' ');
			PrintChar(i + 3, Position + Wide + 4, ' ');
		}
	}

	// 打印菜单底部阴影
	for (i = 0; i <= Wide + 2; i++)
	{
		if (x0 + TotItem + 2 <= TotRoomLine)
		{
			// 阴影下是编辑窗口文本

			PrintChar(TotItem + 5, Position + i, Text[x0 + TotItem + 1]->Line[Position + i - 2]);
		}
		else
		{
			// 阴影下为空

			PrintChar(TotItem + 5, Position + i, ' ');
		}
	}
}

void Menu::Close()
{
	// 关闭菜单

	// 刷新标题,删掉菜单上部边框
	winEdit.RefreshTitle();

	// 恢复编辑窗口文本
	SetColor(YELLOW, BLUE);
	for (int i = 3; i <= TotItem + 5; i++)
	{
		PrintLine(x0 + i -3);
	}
}

void Menu::PrintMenuName()
{
	// 打印菜单名
	gotoxy(Position, 1);
	SetColor(BLACK, WHITE);
	cprintf("%s", Name);

	// 打印菜单高亮字符
	gotoxy(Position + BrightSeat, 1);
	SetColor(RED, WHITE);
	cprintf("%c", Name[BrightSeat]);
}

void Menu::PrintItemName(const int ItemNo)
{
	// 打印菜单项名
	gotoxy(Position, ItemNo + 3);
	SetColor(BLACK, WHITE);
	cprintf(" %s ", Item[ItemNo]);

	// 打印菜单项高亮字符
	SetColor(RED, WHITE);
	PrintChar(ItemNo + 3, Position + ItemBrightSeat[ItemNo] + 1, Item[ItemNo][ItemBrightSeat[ItemNo]]);
}

void Menu::PrintMessage()
{
	// 打印菜单说明信息

	::SetColor(BLACK, WHITE);
	PrintChar(25, 10, 179);
	cprintf(" %s", Message);
	clreol();
}

void Menu::PrintMessage(const int ItemNo)
{
	// 打印菜单项说明信息

	::SetColor(BLACK, WHITE);
	PrintChar(25, 10, 179);
	cprintf(" %s", ItemMessage[ItemNo]);
	clreol();
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -