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

📄 edit.cpp

📁 c语言写的VB编译器
💻 CPP
📖 第 1 页 / 共 3 页
字号:
			}
		}
		else
		{
			// 菜单未打开

			// 隐藏当前菜单
			mnuCool[NowMenu].InactiveMenu();

			// 设置菜单打开标志
			MenuOn = true;

			// 设置当前菜单为Edit
			NowMenu = MenuEdit;

			// 激活当前菜单
			mnuCool[NowMenu].ActiveMenu();
		}
		break;
	case 'F':
		if (MenuOn)
		{
			// 菜单已经打开

			switch (NowMenu)
			{
			case MenuEdit:
				// 当前菜单为Edit

				// 隐藏当前菜单
				mnuCool[NowMenu].InactiveMenu();

				// 解释执行Find菜单项
				Explain(NowMenu, ItemFind);

				break;
			}
		}
		else
		{
			// 菜单未打开

			// 隐藏当前菜单
			mnuCool[NowMenu].InactiveMenu();

            // 设置菜单打开标志
			MenuOn = true;

			// 设置当前菜单为File
			NowMenu = MenuFile;

			// 激活当前菜单
			mnuCool[NowMenu].ActiveMenu();
		}
		break;
	case 'G':
		if (MenuOn)
		{
			// 菜单已经打开

			switch (NowMenu)
			{
			case MenuRun:
				// 当前菜单为Run

				// 隐藏当前菜单
				mnuCool[NowMenu].InactiveMenu();

				// 解释执行GoToCursor菜单项
				Explain(NowMenu, ItemGoToCursor);

				break;
			}
		}
		break;
	case 'H':
		if (MenuOn)
		{
			// 菜单已经打开

			switch (NowMenu)
			{
			case MenuHelp:
				// 当前菜单为Help

				// 隐藏当前菜单
				mnuCool[NowMenu].InactiveMenu();

				// 解释执行HelpEdit菜单项
				Explain(NowMenu, ItemHelpEdit);

				break;
			}
		}
		else
		{
			// 菜单未打开

			// 隐藏当前菜单项
			mnuCool[NowMenu].InactiveMenu();

			// 设置菜单打开标志
			MenuOn = true;

			// 设置当前菜单为Help
			NowMenu = MenuHelp;

			// 激活当前菜单
			mnuCool[NowMenu].ActiveMenu();
		}
		break;
	case 'M':
		if (MenuOn)
		{
			// 菜单已经打开

			switch (NowMenu)
			{
			case MenuEdit:
				// 当前菜单为Edit

				// 隐藏当前菜单
				mnuCool[NowMenu].InactiveMenu();

				// 解释执行Mark菜单项
				Explain(NowMenu, ItemMark);

				break;
			}
		}
		break;
	case 'N':
		if (MenuOn)
		{
			// 菜单已经打开

			switch (NowMenu)
			{
			case MenuFile:
				// 当前菜单为File

				// 隐藏当前菜单项
				mnuCool[NowMenu].InactiveMenu();

				// 解释执行New菜单项
				Explain(NowMenu, ItemNew);

				break;
			case MenuEdit:
				// 当前菜单为Edit

				// 隐藏当前菜单
				mnuCool[NowMenu].InactiveMenu();

				// 解释执行Following菜单项
				Explain(NowMenu, ItemFollowing);

				break;
			}
		}
		break;
	case 'O':
		if (MenuOn)
		{
			// 菜单已经打开

			switch (NowMenu)
			{
			case MenuFile:
				// 当前菜单为File

				// 隐藏当前菜单
				mnuCool[NowMenu].InactiveMenu();

				// 解释执行Open菜单项
				Explain(NowMenu, ItemOpen);

				break;
			case MenuRun:
				// 当前菜单为Run

				// 隐藏当前菜单
				mnuCool[NowMenu].InactiveMenu();

				// 解释执行Output菜单项
				Explain(NowMenu, ItemOutput);

				break;
			}
		}
		break;
	case 'P':
		if (MenuOn)
		{
			// 菜单已经打开

			switch (NowMenu)
			{
			case MenuFile:
				// 当前菜单为File

				// 隐藏当前菜单
				mnuCool[NowMenu].InactiveMenu();

                // 解释执行Print菜单项
				Explain(NowMenu, ItemPrint);

				break;
			case MenuEdit:
				// 当前菜单为Edit

				// 隐藏当前菜单项
				mnuCool[NowMenu].InactiveMenu();

				// 解释执行Previous菜单项
				Explain(NowMenu, ItemPrevious);

				break;
			}
		}
		break;
	case 'Q':
		if (MenuOn)
		{
			// 菜单已经打开

			switch (NowMenu)
			{
			case MenuFile:
				// 当前菜单为File

				// 隐藏当前菜单
				mnuCool[NowMenu].InactiveMenu();

				// 解释执行Quit菜单项
				Explain(NowMenu, ItemQuit);

				break;
			}
		}
		break;
	case 'R':
		if (MenuOn)
		{
			// 菜单已经打开

			switch (NowMenu)
			{
			case MenuRun:
				// 当前菜单为Run

				// 隐藏当前菜单
				mnuCool[NowMenu].InactiveMenu();

				// 解释执行Run菜单项
				Explain(NowMenu, ItemRun);

				break;
			}
		}
		else
		{
			// 菜单未打开
            
			// 隐藏当前菜单
			mnuCool[NowMenu].InactiveMenu();

			// 设置菜单打开标志
			MenuOn = true;

			// 设置当前菜单为Run
			NowMenu = MenuRun;

			// 激活当前菜单
			mnuCool[NowMenu].ActiveMenu();
		}
		break;
	case 'S':
		if (MenuOn)
		{
			// 菜单已经打开

			switch (NowMenu)
			{
			case MenuFile:
				// 当前菜单为File

				// 隐藏当前菜单
				mnuCool[NowMenu].InactiveMenu();

				// 解释执行Save菜单项
				Explain(NowMenu, ItemSave);

				break;
			case MenuEdit:
				// 当前菜单为Edit

				// 隐藏当前菜单
				mnuCool[NowMenu].InactiveMenu();

				// 解释执行SearchAgain菜单项
				Explain(NowMenu, ItemSearchAgain);

				break;
			case MenuRun:
				// 当前菜单为Run

				// 隐藏当前菜单
				mnuCool[NowMenu].InactiveMenu();

				// 解释执行SearchAgain菜单项
				Explain(NowMenu, ItemSearchAgain);

				break;
			case MenuDebug:
				// 当前菜单为Debug

				// 隐藏当前菜单
				mnuCool[NowMenu].InactiveMenu();

				// 解释执行StopDebugging菜单项
				Explain(NowMenu, ItemStopDebugging);

				break;
			}
		}
		break;
	case 'T':
		if (MenuOn)
		{
			// 菜单已经打开

			switch (NowMenu)
			{
			case MenuEdit:
				// 当前菜单为Edit

				// 隐藏当前菜单
				mnuCool[NowMenu].InactiveMenu();

				// 解释执行Standardize菜单项
				Explain(NowMenu, ItemStandardize);

				break;
			case MenuRun:
				// 当前菜单为Run

				// 隐藏当前菜单
				mnuCool[NowMenu].InactiveMenu();

				// 解释执行StepInto菜单项
				Explain(NowMenu, ItemStepInto);

				break;
			case MenuHelp:
				// 当前菜单为Help

				// 隐藏当前菜单
				mnuCool[NowMenu].InactiveMenu();

				// 解释执行Thanks菜单项
				Explain(NowMenu, ItemThanks);

				break;
			}
		}
		break;
	case 'W':
		if (MenuOn)
		{
			// 菜单已经打开

			switch (NowMenu)
			{
			case MenuDebug:
				// 当前菜单为Debug

				// 隐藏当前菜单
				mnuCool[NowMenu].InactiveMenu();

				// 解释执行Watch菜单项
				Explain(NowMenu, ItemWatch);

				break;
			}
		}
	}
}

