#include<bits/stdc++.h>
#include "conio.h" //如果用工程,把此处.c改成.h
#include <stdio.h>
#define EnterKey 0x0d
#define UpCursor 38
#define LeftCursor 37
#define RightCursor 39
#define DownCursor 40
#define AltXKey 18
#define EscKey 27
#define SelectAttr 0x20 //选中的属性
#define NoSelectAttr 0x70 //未选中的属性
#define SystemBorder 0x17 //未选中的属性
#define BorderColor 0x30 //未选中的属性
#define MainMenuLine 1 //主菜单显示的开始行
#define MainMenuCount 8 //主菜单项的数目
#define MaxWindowWidth 80 //屏幕宽度
typedef signed short int ShortInt;
#define ll long long
using namespace std;
void asolve();
void ShowALineOfBox(ll x1,ll y1,ll width,string str,ll col1,ll col2);
void push1(KeyValueStru key);
void push2(KeyValueStru key);
void move();
void showbox(ll x1,ll y1,ll x2,ll y2,string str,ll col1,ll col2);
void coverzhumenu1(ll op,bool flag);//1代表覆盖原值,0代表覆盖当前值
void ShowMenu(ll Layer,ll num,ll alex);//层数,第几个位置 ,如果是要打印二级子菜单,是在第alex层打开的二级子菜单,否则alex不用
void cover_kuai(ll op);
void cover_small_kuai(ll num/*第几个,用于确定横坐标*/,ll op/*第几层,用于确定高*/,bool flag);
void ShowALineOfBox(ll x1,ll y1,ll width,string str,ll col1,ll col2)
{//写行
gotoxy(x1,y1);
textattr(col1);cout<<str[0];
textattr(col2);for(int i=1;i<width;++i) cout<<str[1];
textattr(col1);cout<<str[2]<<endl;
}
const int d1=25,d2=80;
enum KEY{
ENTER=13,ESC=27,LEFT=37,UP=38,RIGHT=39,DOWN=40
};
int posx=1;
int posy=1;
KeyValueStru key;
void push1(KeyValueStru key)//上下移动
{
ll k=(key.VKey==0x28?1:-1);
posy=(posy+k+d1)%d1;gotoxy(posx,posy);
return;
}
void push2(KeyValueStru key)//左右
{
ll k=(key.VKey==0x27?1:-1);
posx=(posx-k+d2)%d2;
gotoxy(posx,posy);
return;
}
void move(){//移动光标
while(key.VKey!=0x1b){
key=kbhit();
push1(key);
push2(key);
}
}
void showbox(ll x1,ll y1,ll x2,ll y2,string str,ll col1,ll col2)
{//写块
ll width=abs(x2-x1+1);//宽度
string ss="";ss+=str[0];ss+=str[1];ss+=str[2];
ShowALineOfBox(x1,y1,width,ss,col1,col1);
ss="";ss+=str[3];ss+=str[4];ss+=str[5];
ll num=abs(y1-y2);//长度
for(int i=1;i<num;++i)
ShowALineOfBox(x1,y1+i,width,ss,col1,col2);
ss="";ss+=str[6];ss+=str[7];ss+=str[8];
ShowALineOfBox(x1,y2,width,ss,col1,col1);
}
typedef struct MenuItemStru{
ShortInt SubMenuItemCount; //子菜单的数目
ShortInt SubMenuItemWidth; //子菜单的宽度
MenuItemStru * SubMenuItemAddr; //子菜单数据结构地址
ShortInt MenuItemStrWidth; //主菜单项字符串长度
char * MenuItemStrAddr; //主菜单项的字符串地址
};
typedef struct MenuSelectStru{
ShortInt MenuIndex,MenuItemTotal; //选择菜单中的哪项
MenuItemStru * pMenu; //对应主菜单/子菜单的数据结构地址
PCHAR_INFO AddrOfSaveText; //备份下拉菜单区域的空间
bool PullDownMenu; //下拉菜单有否显示
ShortInt left,top,right,bottom;//备份上一次的位置数据,方便返回处理
};
//char * S_S_Box ="谀砍渤滥";
char * S_S_Box ="谀砍 忱馁";
char * T_S_Box ="履鲁 忱馁";
char * B_S_Box ="谀砍 忱馁";
// File子菜单字符串
char * LoadStr = "Load F3";
char * PickStr = "Pick Alt-F3";
char * NewStr = "New";
char * SaveStr = "Save F2";
char * WriteStr = "Write to";
char * DirStr = "Diretory";
char * ChangeStr = "Change Dir";
char * OsStr = "Os Shell";
char * QuitStr = "Quit Alx-X";
// Run 子菜单字符串
char * RunSubStr = "Run Ctrl-F9";
char * ProgStr = "Program reset Ctrl-F2";
char * GotoStr = "Go To cursor F4";
char * TraceStr = "Trace into F7";
char * StepStr = "Step over F8";
char * UserStr = "User Screen Alt-F5";
// Compile子菜单字符串
char * CompileStr = "Compile to OBJ";
char * MakeStr = "Make EXE file";
char * LinkStr = "Link EXE file";
char * BuildStr = "Build all";
char * PrimaryStr = "Primary C file";
char * GetInfoStr = "Get info";
// project子菜单字符串
char * ProjectStr = "Project name";
char * BreakStr = "Break make on";
char * AutoStr = "Auto dependencies";
char * ClearStr = "Clear project";
char * RemoveStr = "Remove messages";
// Options子菜单字符串
char * CompilerStr = "Compiler";
char * LinkerStr = "Linker";
char * EnvironStr = "Environment";
char * DirectStr = "Directories";
char * ArgumentStr = "Arguments";
// comiler parameter子菜单字符串
char * ModelStr = "Model";
char * DefinesStr = "Defines";
char * CodeStr = "Code generation";
char * OptimStr = "Optimization";
char * SourceStr = "Source";
char * ErrorsStr = "Errors";
char * NamesStr = "Names";
// Link子菜单字符串
char * MapStr = "Map file";
char * InitialStr = "Initialize segments";
char * DefaultStr = "Default library";
char * WarnStr = "Warn duplicate symbols";
char * StackStr = "Stack warning";
char * CaseStr = "Case-sensitive link";
// Environment子菜单字符串
char * MessageStr ="Message Tracking";
char * KeepStr ="Keep messages";
char * ConfigStr ="Config auto save";
char * EditAutoStr="Edit auto save";
char * BackupStr ="Backup files";
char * TabSizeStr ="Tab Size";
char * ZoomedStr ="Zoomed windows";
char * ScreenStr ="Screen size";
// Directory子菜单字符串
char * IncludeStr ="Include directories";
char * LibraryStr ="Library directories";
char * OutputStr ="Output directories";
char * TurboCStr ="Turbo C directory";
char * PickFStr ="Pick file name";
char * CurrentPStr="Current pick file";
// Argument子菜单字符串
char * SaveOptStr="Save options";
char * RetriStr ="Retrieve options";
// Debug子菜单字符串
char * EvaluteStr="Evalute Ctrl-F4";
char * CallStkStr="Call stack Ctrl-F3";
char * FindFunStr="Find function";
char * RefreshStr="Refresh display";
char * DisplayStr="Display swapping";
char * SourceDStr="Source debugging";
// Break/Watch子菜单字符串
char * AddWatStr ="Add watch Ctrl-F7";
char * DeleteStr ="Delete watch";
char * EditWatStr="Edit watch" ;
char * RemAllStr ="Remove all watches";
char * ToggleStr ="Toggle breakpoint Ctrl-F8";
char * ClrAllStr ="Clear all breakpoints";
char * ViewStr ="View next breakpoint";
//
// File子菜单结构 //
//
MenuItemStru FileSubM[9] ={{0,0,0,PickStr-LoadStr-1,LoadStr},
{0,0,0,NewStr-PickStr-1,PickStr},
{0,0,0,SaveStr-NewStr-1,NewStr},
{0,0,0,WriteStr-SaveStr-1,SaveStr},
{0,0,0,DirStr-WriteStr-1,WriteStr},
{0,0,0,ChangeStr-DirStr-1,DirStr},
{0,0,0,OsStr-ChangeStr-1,ChangeStr},
{0,0,0,QuitStr-OsStr-1,OsStr},
{0,0,0,RunSubStr-QuitStr-1,QuitStr}};
//
// Run 子菜单结构 //
//
MenuItemStru RunSubM[6] ={{0,0,0,ProgStr-RunSubStr-1,RunSubStr},
{0,0,0,GotoStr-ProgStr-1,ProgStr},
{0,0,0,TraceStr-GotoStr-1,GotoStr},
{0,0,0,StepStr-TraceStr-1,TraceStr},
{0,0,0,UserStr-StepStr-1,StepStr},
{0,0,0,CompileStr-UserStr-1,UserStr}};
//
// Compile子菜单数据结构定义 //
//
MenuItemStru CompSubM[6]={{0,0,0,MakeStr-CompileStr-1,CompileStr},
{0,0,0,LinkStr-MakeStr-1,MakeStr},
{0,0,0,BuildStr-LinkStr-1,LinkStr},
{0,0,0,PrimaryStr-BuildStr-1,BuildStr},
{0,0,0,GetInfoStr-PrimaryStr-1,PrimaryStr},
{0,0,0,ProjectStr-GetInfoStr-1,GetInfoStr}};
//
// project子菜单数据结构定义 //
//
MenuItemStru ProjSubM[5]={{0,0,0,BreakStr-ProjectStr-1,ProjectStr},
{0,0,0,AutoStr-BreakStr-1,BreakStr},
{0,0,0,ClearStr-AutoStr-1,AutoStr},
{0,0,0,RemoveStr-ClearStr-1,ClearStr},
{0,0,0,CompilerStr-RemoveStr-1,RemoveStr}};
///
// Options子菜单数据结构定义 //
//该菜单项包含:comiler parameter //
// Link //
// Environment //
// Directory //
// Argument //
///
// comiler parameter子菜单数据结构定义 //
MenuItemStru CompPSubM[7]={{0,0,0,DefinesStr-ModelStr-1,ModelStr},
{0,0,0,CodeStr-DefinesStr-1,DefinesStr},
{0,0,0,OptimStr-CodeStr-1,CodeStr},
{0,0,0,SourceStr-OptimStr-1,OptimStr},
{0,0,0,ErrorsStr-SourceStr-1,SourceStr},
{0,0,0,NamesStr-ErrorsStr-1,ErrorsStr},
{0,0,0,MapStr-NamesStr-1,NamesStr}};
// Link子菜单数据结构定义 //
MenuItemStru LinkerSubM[6] ={{0,0,0,InitialStr-MapStr-1,MapStr},
{0,0,0,DefaultStr-InitialStr-1,InitialStr},
{0,0,0,WarnStr-DefaultStr-1,DefaultStr},
{0,0,0,StackStr-WarnStr-1,WarnStr},
{0,0,0,CaseStr-StackStr-1,StackStr},
{0,0,0,MessageStr-CaseStr-1,CaseStr}};
// Environment子菜单数据结构定义 //
MenuItemStru EnvironSubM[8] ={{0,0,0,KeepStr-MessageStr-1,MessageStr},
{0,0,0,ConfigStr-KeepStr-1,KeepStr},
{0,0,0,EditAutoStr-ConfigStr-1,ConfigStr},
{0,0,0,BackupStr-EditAutoStr-1,EditAutoStr},
{0,0,0,TabSizeStr-BackupStr-1,BackupStr},
{0,0,0,ZoomedStr-TabSizeStr-1,TabSizeStr},
{0,0,0,ScreenStr-ZoomedStr-1,ZoomedStr},
{0,0,0,ScreenStr-ScreenStr-1,ScreenStr}};
// Directory子菜单数据结构定义 //
MenuItemStru DirectSubM[6] ={{0,0,0,LibraryStr-IncludeStr-1,IncludeStr},
{0,0,0,OutputStr-LibraryStr-1,LibraryStr},
{0,0,0,TurboCStr-OutputStr-1,OutputStr},
{0,0,0,PickFStr-TurboCStr-1,TurboCStr},
{0,0,0,CurrentPStr-PickFStr-1,PickFStr},
{0,0,0,SaveOptStr-CurrentPStr-1,CurrentPStr}};
// Argument 子菜单数据结构定义 //
MenuItemStru ArgumentSubM[2] ={{0,0,0,RetriStr-SaveOptStr-1,SaveOptStr},
{0,0,0,EvaluteStr-RetriStr-1,RetriStr}};
//
// Option子菜单数据结构定义 //
//
MenuItemStru OptSubM[5]={{7,OptimStr-CodeStr-1,CompPSubM,LinkerStr-CompilerStr-1,CompilerStr},
{5,StackStr-WarnStr-1,LinkerSubM,EnvironStr-LinkerStr-1,LinkerStr},
{5,EditAutoStr-ConfigStr-1,EnvironSubM,DirectStr-EnvironStr-1,EnvironStr},
{5,OutputStr-LibraryStr-1,DirectSubM,ArgumentStr-DirectStr-1,DirectStr},
{2,EvaluteStr-RetriStr-1,ArgumentSubM,ModelStr-ArgumentStr-1,ArgumentStr}};
//
// Debug 子菜单数据结构定义 //
//
MenuItemStru DebSubM[6]={{0,0,0,CallStkStr-EvaluteStr-1,EvaluteStr},
{0,0,0,FindFunStr-CallStkStr-1,CallStkStr},
{0,0,0,RefreshStr-FindFunStr-1,FindFunStr},
{0,0,0,DisplayStr-RefreshStr-1,RefreshStr},
{0,0,0,SourceDStr-DisplayStr-1,DisplayStr},
{0,0,0,AddWatStr-SourceDStr-1,SourceDStr}};
//
// Break/Watch子菜单数据结构定义 //
//
MenuItemStru WatSubM[7] ={{0,0,0,DeleteStr-AddWatStr-1,AddWatStr},
{0,0,0,EditWatStr-DeleteStr-1,DeleteStr},
{0,0,0,RemAllStr-EditWatStr-1,EditWatStr},
{0,0,0,ToggleStr-RemAllStr-1,RemAllStr},
{0,0,0,ClrAllStr-ToggleStr-1,ToggleStr},
{0,0,0,ViewStr-ClrAllStr-1,ClrAllStr},
{0,0,0,20,ViewStr}};//
//
// 主菜单数据结构定义 //
//
char * FileStr="File";
char * EditStr="Edit";
char * RunStr ="Run";
char * CompStr="Compile";
char * ProjStr="Project";
char * OptStr ="Options";
char * DebStr ="Debug";
char * WatStr ="Break/Watch";
string mas[13]={"File","Edit","Run","Compile","Project","Options","Debug","Break/Watch"};
char * MyMenu[MainMenuCount]={FileStr,EditStr,RunStr,CompStr,ProjStr,OptStr,DebStr,WatStr};
MenuItemStru MainMenu[MainMenuCount]={{0x09,NewStr-PickStr-1,FileSubM,EditStr-FileStr-1,FileStr},
{0x0 ,00, 0,RunStr-EditStr-1,EditStr},
{0x06,GotoStr-ProgStr-1,RunSubM ,CompStr-RunStr-1,RunStr},
{0x06,GetInfoStr-PrimaryStr-1,CompSubM,ProjStr-CompStr-1,CompStr},
{0x05,ClearStr-AutoStr-1,ProjSubM,OptStr-ProjStr-1,ProjStr},
{0x07,ClrAllStr-ToggleStr-1,WatSubM,11,WatStr},
{0x06,FindFunStr-CallStkStr-1,DebSubM ,WatStr-DebStr-1,DebStr},
{0x05,ArgumentStr-DirectStr-1,OptSubM ,DebStr-OptStr-1,OptStr},
};
MenuItemStru RootMenu={8,0,MainMenu,4,"Root"};//增加的根结点
int MainMenuItemCol[MainMenuCount]={0x03,0x0b,0x13,0x19,0x25,0x30,0x3f,0x48}; //主菜单待显示的列位置
//选择历史缓冲区
CHAR_INFO ThirdSave[1000],SecondSave[1000],FirstSave[1000];
MenuSelectStru His[]={{0,8,MainMenu,0,false,0,0,0,0},
{0,9, FileSubM,FirstSave,false,2,2,14,12},
{0,0,0,SecondSave,false,0,0,0,0},
{0,6,RunSubM,ThirdSave,false,19,2,39,9}};
int Layer=1; //当前菜单操作的层
ShortInt SelectLayer=0;
KeyValueStru CurrentKey;
MenuItemStru *mianmanu[]={FileSubM,RunSubM,CompSubM,ProjSubM,OptSubM,DebSubM,WatSubM};
void ShowMenu(ll Layer,ll num,ll alex)//层数,第几个位置 ,如果是要打印二级子菜单,是在第alex层打开的二级子菜单,否则alex不用
{
int i,CurColor=SelectAttr;
ll dangqiantop=His[Layer].top;
if(!Layer){
for(int i=0;i<8;++i){
gotoxy(MainMenuItemCol[i],1);
textattr(CurColor);CurColor=NoSelectAttr;
printf("%s",His[Layer].pMenu[i].MenuItemStrAddr);
}
return;
}
if(Layer==1){
showbox(MainMenuItemCol[num]-1,2/*左上角高度*/,MainMenuItemCol[num]+MainMenu[num].SubMenuItemWidth-1,2+MainMenu[num].SubMenuItemCount+1,"---| |---",0x18,0x77);dangqiantop++;
for (i=0;i<MainMenu[num].SubMenuItemCount;i++){
gotoxy(MainMenuItemCol[num],dangqiantop++);textattr(CurColor);CurColor=NoSelectAttr;
printf("%s",MainMenu[num].SubMenuItemAddr[i].MenuItemStrAddr);
}
return;
}
if(Layer==2){ll pretop=4+alex;//高度
showbox(MainMenuItemCol[num]-1,pretop,MainMenuItemCol[num]-1+MainMenu[num].SubMenuItemAddr[alex].SubMenuItemWidth,pretop+MainMenu[num].SubMenuItemAddr[alex].SubMenuItemCount+1,"---| |---",0x18,0x77);
pretop++;
for(i=0;i<MainMenu[num].SubMenuItemAddr[alex].SubMenuItemCount;++i){
gotoxy(MainMenuItemCol[num],pretop++);
textattr(CurColor);CurColor=NoSelectAttr;
printf("%s",MainMenu[num].SubMenuItemAddr[alex].SubMenuItemAddr[i].MenuItemStrAddr);
}
}
}
void coverzhumenu1(ll op,bool flag)//1代表覆盖原值,0代表覆盖当前值
{
ll kj=0x25;if(flag) kj=NoSelectAttr;
showbox(MainMenuItemCol[op],1,MainMenuItemCol[op]+MainMenu[op].MenuItemStrWidth,1," ",kj,kj);
gotoxy(MainMenuItemCol[op],1);
printf("%s",His[0].pMenu[op].MenuItemStrAddr);
}
void cover_kuai(ll op){//一级小菜单的撤销
showbox(MainMenuItemCol[op]-1,3/*左上角高度*/,MainMenuItemCol[op]+MainMenu[op].SubMenuItemWidth-1,2+MainMenu[op].SubMenuItemCount+1," ",0x35,0x35);
return;
}
void cover_small_kuai(ll Layer,ll op/*第几层,用于确定高*/,bool flag)
{//一级小菜单的移动颜色变化
ll kj=0x25;if(flag) kj=NoSelectAttr;
showbox(MainMenuItemCol[Layer],3+op,MainMenuItemCol[Layer]+MainMenu[Layer].SubMenuItemWidth-2,3+op," ",kj,kj);
gotoxy(MainMenuItemCol[Layer],3+op);
printf("%s",MainMenu[Layer].SubMenuItemAddr[op].MenuItemStrAddr);
}
void cover_second(ll Layer/*确定是哪一个一级子菜单对应的二级子菜单*/,ll op/*一级子菜单中的哪一项*/,ll alex/*一级子菜单打印的二级子菜单的哪一项*/,bool flag){//二级小菜单的移动颜色变化
ll kj=0x25;if(flag) kj=NoSelectAttr;
showbox(MainMenuItemCol[Layer],5+op+alex,MainMenuItemCol[Layer]+MainMenu[Layer].SubMenuItemAddr[op].SubMenuItemWidth-2,5+op+alex," ",kj,kj);
gotoxy(MainMenuItemCol[Layer],5+op+alex);
printf("%s",MainMenu[Layer].SubMenuItemAddr[op].SubMenuItemAddr[alex].MenuItemStrAddr);
}
void cover_second_kuai(ll Layer,ll alex){
showbox(MainMenuItemCol[Layer]-1,4+alex,MainMenuItemCol[Layer]-1+MainMenu[Layer].SubMenuItemAddr[alex].SubMenuItemWidth,4+alex+MainMenu[Layer].SubMenuItemAddr[alex].SubMenuItemCount+1," ",0x35,0x35);
return;
}
ll op=0,opp=0,dir1=0,dir2=0,ds1=0,ds2=0,cengshu,canshu;
void change_key_left_right(KeyValueStru key)//一级左右
{
ll k=(key.VKey==RIGHT?1:-1);
op=opp;opp=(opp+k+8)%8;
coverzhumenu1(op,1);
coverzhumenu1(opp,0);
return;
}
void change_key_updown(KeyValueStru key)//一级上下
{
ll k=(key.VKey==DOWN?1:-1);
dir2=dir1;
dir1=(dir1+k+cengshu)%cengshu;//现在位置的更新
cover_small_kuai(opp,dir2,1);cover_small_kuai(opp,dir1,0);
}
void change_small_key_updown(KeyValueStru key)//二级上下
{
ll k=(key.VKey==DOWN?1:-1);
ds2=ds1;
ds1=(ds1+k+canshu)%canshu;
cover_second(opp,dir1,ds2,1);cover_second(opp,dir1,ds1,0);
}
void key_sec()
{
cover_second_kuai(opp,dir1);
ShowMenu(1,7,0);
cover_small_kuai(opp,0,1);cover_small_kuai(opp,dir1,0);
}
void key_enter()
{
ShowMenu(2,opp,dir1);
ds1=0,ds2=0;//(二级小菜单的位置)
canshu=MainMenu[opp].SubMenuItemAddr[dir1].SubMenuItemCount;
bool flag=0;
//gettext(MainMenuItemCol[7]-1,2/*左上角高度*/,MainMenuItemCol[7]+MainMenu[7].SubMenuItemWidth-1,2+MainMenu[7].SubMenuItemCount+1,His[7].AddrOfSaveText);
while(1){
key=kbhit();
if(key.VKey==ESC){key_sec();break;}
if(key.VKey==ENTER){gotoxy(1,25);textattr(RED);printf("illgel!!!");continue;}
else if(key.VKey==UP||key.VKey==DOWN){change_small_key_updown(key);continue;}
}
//puttext(MainMenuItemCol[7]-1,2/*左上角高度*/,MainMenuItemCol[7]+MainMenu[7].SubMenuItemWidth-1,2+MainMenu[7].SubMenuItemCount+1,His[7].AddrOfSaveText);
}
void change_gaoji_leftright(KeyValueStru key)
{ll kk=(key.VKey==RIGHT?1:-1);
cover_kuai(opp);
op=opp;opp=(opp+kk+8)%8;
ShowMenu(1,opp,0);
coverzhumenu1(op,1);coverzhumenu1(opp,0);
dir1=0,dir2=0;cengshu=MainMenu[opp].SubMenuItemCount;
}
void asolve()
{ShowMenu(0,0,0);
while(1){
key=kbhit();
if(key.VKey==ENTER)
{ if(opp==1) continue;
ShowMenu(1,opp,0);dir1=0,dir2=0;//当前和上一次;(一级小菜单的位置)
cengshu=MainMenu[opp].SubMenuItemCount;
while(1){
key=kbhit();
if(key.VKey==ENTER){
if(opp!=7){gotoxy(1,25);textattr(RED);printf("illgel!!!");continue;}
key_enter();
continue;
}
if(key.VKey==ESC){cover_kuai(opp);break;}
if(key.VKey==UP||key.VKey==DOWN){change_key_updown(key);continue;}
if(key.VKey==LEFT||key.VKey==RIGHT) change_gaoji_leftright(key);
}
}
if(key.VKey==LEFT||key.VKey==RIGHT){change_key_left_right(key);continue;}
//if(key.VKey==ESC) {gotoxy(100,25);exit(0);}
}
}
int main()
{
showbox(1,1,100,1," ",0x95,0x35);showbox(1,2,100,25,"---| |---",0x18,0x39);
asolve();
return 0;
}
程序设计实训
于 2022-03-20 22:18:37 首次发布