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

📄 edit.cpp

📁 c语言写的VB编译器
💻 CPP
📖 第 1 页 / 共 3 页
字号:
/////////////////////////////////////////////////////////
//                                                     //
//    Edit.cpp                                         //
//    编辑模块                                         //
//    接受用户菜单、快捷键输入,指向Explain解释模块    //
//    接受并直接处理代码输入                           //
//    最后更新时间:2004年4月23日16:04                 //
//                                                     //
/////////////////////////////////////////////////////////



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

#include "Edit.h"

void EditProgram
	(
	int &NowMenu,	// 菜单值
	int &NowItem	// 菜单项值
	)
{
	int Key;

	gotoxy(NowY, NowX);

	// 菜单未打开
	MenuOn = false;

	do
	{
		// 读入用户输入
		Receive(Key);

		if (SystemMode == MenuMode)
		{
			// 当前系统处于菜单状态

			switch (Key)
			{
			case KeyRight:
				// 输入为右键

				// 项目序号赋值
				NowItem = 0;

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

				// 计算下一个菜单序号
				NowMenu = (NowMenu + 1) % Menu::TotMenu;

				// 激活新的菜单
				mnuCool[NowMenu].ActiveMenu();

				break;
			case KeyLeft:
				// 输入为左键

				// 项目序号赋值
				NowItem = 0;

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

				// 计算前一个菜单的序号
				NowMenu--;
				if (NowMenu < 0) 
				{
					NowMenu = Menu::TotMenu - 1;
				}

                // 激活新的菜单
				mnuCool[NowMenu].ActiveMenu();

				break;
			case KeyUp:
				// 输入为上键

				if (MenuOn)
				{
					// 菜单已经打开

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

					// 计算上一个菜单项,注意越过菜单项之间的分隔符
					do
					{
						NowItem--;
						if (NowItem < 0) 
						{
							NowItem = mnuCool[NowMenu].TotMenuItem() - 1;
						}
					} while (mnuCool[NowMenu].IsSeparator(NowItem));

					// 激活新的菜单项
					mnuCool[NowMenu].ActiveItem(NowItem);
				}
				break;
			case KeyDown:
				// 输入为下键

				if (MenuOn)
				{
					// 菜单已经打开

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

					// 计算下一个菜单项注意越过菜单项之间的分隔符
					do
					{
						NowItem = (NowItem + 1) % mnuCool[NowMenu].TotMenuItem();
					} while (mnuCool[NowMenu].IsSeparator(NowItem));

					// 激活新的菜单项
					mnuCool[NowMenu].ActiveItem(NowItem);
				}
				else
				{
					// 菜单未打开

					// 打开菜单
					MenuOn = true;
					mnuCool[NowMenu].Open();
				}
				break;
			case KeyEnter:
				// 输入为回车键

				if (MenuOn)
				{
                    // 菜单已经打开

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

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

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

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

					// 设置当前菜单项
					NowItem = 0;

                    // 打开当前菜单
					mnuCool[NowMenu].Open();
				}
				break;
			case KeyEsc:
				// 输入为Esc键

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

				// 设置系统状态为编辑状态
				ChangeMode(EditMode);

				gotoxy(NowY, NowX);
				break;
			default:
				// 输入为菜单快捷字母键
				PressMenuLetterKey(Key, NowMenu);
			}
		}
		else
		{
			// 当前系统处于编辑状态

			switch (Key)
			{
			case KeyF1:
				// 输入为F1
				// 打开语法帮助窗口

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

				// 设置当前菜单项为Syntax
				NowItem = ItemHelpEdit;

				return;
			case KeyF2:
				// 输入为F2
				// 存盘

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

				// 设置当前菜单项为Save
				NowItem = ItemSave;

				return;
			case KeyF3:
				// 输入为F3
				// 打开文件

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

				// 设置当前菜单项为Open
				NowItem = ItemOpen;

				return;
			case KeyF4:
				// 输入为F4
				// 运行到光标当前行

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

				// 设置当前菜单项为GoToCursor
				NowItem = ItemGoToCursor;

				return;
			case KeyF7:
				// 输入为F7
				// 单步执行,进入Sub

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

				// 设置当前菜单项为StepInto
				NowItem = ItemStepInto;

				return;
			case KeyF8:
				// 输入为F8
				// 单步执行,不进入Sub

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

				// 设置当前菜单项为StepOver
				NowItem = ItemStepOver;

				return;
			case KeyF10:
				// 输入为F10
				// 选择菜单

				// 改变系统状态为菜单状态
				ChangeMode(MenuMode);

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

				// 激活当前菜单
				mnuCool[NowMenu].ActiveMenu();

				break;
			case KeyAltF6:
				// 输入为Alt + F6
				// 查看输出窗口

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

				// 设置当前菜单项为Output
				NowItem = ItemOutput;

				return;
			case KeyCtrlF1:
				// 输入为Ctrl + F1
				// 查看语法帮助窗口

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

				// 设置当前菜单项为HelpOnSyntax
				NowItem = ItemHelpSyntax;

				return;
			case KeyCtrlF2:
				// 输入为Ctrl + F2
				// 停止单步调试

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

				// 设置当前菜单项为StopDebugging
				NowItem = ItemStopDebugging;

				return;
			case KeyCtrlF7:
				// 输入为Ctrl + F7
				// 监视表达式的值

				// 设置当前菜单为Debug
				NowMenu = MenuDebug;

				// 设置当前菜单项为Watch
				NowItem = ItemWatch;

				return;
			case KeyCtrlF9:
				// 输入为Ctrl + F9
				// 解释执行当前程序

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

				// 设置当前菜单项为Run
				NowItem = ItemRun;

				return;
			case KeyInsert:
				// 输入为Insert
				// 在插入和改写状态之间切换

				// 显示并改变Insert标志
				ShowInsert(true + false - Insert);

				break;
			case KeyAltF:
				// 输入为Alt + F
				// 打开File菜单

				// 改变系统为菜单状态
				ChangeMode(MenuMode);

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

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

				// 设置当前菜单项
				NowItem = 0;

				// 激活File菜单
				mnuCool[NowMenu].ActiveMenu();

				break;
			case KeyAltE:
				// 输入为Alt + E
				// 打开Edit菜单

				// 改变系统为菜单状态
				ChangeMode(MenuMode);

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

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

				// 设置当前菜单项
				NowItem = 0;

				// 激活Edit菜单
				mnuCool[NowMenu].ActiveMenu();

				break;
			case KeyAltR:
				// 输入为Alt + R
				// 打开Run菜单

				// 改变系统为菜单状态
				ChangeMode(MenuMode);

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

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

				// 设置当前菜单项
				NowItem = 0;

				// 激活Run菜单
				mnuCool[NowMenu].ActiveMenu();

				break;

			case KeyAltD:
				// 输入为Alt + D
				// 打开Debug菜单

				// 改变系统为菜单状态
				ChangeMode(MenuMode);

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

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

				// 设置当前菜单项
				NowItem = 0;

				// 激活Run菜单
				mnuCool[NowMenu].ActiveMenu();

				break;
			case KeyAltH:
				// 输入为Alt + H
				// 打开Help菜单

				// 改变系统为菜单状态
				ChangeMode(MenuMode);

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

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

				// 设置当前菜单项
				NowItem = 0;

				// 激活Help菜单
				mnuCool[NowMenu].ActiveMenu();

				break;
			case KeyCtrlEnter:
				// 输入为Ctrl + Enter
				// 给光标当前行添加或删除标记

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

				// 设置当前菜单项为Mark
				NowItem = ItemMark;

				return;
			case KeyCtrlF8:
				// 输入为Ctrl + F8
				// 给光标当前行添加或删除断点

				// 设置当前菜单为Debug
				NowMenu = MenuDebug;

				// 设置当前菜单项为Break
				NowItem = ItemBreak;

				return;
			case KeyCtrlLeftBracket:
				// 输入为Ctrl + [
				// 将光标移动到前一个标记行处

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

				// 设置当前菜单项为Previous
				NowItem = ItemPrevious;

				return;
			case KeyCtrlRightBracket:
				// 输入为Ctrl + ]
				// 将光标移动到下一个标记行处

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

				// 设置当前菜单项为Following
				NowItem = ItemFollowing;

				return;
			case KeyRight:
				// 输入为右键
				// 光标右移一位

				PressRight();

				break;
			case KeyLeft:
				// 输入为左键
				// 光标左移一位

				PressLeft();

				break;
			case KeyDown:
				// 输入为下键
				// 光标下移一行

				PressDown();

				break;
			case KeyUp:
				// 输入为上键
				// 光标上移一行

				PressUp();

				break;
			case KeyPageUp:
				// 输入为PageUp
				// 向上翻一屏

				PressPageUp();

				break;
			case KeyPageDown:
				// 输入为PageDown
				// 向下翻一屏

				PressPageDown();

				break;
			case KeyCtrlPageUp:
				// 输入为Ctrl + PageUp
				// 到程序开头

				PressCtrlPageUp();

				break;
			case KeyCtrlPageDown:
				// 输入为Ctrl + PageDown
				// 到程序末尾

				PressCtrlPageDown();

				break;
			case KeyCtrlL:
				// 输入为Ctrl + L
				// 搜索下一个目标字符串

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

				// 设置当前菜单项为SearchAgain
				NowItem = ItemSearchAgain;

				return;
			case KeyDel:
				// 输入为Delete
				// 删除光标当前字符

				PressDel();

				break;
			case KeyBackSpace:
				// 输入为BackSpace
				// 删除光标前一位置字符

				PressBackSpace();

				break;
			case KeyCtrlY:
				// 输入为Ctrl + Y
				// 删除光标当前行

				PressCtrlY();

				break;
			case KeyTab:
				// 输入为Tab
				// 将光标移动到下一个Tab区

				PressTab();

				break;
			case KeyEnter:
				// 输入为Enter
				// 移动光标至下一行开头

				PressEnter();

				break;
			case KeyHome:
				// 输入为Home
				// 移动光标到行首

				// 设置文本Y坐标
				TextY = 0;

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

				// 输出位置
				ShowPosition();

				break;
			case KeyEnd:
				// 输入为End
				// 移动光标到行末

				// 设置文本Y坐标
				TextY = LengthOf(TextX);

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

				// 输出位置
				ShowPosition();

				break;
			default:
				// 输入的是文本字符
				PressText(Key);
			}
		}
		gotoxy(NowY, NowX);
	} while (Key != KeyAltX);

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

	// 设置当前菜单项为Quit
	NowItem = ItemQuit;
}