void ChangeMode(const Mode ModeCode)
{
	// 切换系统状态(编辑状态,菜单状态)

	// 修改状态变量
	SystemMode = ModeCode;

	switch (SystemMode)
	{
	case EditMode:
		// 修改为编辑状态

		// 打印底部信息栏
		PrintMessages();

		// 设置光标
		SetCursor();

		break;
	case MenuMode:
		// 修改为菜单状态

		// 隐藏光标
		_setcursortype(_NOCURSOR);

		break;
	}
}

void PressRight()
{
	// 处理输入右键

	if (TextY < MaxY - 1)
	{
		// 光标不在行末尾

		// 文本Y坐标加1
		TextY++;

		// 屏幕Y坐标加1
		NowY++;

		// 输出位置
		ShowPosition();
	}
}

void PressLeft()
{
	// 处理输入左键

	if (TextY > 0)
	{
		// 光标不在行首

		// 文本Y坐标减1
		TextY--;

		// 屏幕Y坐标减1
		NowY--;

		// 输出位置
		ShowPosition();
	}
}

void PressDel()
{
	// 处理输入Del

	// 当前行长度,不包括行末空格
	int Len = LengthOf(TextX);

	if (TextY < Len)
	{
		// 光标在行末之前

		if (Text[TextX]->Line[TextY] == ' ' && TextY <= PreviousTab(HeadOf(TextX)))
		{
			// 当前行的光标之前的部分只有空格
			// 将当前行首(非空格)移动到它的前一个Tab区

			// 当前行向前移动的字符数
			int Plus = HeadOf(TextX) - PreviousTab(HeadOf(TextX));

			// 移动当前行文本
			for (int i = 0; i < Len - Plus; i++)
			{
				Text[TextX]->Line[i] = Text[TextX]->Line[i + Plus];
			}

			// 尾部多余部分置空格
			for (i = Len - 1; i >= Len - Plus; i--)
			{
				Text[TextX]->Line[i] = ' ';
			}
		}
		else
		{
			// 光标处有非空格字符,或行首(非空格)已在第1个Tab区

			// 当前行文本前移1位
			for (int i = TextY; i < Len; i++)
			{
				Text[TextX]->Line[i] = Text[TextX]->Line[i + 1];
			}

			if (LengthOf(TextX) == 0)
			{
				// 当前行已空

				// 删除标记和断点
				Text[TextX]->Mark = false;
				Text[TextX]->Break = false;
			}
		}

		// 本行需重新着色
		Text[TextX]->Sign[0] = ' ';

		// 重新打印当前行
		PrintLine(TextX);

		// 设置修改标志
		ShowSaved(false);
	}
	else if (TextX < EndLine)
	{
		// 光标在行末,且下面还有文本行

		if (TextY + LengthOf(TextX + 1) < MaxY)
		{
			// 新的当前行长度不超过编辑窗口宽度

			if (Len > 0)
			{
				// 当前行非空

				// 删除当前行的标记和断点
				Text[TextX + 1]->Mark = false;
				Text[TextX + 1]->Break = false;

				// 以后各行依次向上移动
				for (int i = 0; i < LengthOf(TextX + 1); i++)
				{
					Text[TextX]->Line[i + TextY] = Text[TextX + 1]->Line[i];
				}
			}
			else
			{
                // 当前行为空

				if (TextY > 0)
				{
					// 光标不在行首

					// 将下一行文本添加至当前行文本的末尾
					for (int i = 0; i < LengthOf(TextX + 1); i++)
					{
						Text[TextX]->Line[i + TextY] = Text[TextX + 1]->Line[i];
					}
				}
				else
				{
					// 光标在行首

					// 直接复制当前
					strcpy(Text[TextX]->Line, Text[TextX + 1]->Line);
				}
				Text[TextX]->Mark = Text[TextX + 1]->Mark;
				Text[TextX]->Break = Text[TextX + 1]->Break;
			}

			// 当前行需重新着色
			Text[TextX]->Sign[0] = ' ';

			// 依次移动当前行(不含)后面的各行向上一行(文本,着色码,标记,断点)
			for (int i = TextX + 1; i < EndLine; i++)
			{
				strcpy(Text[i]->Line, Text[i + 1]->Line);
				strcpy(Text[i]->Sign, Text[i + 1]->Sign);
				Text[i]->Mark = Text[i + 1]->Mark;
				Text[i]->Break = Text[i + 1]->Break;
			}

			// 原最后一行清空
			strset(Text[EndLine]->Line, ' ');
			Text[EndLine]->Sign[0] = ' ';
			Text[EndLine]->Mark = false;
			Text[EndLine]->Break = false;

			DelLine();

			EndLine--;

			// 修改编辑窗口的文本高度
			winEdit.SetTotHigh(EndLine);

			// 重新打印当前行以下的各行文本
			PrintText(NowX);

			// 设置修改标志
			ShowSaved(false);
		}
	}

	SetCursor();
}

void PressBackSpace()
{
	// 处理输入BackSpace

	if (TextX == 0 && TextY == 0)
	{
		// 光标在文本左上角,无法前移

		return;
	}
	else if (TextY == 0 && TextX > 0 && LengthOf(TextX) + LengthOf(TextX - 1) > MaxY)
	{
		// 若退至前一行,新的行宽大于编辑窗口的宽度

		Sound();

		return;
	}
	else if (TextY == 0 && TextX > 0 && LengthOf(TextX) + LengthOf(TextX - 1) <= MaxY)
	{
		// 在行首,非第1行,且产生的新的上一行行宽不大于编辑窗口的宽度

		if (LengthOf(TextX - 1) > 0)
		{
			// 上一行非空

			// 删除上一行和当前行的标记和断点
			Text[TextX]->Mark = false;
			Text[TextX]->Break = false;
			Text[TextX - 1]->Mark = false;
			Text[TextX - 1]->Break = false;
		}
		else
		{
			// 上一行为空行

			// 复制当前行状态至上一行
			Text[TextX - 1]->Mark = Text[TextX]->Mark;
			Text[TextX - 1]->Break = Text[TextX]->Break;
		}

		// 设置修改标志
		ShowSaved(false);

		// 设置文本Y坐标为上一行的末尾
		TextY = LengthOf(TextX - 1);

		// 将当前行添加至上一行末尾
		for (int i = 0; i < LengthOf(TextX); i++)
		{
			Text[TextX - 1]->Line[i + TextY] = Text[TextX]->Line[i];
		}

        // 上一行需重新着色
		Text[TextX - 1]->Sign[0] = ' ';

        // 依次移动当前行(含)后面的各行向上一行(文本,着色码,标记,断点)
		for (i = TextX; i < EndLine; i++)
		{
			strcpy(Text[i]->Line, Text[i + 1]->Line);
			strcpy(Text[i]->Sign, Text[i + 1]->Sign);
			Text[i]->Mark = Text[i + 1]->Mark;
			Text[i]->Break = Text[i + 1]->Break;
		}

		// 原最后一行清空
		strset(Text[EndLine]->Line, ' ');
		Text[EndLine]->Sign[0] = ' ';
		Text[EndLine]->Mark = false;
		Text[EndLine]->Break = false;

		DelLine();

		EndLine--;

		// 修改编辑窗口的文本高度
		winEdit.SetTotHigh(EndLine);

		// 文本X坐标上移
		TextX--;

		if (TextX < x0)
		{
			// 当前行超出编辑窗口当前屏

            // 光标在编辑窗口顶行
			NowX = winEdit.Top() + 1;

			// 修改编辑窗口的首行为当前行
			x0 = TextX;
		}
		else
		{
			// 当前行未超出编辑窗口的当前屏

			// 光标上移
			NowX--;
		}

		// 设置光标Y坐标
		NowY = TextY + winEdit.Left() + 1;

		ShowPosition();

		// 重新打印当前行后面的各行
		PrintText(NowX);

		// 输出编辑窗口垂直滚动条
		winEdit.ScrollVertical(TextX);
	}
	else
	{
		// 不会影响上一行

		if (TextY == 1)
		{
			// 删除后当前行空

			// 删除当前行的标记和断点
			Text[TextX]->Mark = false;
			Text[TextX]->Break = false;
		}

		if (TextY <= HeadOf(TextX) || LengthOf(TextX) == 0)
		{
			// 当前行光标前只有空格,或当前行为空
			// 整行前移至前一个Tab区

			// 前移的位数
			int Plus = TextY - PreviousTab(TextY);

			// 当前行的长度(非空格)
			int Len = LengthOf(TextX);

			// 整行前移至前一个Tab区
			for (int i = HeadOf(TextX) - Plus; i < Len - Plus; i++)
			{
				Text[TextX]->Line[i] = Text[TextX]->Line[i + Plus];
			}

			// 后部多余的部分清空
			for (i = Len - 1; i >= Len - Plus; i--)
			{
				Text[TextX]->Line[i] = ' ';
			}

			// 本行需重新着色
			Text[TextX]->Sign[0] = ' ';

			// 计算新的文本Y坐标
			TextY -= Plus;

			// 设置光标Y坐标
			NowY = TextY + winEdit.Left() + 1;

			// 重新打印当前行
			PrintLine(TextX);
		}
		else if (LengthOf(TextX) > 0 || TextX == 0)
		{
			// 只会删除前一个字符

			// 文本Y坐标前移1位
			TextY--;

			// 当前行前移1位

⌨️ 快捷键说明

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