void PressMenuLetterKey(const int Key, int &NowMenu)
{
	// 处理菜单快捷字母的输入

	switch (toupper((char)Key))
	{
	case 'A':
		if (MenuOn)
		{
			// 菜单已经打开

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

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

				// 解释执行SaveAs菜单项
				Explain(NowMenu, ItemSaveAs);

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

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

				// 解释执行StandardLine菜单项
				Explain(NowMenu, ItemStandLine);

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

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

				// 解释执行AboutCBasic菜单项
				Explain(NowMenu, ItemAboutCBasic);

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

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

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

				// 解释执行Break菜单项
				Explain(NowMenu, ItemBreak);

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

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

				// 解释执行AboutMe菜单项
				Explain(NowMenu, ItemAboutMe);

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

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

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

				// 解释执行ClearAllMark菜单项
				Explain(NowMenu, ItemClearMark);

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

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

				// 解释执行ClearAllBreak菜单项
				Explain(NowMenu, ItemClearBreak);

				break;
			}
		}
		break;
	case 'D':
		if (!MenuOn)
		{
			// 菜单未打开

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

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

			// 设置当前菜单为Debug
			NowMenu = MenuDebug;

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

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

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

				// 解释执行StepOver菜单项
				Explain(NowMenu, ItemStepOver);

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

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

				// 解释执行HelpSyntax菜单项
				Explain(NowMenu, ItemHelpSyntax);

				break;

⌨️ 快捷键说明

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