版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
include"College.h"intmain()|COORDsize={SCR_COL,SCR_ROW}; /?窗口緩沖區(qū)大小?/gh_std_out=GetStdHandle(STD_OUTPUT_HANDLE);/*獲取標(biāo)準(zhǔn)輸出設(shè)備句柄?/gh_std_in=GetStdHandle(STD_INPUT_HANDLE);/*獲取標(biāo)準(zhǔn)輸入設(shè)備句柄?/SetConsoleTitle(gp_sys__name); /*設(shè)置窗口標(biāo)題ッSetConsoleScreenBufferSize(gh_std_out/size);/*設(shè)置窗口緩沖區(qū)大小80*25*/LoadData();lnitlnterface();RunSys(&gp_head);CloseSys(gp_head);LoadData();lnitlnterface();RunSys(&gp_head);CloseSys(gp_head);/?界面初始化?//?系統(tǒng)功能模塊的選擇及運(yùn)行?//?退出系統(tǒng)ッreturn0;/**函數(shù)名稱:LoadData函數(shù)功能:將代碼表和三類基礎(chǔ)數(shù)據(jù)從數(shù)據(jù)文件載入到內(nèi)存緩沖區(qū)和十字鏈表中.輸入?yún)?shù):無(wú)輸出參數(shù):無(wú)返回值:BOOL類型,功能函數(shù)中除了函數(shù)ExitSys的返回值可以為FALSEタト,? 其他函數(shù)的返回值必須為TRUE.*調(diào)用說(shuō)明:為了能夠以統(tǒng)ー的方式調(diào)用各功能函數(shù),將這些功能函數(shù)的原型設(shè)為一致,即無(wú)參數(shù)且返回值為BOOL.返回值為FALSE時(shí),結(jié)束程序運(yùn)行./BOOLLoadData(){intRe=0;printf("\n歡迎使用本系統(tǒng)\n\n");Re=CreatList(&gp_head);gc_sys_state|=Re;gc_sys_state&=~(4+8+16-Re);if(gc_sys_state<(1|2|4|8|16)){/?數(shù)據(jù)加載提示信息?/printf("\n系統(tǒng)基礎(chǔ)數(shù)據(jù)不完整!\n");printf("\n按任意鍵繼續(xù)...\n");getch();returnTRUE;/**函數(shù)名稱:CreatList函數(shù)功能:從數(shù)據(jù)文件讀取基礎(chǔ)數(shù)據(jù),并存放到所創(chuàng)建的十字鏈表中.輸入?yún)?shù):無(wú)輸出參數(shù):phead主鏈頭指針的地址,用來(lái)返回所創(chuàng)建的十字鏈.返回值:int型數(shù)值,表示鏈表創(chuàng)建的情況.0空鏈,無(wú)數(shù)據(jù)4已加載宿舍樓信息數(shù)據(jù),無(wú)學(xué)生基本信息和繳費(fèi)信息數(shù)據(jù)12已加載宿舍樓信息和學(xué)生基本信息數(shù)據(jù),無(wú)繳費(fèi)信息數(shù)據(jù)28三類基礎(chǔ)數(shù)據(jù)都已加載*?調(diào)用說(shuō)明:*/intCreatList(COLLEGE_NODE**phead)(COLLEGE_NODE*hd=NULL,*pCollegeNode,tmpl;TEAM_NODE*pTeamNode,tmp2;PROJECT_NODE*pProjectNode,tmp3;FILE*pFile;intfind;intre=0;if((pFile=fopen(gp_college_info_filename,"rb"))==NULL)(printf("院系信息數(shù)據(jù)文件打開(kāi)失敗!\n");returnre;|printf("院系信息數(shù)據(jù)文件打開(kāi)成功!'n");/?從數(shù)據(jù)文件中讀院系信息數(shù)據(jù),存入以后進(jìn)先出方式建立的主鏈中?/while(fread(&tmpl,sizeof(COLLEGE_NODE),1,pFile)==1){pCollegeNode=(COLLEGE_NODE*)malloc(sizeof(COLLEGE_NODE));*pCollegeNode=tmpl;pCollegeNode->tnext=NULL;pCollegeNode->next=hd;hd=pCollegeNode;fclose(pFile);if(hd==NULL)printf("院系信息數(shù)據(jù)文件加載失敗!ヽn“);returnre;)printf("院系信息數(shù)據(jù)文件加載成功!、バ);*phead=hd;re+=4;if((pFile=fopen(gp_team_info_filename,"rb"))==NULL){printf("科研團(tuán)隊(duì)基本信息數(shù)據(jù)文件打開(kāi)失敗!\n");returnre;)printf("科研團(tuán)隊(duì)信息數(shù)據(jù)文件打開(kāi)成功!'n");re+=8;/?從數(shù)據(jù)文件中讀取科研團(tuán)隊(duì)基本信息數(shù)據(jù),存入主鏈對(duì)應(yīng)結(jié)點(diǎn)的科研團(tuán)隊(duì)基本信息支鏈中*/while(fread(&tmp2,sizeof(TEAMNODE),1,pFile)==1){/?創(chuàng)建結(jié)點(diǎn),存放從數(shù)據(jù)文件中讀出的科研團(tuán)隊(duì)基本信息?/pTeamNode=(TEAM_NODE*)malloc(sizeof(TEAM_NODE));*pTeamNode=tmp2;pTeamNode->pnext=NULL;/?在主鏈上查找該科研團(tuán)隊(duì)所在院系對(duì)應(yīng)的主鏈結(jié)點(diǎn)?/pCollegeNode=hd;while(pCollegeNode!=NULL&&strcmp(pCollegeNode?>college_id,pTeamNode->college_id)!=0){pCollegeNode=pCollegeNode->next;}if(pCollegeNode!=NULL)/?如果找到,則將結(jié)點(diǎn)以后進(jìn)先出方式插入科研團(tuán)隊(duì)信息支鏈?/(pTeamNode->next=pCollegeNode->tnext;pCollegeNode->tnext=pTeamNode;}else/?如果未找到,則釋放所創(chuàng)建結(jié)點(diǎn)的內(nèi)存空間?/free(pTeamNode);|fclose(pFile);if((pFile=fopen(gp_pro_info_filename,"rb"))==NULL)(printf(“科研項(xiàng)目信息數(shù)據(jù)文件打開(kāi)失敗!、べ);returnre;)printf("科研項(xiàng)目信息數(shù)據(jù)文件打開(kāi)成功!、べ);re+=16;/?從數(shù)據(jù)文件中讀取科研項(xiàng)目信息數(shù)據(jù),存入科研團(tuán)隊(duì)基本信息支鏈對(duì)應(yīng)結(jié)點(diǎn)的科研項(xiàng)目支鏈中?/while(fread(&tmp3,sizeof(PROJECT_NODE),1,pFile)==1){/?創(chuàng)建結(jié)點(diǎn),存放從數(shù)據(jù)文件中讀出的科研項(xiàng)目信息?/pProjectNode=(PROJECT_NODE*)malloc(sizeof(PROJECT_NODE));*pProjectNode=tmp3;/*査找科研團(tuán)隊(duì)信息支鏈上對(duì)應(yīng)科研項(xiàng)目信息結(jié)點(diǎn)?/pCollegeNode=hd;find=0;while(pCollegeNode!=NULL&&find==0){pTeamNode=pCollegeNode->tnext;while(pTeamNode!=NULL&&find==0){if(strcmp(pTeamNode->team_id,pProjectNode->team_id)==0)(find=1;break;}pTeamNode=pTeamNode->next;)pCollegeNode=pCollegeNode->next;)if(find)/?如果找到,則將結(jié)點(diǎn)以后進(jìn)先出方式插入項(xiàng)目信息支鏈中?/(pProjectNode->next=pTeamNode->pnext;pTeamNode->pnext=pProjectNode;}else/?如果未找到,則釋放所創(chuàng)建結(jié)點(diǎn)的內(nèi)存空間?/free(pProjectNode);)fclose(pFile);returnre;/**函數(shù)名稱:Initlnterface函數(shù)功能:初始化界面.輸入?yún)?shù):無(wú)輸出參數(shù):無(wú)返回值:無(wú)*?調(diào)用說(shuō)明:*/voidlnitlnterface()(WORDatt=FOREGROUND_RED|FOREGROUND_GREEN|FOREGROUNDJNTENSITYIBACKGROUND_BLUE|BACKGROUNDJNTENSITY;/?黃色前景和藍(lán)色背景*/SetConsoleTextAttribute(gh_std_outzatt);/*設(shè)置控制臺(tái)屏幕緩沖區(qū)字符屬性?/ClearScreen();/?清屏?//?創(chuàng)建彈出窗口信息堆棧,將初始化后的屏幕窗口當(dāng)作第一層彈出窗口?/gp_scr_att=(char*)calloc(SCR_COL*SCR_ROWZsizeof(char));/?屏幕字符屬性?/gp_top_layer=(LAYER_NODE*)malloc(sizeof(LAYER_NODE));gP_topJayer->LayerNo=0; /?彈出窗口的層號(hào)為0*/gP_topJayer->rcArea.Left=0;/?彈出窗口的區(qū)域?yàn)檎麄€(gè)屏幕窗口ツgp_top_layer->rcArea.Top=0;gp_topJayer->rcArea.Right=SCR_COL-1;gP_top_layer->rcArea.Bottom=SCR_ROW-1;gp_top_layer->pContent=NULL;gp_top_layer->pScrAtt=gp_scr_att;gp_top_layer->next=NULL;ShowMenu(); /*顯示菜單欄ッ函數(shù)名稱:ClearScreen函數(shù)功能:清除屏幕信息.輸入?yún)?shù):無(wú)輸出參數(shù):無(wú)返回值:無(wú)*調(diào)用說(shuō)明:/voidClearScreen(void)(CONSOLE_SCREEN_BUFFER_INFOblnfo;COORDhome={0,0};unsignedlongsize;GetConsoleScreenBufferlnfo(gh_std_out,&blnfo);/?取屏幕緩沖區(qū)信息?/size=blnfo.dwSize.X*blnfo.dwSize.Y;/?計(jì)算屏幕緩沖區(qū)字符單元數(shù)?//?將屏幕緩沖區(qū)所有單元的字符屬性設(shè)置為當(dāng)前屏幕緩沖區(qū)字符屬性?/FillConsoleOutputAttribute(gh_std__out,blnfo.wAttributes,size,home,&buffer);/?將屏幕緩沖區(qū)所有單元填充為空格字符?/FillConsoleOutputCharacter(gh_std_out,1size,home,&buffer);return;/**函數(shù)名稱:ShowMenu函數(shù)功能:在屏幕上顯示主菜單,并設(shè)置熱區(qū),在主菜單第一項(xiàng)上置選中標(biāo)記.輸入?yún)?shù):無(wú)輸出參數(shù):無(wú)返回值:無(wú)*調(diào)用說(shuō)明:/voidShowMenu()(CONSOLE_SCREEN_BUFFER_INFOblnfo;CONSOLE_CURSORJNFOIpCur;COORDsize;COORDpos={0,0};inti,j;intPosA=2,PosB;charch;GetConsoleScreenBufferlnfo(gh_std_outz&blnfo);size.X=blnfo.dwSize.X;size.Y=1;SetConsoleCursorPosition(gh_std_outzpos);for(i=0;i<5;i++)/?在窗口第一行第一列處輸出主菜單項(xiàng)ッ{printf(n%s",ga_main_menu[i]);}GetConsoleCursorlnfo(gh_std__outz&lpCur);IpCur.bVisible=FALSE;SetConsoleCursorlnfo(gh__std__outz&lpCur);/?隱藏光標(biāo)?//?申請(qǐng)動(dòng)態(tài)存儲(chǔ)區(qū)作為存放菜單條屏幕區(qū)字符信息的緩沖區(qū)?/gp_buff__menubarjnfo=(CHARJNFO*)malloc(size.X*size.Y*sizeof(CHARJNFO));SMALL__RECTrcMenu={0z0zsize.X-lz0};/?將窗口第一行的內(nèi)容讀入到存放菜單條屏幕區(qū)字符信息的緩沖區(qū)中?/ReadConsoleOutput(gh_std_outzgp_buff_menubar_infozsize,posz&rcMenu);/?將這一行中英文字母置為紅色,其他字符單元置為白底黑字?/for(i=0;i<size.X;i++)((gp_buff_menubar_info+i)->Attributes=BACKGROUND_BLUE|BACKGROUND_GREENIBACKGROUND_RED;ch=(char)((gpbuff_menubar_info+i)->Char.AsciiChar);if((ch>='A'&&ch<='Z')11(ch>='a'&&ch<=T)){(gp_buff_menubar_info+i)->Attributes|=FOREGROUND_RED;}}/?修改后的菜單條字符信息回寫到窗口的第一行?/WriteConsoleOutput(gh_std__outzgp_buff_menubar_infozsize,pos,&rcMenu);COORDendPos={0,1};SetConsoleCursorPosition(gh_std_out,endPos);/*將光標(biāo)位置設(shè)置在第2行第1列?//?將菜單項(xiàng)置為熱區(qū),熱區(qū)編號(hào)為菜單項(xiàng)號(hào),熱區(qū)類型為0(按鈕型)*/i=0;do(PosB=PosA+strlen(ga_main_menu[i]);/*定位第i+!號(hào)菜單項(xiàng)的起止位置?/for(j=PosA;j<PosB;j++){gP_scr_att[j]|=(i+l)?2;/?設(shè)置菜單項(xiàng)所在字符單元的屬性值ッ}PosA=PosB+4;i++;}while(i<5);TagMainMenu(gi_sel_menu);/*在選中主菜單項(xiàng)上做標(biāo)記,gi_sel_menu初值為1*/return;|/**函數(shù)名稱:TagMainMenu函數(shù)功能:在指定主菜單項(xiàng)上置選中標(biāo)志.輸入?yún)?shù):num選中的主菜單項(xiàng)號(hào)輸出參數(shù):無(wú)返回值:無(wú)*調(diào)用說(shuō)明:VvoidTagMainMenu(intnum)(CONSOLE_SCREEN_BUFFER_INFOblnfo;COORDsize;COORDpos={〇,0};intPosA=2,PosB;charch;inti;if(num==0)/*num為。時(shí),將會(huì)去除主菜單項(xiàng)選中標(biāo)記ッ(PosA=0;PosB=0;)else/?否則,定位選中主菜單項(xiàng)的起止位置:PosA為起始位置,PosB為截止位置ッ{for(i=l;i<num;i++){PosA+=strlen(ga_main_menu[i-l])+4;}PosB=PosA+strlen(ga_main_menu[num-l]);GetConsoleScreenBufferlnfo(gh_std_outz&blnfo);size.X=blnfo.dwSize.X;size.Y=1;/?去除選中菜單項(xiàng)前面的菜單項(xiàng)選中標(biāo)記ッfor(i=0;i<PosA;i++)((gp_buff_menubar_info+i)->Attributes=BACKGROUND_BLUE|BACKGROUND_GREENIBACKGROUND_RED;ch=(gp__buff_menubar__info+i)->Char.AsciiChar;if((ch>=4&&ch<=2')11(ch>='a"&&ch<=T)){(gp_buff_menubar_info+i)->Attributes|=FOREGROUND_RED;/?在選中菜單項(xiàng)上做標(biāo)記,黑底白字?/for(i=PosA;i<PosB;i++)((gp_buff_menubar_info+i)->Attributes=FOREGROUND_BLUE|FOREGROUND_GREENIFOREGROUND_RED;)/?去除選中菜單項(xiàng)后面的菜單項(xiàng)選中標(biāo)記?/for(i=PosB;i<blnfo.dwSize.X;i++){(gp_buff_menubar_info+i)->Attributes=BACKGROUND一BLUEIBACKGROUND_GREENIBACKGROUND_RED;ch=(char)((gp_buff_menubar_info+i)->Char.AsciiChar);if((ch>='A'&&ch<='Z')11(ch>='a'&&ch<='z')){(gp_buff_menubar_info+i)->Attributes|=FOREGROUND_RED;}}/?將做好標(biāo)記的菜單條信息寫到窗口第一行?/SMALL_RECTrcMenu={0,0,size.X-1,0};WriteConsoleOutput(gh_std_out,gp_buff_menubar_info,size,pos,&rcMenu);函數(shù)名稱:CloseSys函數(shù)功能:關(guān)閉系統(tǒng).輸入?yún)?shù):hd主鏈頭指針輸出參數(shù):無(wú)返回值:無(wú)*調(diào)用說(shuō)明:/voidCloseSys()(COLLEGE_NODE*pCollegeNodel=gp_head,*pCollegeNode2;TEAM_NODE*pTeamNodel/*pTeamNode2;PROJECT_NODE*pProjectNodelz*pProjectNode2;while(pCollegeNodel!=NULL)/?釋放十字交叉鏈表的動(dòng)態(tài)存儲(chǔ)區(qū)?/(pCollegeNode2=pCollegeNodel->next;pTeamNodel=pCollegeNodel->tnext;while(pTeamNodel!=NULL)/?釋放科研團(tuán)隊(duì)基本信息支鏈的動(dòng)態(tài)存儲(chǔ)區(qū)?/(pTeamNode2=pTeamNodel->next;pProjectNodel=pTeamNodel->pnext;while(pProjectNodel!=NULL)/?釋放科研項(xiàng)目信息支鏈的動(dòng)態(tài)存儲(chǔ)區(qū)?/{pProjectNode2=pProjectNodel->next;free(pProjectNodel);pProjectNodel=pProjectNode2;)free(pTeamNodel);pTeamNodel=pTeamNode2;}free(pCollegeNodel);/*釋放主鏈結(jié)點(diǎn)的動(dòng)態(tài)存儲(chǔ)區(qū)?/pCollegeNodel=pCollegeNode2;}ClearScreen();/?清屏?//?釋放存放菜單條、狀態(tài)條等信息動(dòng)態(tài)存儲(chǔ)區(qū)?/free(gp_buff_menubar_info);free(gp_buff_stateBarjnfo);/?關(guān)閉標(biāo)準(zhǔn)輸入和輸出設(shè)備句柄?/CloseHandle(gh_std_out);CloseHandle(gh_std_in);/?將窗口標(biāo)題欄置為運(yùn)行結(jié)束?/SetConsoleTitle(“運(yùn)行結(jié)束");return;/**函數(shù)名稱:RunSys函數(shù)功能:運(yùn)行系統(tǒng),在系統(tǒng)主界面下運(yùn)行用戶所選擇的功能模塊.輸入?yún)?shù):無(wú)輸出參數(shù):phead主鏈頭指針的地址返回值:無(wú)*調(diào)用說(shuō)明:/voidRunSys(COLLEGE_NODE**phead)(INPUT_RECORDinRec;DWORDres;COORDpos={〇,0};BOOLbRet=TRUE;inti,loc,num;intcNo,cAtt; /*cNo:字符單元層號(hào),cAtt:字符單元屬性ッcharvkc,asc; /*vkc:虛擬鍵代碼,asc:字符的ASCI!碼值ッwhile(bRet)(/?從控制臺(tái)輸入緩沖區(qū)中讀一條記錄ッReadConsolelnput(gh_std_in,&inRec,1,&res);if(inRec.EventType==MOUSE_EVENT)/?如果記錄由鼠標(biāo)事件產(chǎn)生ッ{pos=inRec.Event.MouseEvent.dwMousePosition;/?獲取鼠標(biāo)坐標(biāo)位置*/cNo=gp_scr_att[pos.Y*SCR_COL+pos.X]&3;/?取該位置的層號(hào)?/cAtt=gp_scr_att[pos.Y*SCR_COL+pos.X]?2;/?取該字符單元屬性?/if(cNo==0)/?層號(hào)為0?表明該位置未被彈出子菜單覆蓋?/{/*cAtt>0表明該位置處于熱區(qū)(主菜單項(xiàng)字符單元)cAtt!=gi_sel_menu表明該位置的主菜單項(xiàng)未被選中g(shù)p_top_layer->LayerNo>0表明當(dāng)前有子菜單彈出*/if(cAtt>0&&cAtt!=gi__sel_menu&&gp_top_layer->LayerNo>0)PopOffO; /?關(guān)閉彈出的子菜單?/gi_sel_sub_menu=0;/?將選中子菜單項(xiàng)的項(xiàng)號(hào)置為0*/PopMenu(cAtt); /?彈出鼠標(biāo)所在主菜單項(xiàng)對(duì)應(yīng)的子菜單?/))elseif(cAtt>0)/?鼠標(biāo)所在位置為彈出子菜單的菜單項(xiàng)字符單元?/(TagSubMenu(cAtt);/?在該子菜單項(xiàng)上做選中標(biāo)記?/if(inRec.Event.MouseEvent.dwButtonState==FROM_LEFT一:1ST一BUTTON一PRESSED)/?如果按下鼠標(biāo)左邊第一ー鍵?/{if(cNo==0)/?層號(hào)為0,表明該位置未被彈出子菜單覆蓋?/(if(cAtt>0)/?如果該位置處于熱區(qū)(主菜單項(xiàng)字符單元)*/(PopMenu(cAtt); /?彈出鼠標(biāo)所在主菜單項(xiàng)對(duì)應(yīng)的子菜單?/}/*如果該位置不屬于主菜單項(xiàng)字符單元,且有子菜單彈出?/elseif(gp_top_layer->LayerNo>0){PopOffO; /?關(guān)閉彈出的子菜單?/gi_sel_sub_menu=0;/?將選中子菜單項(xiàng)的項(xiàng)號(hào)置為0*/}|else/?層號(hào)不為〇,表明該位置被彈出子菜單覆蓋ッ{if(cAtt>0)/?如果該位置處于熱區(qū)(子菜單項(xiàng)字符單元)*/{PopOffO;/?關(guān)閉彈出的子菜單ッgi_sel_sub_menu=0;/?將選中子菜單項(xiàng)的項(xiàng)號(hào)置為0*//*執(zhí)行對(duì)應(yīng)功能函數(shù):gi_sel_menu主菜單項(xiàng)號(hào),cAtt子菜單項(xiàng)號(hào)?/bRet=ExeFunction(gi__sel_menu,cAtt);}))elseif(inRec.Event.MouseEvent.dwButtonState==RIGHTMOST_BUTTON_PRESSED)/?如果按下鼠標(biāo)右鍵?/if(cNo==0)/*層號(hào)為0I表明該位置未被彈出子菜單覆蓋?/PopOffO; /?關(guān)閉彈出的子菜單?/gi_sel_sub_menu=0;/?將選中子菜單項(xiàng)的項(xiàng)號(hào)置為0*/}))elseif(inRec.EventType==KEY_EVENT/?如果記錄由按鍵產(chǎn)生*/&&inRec.Event.KeyEvent.bKeyDown)/?且鍵被按下?/(vkc=inRec.Event.KeyEvent.wVirtualKeyCode;/?獲取按鍵的虛擬鍵碼?/asc=inRec.Event.KeyEvent.uChar.AsciiChar;/?獲取按鍵的ASC碼?//?系統(tǒng)快捷鍵的處理?/if(vkc==112)/?如果按下F!鍵?/{if(gp_top_layer->LayerNo!=0)/?如果當(dāng)前有子菜單彈出?/(PopOffO; /?關(guān)閉彈出的子菜單ッgi_sel_sub_menu=0;/?將選中了菜單項(xiàng)的項(xiàng)號(hào)置為0*/)bRet=ExeFunction(5,1);/?運(yùn)行幫助主題功能函數(shù)?/)elseif(inRec.Event.KeyEvent.dwControIKeyState&(LEFT_ALT_PRESSED|RIGHT_ALT_PRESSED)){/?如果按下左或右Alt鍵?/switch(vkc)/?判斷組合鍵Alt+字母*/(case88:/*Alt+X退出?/if(gp_t°P_layer->LayerNo!=0)(PopOffO;gi_sel_sub_menu=0;}bRet=ExeFunction(l,4);break;case70:/*Alt+F*/PopMenu(l);break;case77:/*Alt+M*/PopMenu(2);break;case81:/*Alt+Q*/PopMenu(3);break;case83:/*Alt+S*/PopMenu(4);break;case72:/*Alt+HソPopMenu(5);break;})elseif(asc==0)/?其他控制鍵的處理?/{if(gp_top_layer->LayerNo==〇)/*如果未彈出子菜單?/(switch(vkc)/?處理方向健(左、右、下),不響應(yīng)其他控制鍵ッ(case37:gi_sel_menu-;if(gi_sel_menu==0)(gi__sel__menu=5;}TagMainMenu(gi_sel_menu);break;gi_sel_menu++;if(gi__sel_menu==6)(gi_sel_menu=1;}TagMainMenu(gi_sel_menu);break;PopMenu(gi_sel_menu);TagSubMenu(l);break;}|else/?已彈出子菜單時(shí)?/(for(loc=OJ=l;i<gi_sel__menu;i++){loc+=ga__sub__menu_count[i-l];}/?計(jì)算該子菜單中的第一項(xiàng)在子菜單字符串?dāng)?shù)組中的位置(下標(biāo))ッswitch(vkc)/*方向鍵(左、右、上、下)的處理?/gi_sel_menu—;if(gi_sel_menu<1){gi_sel__menu=5;}TagMainMenu(gi_sel_menu);PopOff();PopMenu(gi_sel_menu);TagSubMenu(l);break;num=gLsel_sub_menu-1;if(num<1)(num=ga_sub_menu_count[gi_sel_menu-l];)if(strlen(ga__sub_menu[loc+num-l])==0)(num—;}TagSubMenu(num);break;gi_sel_menu++;if(gi_sel_menu>5){gi_sel_menu=1;}TagMainMenu(gi_sel_menu);PopOff();PopMenu(gi_sel_menu);TagSubMenu(l);break;num=gi_sel_sub_menu+1;if(num>ga_sub_menu_count[gi_sel_menu-l]){//超出邊界,復(fù)原到第一個(gè)num=1;|if(strlen(ga_sub_menu[loc+num-l])==0)num++;TagSubMenu(num);break;}})elseif((asc-vkc==0)11(asc-vkc==32)){/?按下普通鍵ッif(gp_topJayer->LayerNo==0)/?如果未彈出子菜単ッ{switch(vkc){case70:/*f或F*/PopMenu(l);break;case77:/*m或MッPopMenu(2);break;case81:/*q或Q*/PopMenu(3);break;case83:/*s或S*/PopMenu(4);break;case72:/*h或H*/PopMenu(5);break;case13:/?回車?/PopMenu(gi_sel_menu);TagSubMenu(l);break;}}else/?已彈出子菜單時(shí)的鍵盤輸入處理?/{if(vkc==27)/?如果按下ESC鍵ッ(PopOff();gi_sel_sub_menu=0;}elseif(vkc==13)/?如果按下回車鍵ッ(num=gi_sel_sub_menu;PopOff();gi_sel_sub_menu=0;bRet=ExeFunction(gi_sel_menu,num);else/?其他普通鍵的處理?/(/?計(jì)算該子菜單中的第一項(xiàng)在子菜單字符串?dāng)?shù)組中的位置(下標(biāo))*/for(loc=0,i=l;i<gi_sel_menu;i++)(loc+=ga_sub_menu_count[i-l];)/?依次與當(dāng)前子菜單中每ー項(xiàng)的代表字符進(jìn)行比較?/for(i=loc;i<loc+ga__sub_menu_count[gi_sel_menu-l];i++)(if(strlen(ga_sub_menu[i])>O&&vkc==ga_sub_menu[i][l]){/?如果匹配成功?/PopOff();gi_sel__sub_menu=0;bRet=ExeFunction(gi_sel_menu,i-loc+1);})/**函數(shù)名稱:PopMenu函數(shù)功能:彈出指定主菜單項(xiàng)對(duì)應(yīng)的子菜單.輸入?yún)?shù):num指定的主菜單項(xiàng)號(hào)輸出參數(shù):無(wú)返回值:無(wú)*調(diào)用說(shuō)明:/voidPopMenu(intnum)(LABEL_BUNDLElabels;HOT_AREAareas;SMALL_RECTrePop;COORDpos;WORDatt;char*pCh;int\,loc=0;if(num!=gi_sel_menu)/?如果指定主菜單不是1選中菜單?/(if(gp_top_layer->LayerNo!=0)/?如果此前己有子菜單彈出ッ|PopOff();gi_sel__sub_menu=0;)}elseif(gp_topJayer->LayerNo!=0)/?若已彈出該子菜單,則返回?/{return;gi_sel_menu=num; /?將選中主菜單項(xiàng)置為指定的主菜單項(xiàng)ッTagMainMenu(gi_sel_menu);/*在選中的主菜單項(xiàng)上做標(biāo)記?/LocSubMenu(gi_sel_menu,&rcPop);/?計(jì)算彈出子菜單的區(qū)域位置,存放在rePop中?//?計(jì)算該子菜單中的第一項(xiàng)在子菜單字符串?dāng)?shù)組中的位置(下標(biāo))ツfor(i=l;i<gi_sel_menu;i++)(loc+=ga_sub_menu_count[i-l];}/?將該組子菜單項(xiàng)項(xiàng)名存入標(biāo)簽束結(jié)構(gòu)變量ッlabels.ppLabel=ga_sub_menu+loc; /?標(biāo)簽束第一個(gè)標(biāo)簽字符串的地址?/labels.num=ga_sub_menu_count[gi_sel_menu-l];/?標(biāo)簽束中標(biāo)簽字符串的個(gè)數(shù)?/COORDaLoc[labels.num];/?定義ー個(gè)坐標(biāo)數(shù)組,存放每個(gè)標(biāo)簽字符串輸出位置的坐標(biāo)ッfor(i=0;klabels.num;i++)/*確定標(biāo)簽字符串的輸出位置,存放在坐標(biāo)數(shù)組中?/(aLoc[i].X=rcPop.Left+2;aLoc[i].Y=rcPop.Top+i+1;}labels.pLoc二aLoc;/?使標(biāo)簽束結(jié)構(gòu)變量labels的成員pLoc指向坐標(biāo)數(shù)組的首元素57/?設(shè)置熱區(qū)信息?/areas.num=labels.num;/?熱區(qū)的個(gè)數(shù),等于標(biāo)簽的個(gè)數(shù),即子菜單的項(xiàng)數(shù)?/SMALL__RECTaArea[areas.num]; /*定義數(shù)組存放所有熱區(qū)位置ツcharaSort[areas.num]; /*定義數(shù)組存放所有熱區(qū)對(duì)應(yīng)類別?/charaTag[areas.num]; /*定義數(shù)組存放每個(gè)熱區(qū)的編號(hào)?/for(i=0;i<areas.num;i++)aArea[i].Left=rcPop.Left+2;/?熱區(qū)定位?/aArea[i].Top=rcPop.Top+i+1;aArea[i].Right=rePop.Right-2;aArea[i].Bottom=aArea[i].Top;aSort[i]=0; /?熱區(qū)類別都為0(按鈕型)*/aTag[i]=i+1; /?熱區(qū)按順序編號(hào)?/}areas.pArea=aArea;/?使熱區(qū)結(jié)構(gòu)變量areas的成員pArea指向熱區(qū)位置數(shù)組首元素?/areas.pSort=aSort;/?使熱區(qū)結(jié)構(gòu)變量areas的成員pSort指向熱區(qū)類別數(shù)組首元素?/areas.pTag=aTag; /?使熱區(qū)結(jié)構(gòu)變量areas的成員pTag指向熱區(qū)編號(hào)數(shù)組首元素?/att=BACKGROUND_BLUE|BACKGROUND_GREEN|BACKGROUND_RED;/?白底黑字?/PopUp(&rcPop,att,&labels,&areas);DrawBox(&rcPop);/?給彈出窗口畫邊框ッpos.X=rcPop.Left+2;for(pos.Y=rcPop.Top+l;pos.Y<rcPop.Bottom;pos.Y++){/?此循環(huán)用來(lái)在空串子菜項(xiàng)位置畫線形成分隔,并取消此菜單項(xiàng)的熱區(qū)屬性?/pCh=ga_sub_menu[loc+pos.Y-rcPop.Top-l];if(strlen(pCh)ニニ〇)/?串長(zhǎng)為0,表明為空串?/{ /?首先畫橫線?/FillConsoleOutputCharacter(gh__std_out, rcPop.Right-rcPop.Left-3, pos,&buffer);for(j二rePop丄eft+2;j<rcPop.Right-1;j++){ /?取消該區(qū)域字符單元的熱區(qū)屬性?/gp_scr_att[pos.Y*SCR_COL+j]&=3;/?按位與的結(jié)果保留了低兩位?/}}}/?將子菜單項(xiàng)的功能鍵設(shè)為白底紅字?/pos.X=rcPop.Left+3;att=FOREGROUND_RED|BACKGROUND_BLUE|BACKGROUND_GREEN|BACKGROUND_RED;for(pos.Y二rcPop.Top+1;pos.Y<rcPop.Bottom;pos.Y++){if(strlen(ga_sub_menu[loc+pos.Y-rcPop.Top-l])ニニ〇)(continue;/*跳過(guò)空串ッ)FillConsoleOutputAttribute(gh_std_out,att,1,pos,&buffer);}return;)?函數(shù)名稱:PopUp函數(shù)功能:在指定區(qū)域輸出彈出窗口信息,同時(shí)設(shè)置熱區(qū),將彈岀窗口位置信息入棧.輸入?yún)?shù):pRc彈出窗口位置數(shù)據(jù)存放的地址att彈出窗口區(qū)域字符屬性pLabe!彈出窗口中標(biāo)簽束信息存放的地址pHotArea彈出窗口中熱區(qū)信息存放的地址輸出參數(shù):無(wú)返回值:無(wú)*調(diào)用說(shuō)明:/voidPopUp(SMALL_RECT*pRc,WORDatt,LABEL_BUNDLE*pLabelzHOT_AREA*pHotArea)(LAYER_NODE*nextLayer;COORDsize;COORDpos={〇,0};char*pCh;inti,j,row;/?彈出窗口所在位置字符單元信息入棧*/size.X=pRc->Right-pRc->Left+1; /?彈出窗口的寬度?/size.Y=pRc->Bottom-pRc->Top+1; /?彈出窗口的髙度ッ/?申請(qǐng)存放彈出窗口相關(guān)信息的動(dòng)態(tài)存儲(chǔ)區(qū)ッnextLayer=(LAYER_NODE*)malloc(sizeof(LAYER_NODE));nextLayer->next=gp_top_layer;nextLayer->LayerNo=gp_top_layer->LayerNo+1;nextLayer->rcArea=*pRc;nextLayer->pContent=(CHARJNFO*)malloc(size.X*size.Y*sizeof(CHAR_INFO));nextLayer->pScrAtt=(char*)malloc(size.X*size.Y*sizeof(char));pCh=nextLayer->pScrAtt;/?將彈出窗口覆蓋區(qū)域的字符信息保存,用于在關(guān)閉彈出窗口時(shí)恢復(fù)原樣?/ReadConsoleOutput(gh_std_out,nextLayer->pContent,size,pos,pRc);for(i=pRc->Top;i<=pRc->Bottom;i++){ /?此二重循環(huán)將所覆蓋字符單元的原先屬性值存入動(dòng)態(tài)存儲(chǔ)區(qū),便于以后恢復(fù)ッfor(j=pRc->Left;j<=pRc->Right;j++)(*pCh=gp_scr_att[i*SCR_COL+j];pCh++;))gP_top」ayer=nextLayer;/?完成彈出窗口相關(guān)信息入棧操作?//?設(shè)置彈出窗口區(qū)域字符的新屬性?/pos.X=pRc->Left;pos.Y=pRc->Top;for(i=pRc->Top;i<=pRc->Bottom;i++){FillConsoleOutputAttribute(gh_std_out/att,size.X,pos,&buffer);pos.Y++;}/?將標(biāo)簽束中的標(biāo)簽字符串在設(shè)定的位置輸出?/for(i=0;i<pLabel->num;i++){pCh=pLabel->ppLabel[i];if(strlen(pCh)!=0){WriteConsoleOutputCharacter(gh_std_out,pCh,strlen(pCh),pLabel->pLoc[i],&buffer);})/?設(shè)置彈出窗口區(qū)域字符單元的新屬性?/for(i=pRc->Top;i<=pRc->Bottom;i++){ /?此二重循環(huán)設(shè)置字符單元的層號(hào)?/for(j=pRc->Left;j<=pRc->Right;j++)(gp_scr_att[i*SCR_COL+j]=gp_top_layer->LayerNo;for(i=0;i<pHotArea->num;i++){ /?此二重循環(huán)設(shè)置所有熱區(qū)中字符單元的熱區(qū)類型和熱區(qū)編號(hào)?/row=pHotArea->pArea[i].Top;for(j=pHotArea->pArea[i].Left;j<=pHotArea->pArea[i].Right;j++)(gp_scr_att[row*SCR_COL+j]|=(pHotArea->pSort[i]?6)I(pHotArea->pTag[i]?2);}}att=BACKGROUND_lNTENSITY|BACKGROUNDJNTENSITY|BACKGROUND_BLUE|BACKGROUND_GREEN|BACKGROUND_RED;for(i=pRc->Top;i<=pRc->Bottom;i++){/?為輸入框涂上色?/for(j=pRc->Left;j<=pRc->Right;j++){/?是熱區(qū),且是輸入框ッ?f((gp_scr_att[i*SCR_COL+j]?6)==1&&gp_scr_att[i*SCR_COL+j]&3)pos.X=j;pos.Y=i;FillConsoleOutputAttribute(gh_std_out,att,1,pos,&buffer);)}return;}/**函數(shù)名稱:PopOff函數(shù)功能:關(guān)閉頂層彈出窗口,恢復(fù)覆蓋區(qū)域原外觀和字符單元原屬性.輸入?yún)?shù):無(wú)輸出參數(shù):無(wú)返回值:無(wú)*調(diào)用說(shuō)明:/voidPopOff(void)(LAYER_NODE*nextLayer;COORDsize;COORDpos={〇,0};char*pCh;intij;>f((gP_top_layer->next==NULL)11(gp_top_layer->pContent==NULL)){ /?棧底存放的主界面屏幕信息,不用關(guān)閉?/return;}nextLayer=gp_top_layer?>next;/?恢復(fù)彈出窗口區(qū)域原外觀ッsize.X=gp_top_layer->rcArea.Right-gp_t°P_layer->rcArea.Left+1;size.Y=gp_top_layer->rcArea.Bottom-gp_top_layer->rcArea.Top+1;WriteConsoleOutput(gh_std_out,gp_top_layer->pContent,size,pos,&(8P_top_layer->rcArea));/?恢復(fù)字符單元原屬性?/pCh=gp_top_layer->pScrAtt;for(i=gp_top_layer->rcArea.Top;i<=gp_top_layer->rcArea.Bottom;i++){for(j=gp_top_layer->rcArea.Left;j<=gp_top_layer->rcArea.Right;j++){gp_scr_att[i*SCR__COL+j]=*pCh;pCh++;free(gp_topJayer->pContent);/*釋放動(dòng)態(tài)存儲(chǔ)區(qū)ッfree(gp_topJayer->pScrAtt);free(gp_top_layer);gp_top_layer=nextLayer;gi_sel_sub_menu=0;return;}/**函數(shù)名稱:DrawBox函數(shù)功能:在指定區(qū)域畫邊框.輸入?yún)?shù):pRc存放區(qū)域位置信息的地址輸出參數(shù):無(wú)返回值:無(wú)*調(diào)用說(shuō)明:/voidDrawBox(SMALL_RECT*pRc)(charchBox[]={'+7-7|,);/?畫框用的字符?/COORDpos={pRc->LeftzpRc->Top};/?定位在區(qū)域的左上角?/WriteConsoleOutputCharacter(gh_std_out,&chBox[0]z1,pos,&buffer);/?畫邊框左上角?/for(pos.X=pRc->Left+1;pos.X<pRc->Right;pos.X++){ /?此循環(huán)畫上邊框橫線ッWriteConsoleOutputCharacter(gh_std_out,&chBox[l],1,pos,&buffer);}pos.X=pRc->Right;WriteConsoleOutputCharacter(gh_std_out,&chBox[0],1,pos,&buffer);/*畫邊框右上角ッfor(pos.Y=pRc->Top+l;pos.Y<pRc->Bottom;pos.Y++){ /?此循環(huán)畫邊框左邊線和右邊線ッpos.X=pRc->Left;WriteConsoleOutputCharacter(gh_std_out,&chBox[2],1,pos,&buffer);pos.X=pRc->Right;WriteConsoleOutputCharacter(gh_std_out,&chBox[2],1,pos,&buffer);)pos.X=pRc->Left;pos.Y=pRc->Bottom;WriteConsoleOutputCharacter(gh_std_out,&chBox[0],1,pos,&buffer);/?畫邊框左下角?/for(pos.X=pRc->Left+1;pos.X<pRc->Right;pos.X++){ /?畫下邊框橫線ッWriteConsoleOutputCharacter(gh_std_out,&chBox[l],1,pos,&buffer);pos.X=pRc->Right;WriteConsoleOutputCharacter(gh_std_out/&chBox[0]z1,pos,&buffer);/?畫邊框右下角?/return;}/**函數(shù)名稱:TagSubMenu函數(shù)功能:在指定子菜單項(xiàng)上做選中標(biāo)記.輸入?yún)?shù):num選中的子菜單項(xiàng)號(hào)輸出參數(shù):無(wú)+返回值:無(wú)*調(diào)用說(shuō)明:/voidTagSubMenu(intnum)(SMALL_RECTrePop;COORDpos;WORDatt;intwidth;LocSubMenu(gi_sel_menuz&rcPop);/*計(jì)算彈出子菜單的區(qū)域位置,存放在rePop中*/if((num<l)11(num==gi_sel_sub_menu)11(num>rcPop.Bottom-rcPop.Top-l)){ /?如果子菜單項(xiàng)號(hào)越界,或該項(xiàng)子菜單已被選中,則返回?/return;}pos.X=rcPop.Left+2;width=rePop.Right-rcPop.Left-3;if(gi_sel_sub_menu!=0)/?首先取消原選中子菜單項(xiàng)上的標(biāo)記ッ{pos.Y=rcPop.Top+gi_sel_sub_menu;att=BACKGROUND_BLUE|BACKGROUND_GREEN|BACKGROUND_RED;/?白底黑字?/FillConsoleOutputAttribute(gh_std_out,att,width,pos,&buffer);pos.X+=1;att|=FOREGROUND_RED;/?白底紅字?/FillConsoleOutputAttribute(gh_std_out,att,1,pos,&buffer);}/?在制定子菜單項(xiàng)上做選中標(biāo)記ッpos.X=rcPop.Left+2;pos.Y=rcPop.Top+num;att=FOREGROUND_BLUE|FOREGROUND_GREEN|FOREGROUND_RED;/?黑底白字?/FillConsoleOutputAttribute(gh_std_out,att,width,posz&buffer);gi_sel_sub_menu=num;/?修改選中子菜單項(xiàng)號(hào)?/return;)/**函數(shù)名稱:LocSubMenu函數(shù)功能:計(jì)算彈出子菜単區(qū)域左上角和右下角的位置.輸入?yún)?shù):num選中的主菜單項(xiàng)號(hào)輸出參數(shù):rc存放區(qū)域位置信息的地址返回值:無(wú)*調(diào)用說(shuō)明:/voidLocSubMenu(intnum,SMALL_RECT*rc)(inti,len,loc=0;rc->Top=1;/?區(qū)域的上邊定在第2行,行號(hào)為17rc->Left=1;for(i=l;knum;i++){ /?計(jì)算區(qū)域左邊界位置,同時(shí)計(jì)算第一個(gè)子菜單項(xiàng)在子菜單字符串?dāng)?shù)組中的位置?/rc->Left+=strlen(ga__main_menu[i-l])+4;loc+=ga_sub_menu_count[i-l];}rc->Right=strlen(ga_sub_menu[loc]);/*暫時(shí)存放第一個(gè)子菜單項(xiàng)字符串長(zhǎng)度?/for(i=l;i<ga_sub_menu_count[num-l];i++){ /?查找最長(zhǎng)子菜單字符串,將其長(zhǎng)度存放在rc->Righビノlen=strlen(ga_sub_menu[loc+i]);if(rc->Right<len)(rc->Right=len;}}rc->Right+=rc->Left+3;/?計(jì)算區(qū)域的右邊界?/rc->Bottom=rc->Top+ga_sub_menu_count[num-l]+1;/?計(jì)算區(qū)域"!'邊的行號(hào)?/if(rc->Right>=SCR_COL)/?右邊界越界的處理?/{len=rc->Right-SCR_COL+1;rc->Left-=len;rc->Right=SCR_COL-1;}return;函數(shù)名稱:Dealinput函數(shù)功能:在彈出窗口區(qū)域設(shè)置熱區(qū),等待并相應(yīng)用戶輸入.輸入?yún)?shù):pHotAreapiHot焦點(diǎn)熱區(qū)編號(hào)的存放地址,即指向焦點(diǎn)熱區(qū)編號(hào)的指針輸出參數(shù):piHot用鼠標(biāo)單擊、按回車或空格時(shí)返回當(dāng)前熱區(qū)編號(hào)返回值:*調(diào)用說(shuō)明:/intDeallnput(HOT__AREA*pHotArea/int*piHot)(INPUT_RECORDinRec;DWORDres;COORDpos={〇,0},cur_pos;inti=0,j=0,iRet=0;intcNo,cTag,cSort;/*cNo:層號(hào),cTag:熱區(qū)編號(hào),cSort:熱區(qū)類型ッcharvkc,asc; /*vkc:虛擬鍵代碼,asc:字符的ASCII碼值*/WORDatt=BACKGROUNDJNTENSITY|BACKGROUNDJNTENSITY|BACKGROUND__BLUE|BACKGROUND_GREEN|BACKGROUND_RED; /?灰底黑字輸入?/;CONSOLE_CURSOR_INFOcur;CONSOLE_SCREEN_BUFFER_INFOsc_buf;SetHotPoint(pHotArea,*piHot);while(TRUE){ /*循環(huán)ッReadConsolelnput(gh_std_in,&inRec,1,&res);if((inRec.EventType==MOUSE_EVENT)&&(inRec.Event.MouseEvent.dwButtonState==FROM_LEFT_1ST_BUTTON_PRESSED)){pos=inRec.Event.MouseEvent.dwMousePosition;cNo=gp_scr_att[pos.Y*SCR_COL+pos.X]&3;cTag=(gp_scr_att[pos.Y*SCR_COL+pos.X]?2)&15;cSort=(gp_scr_att[pos.Y*SCR_COL+pos.X]?6)&3;if((cNo==gp_top_layer->LayerNo)&&cTag>0){〃如果點(diǎn)在熱區(qū)上*piHot=cTag;SetHotPoint(pHotArea,*piHot);if(cSort==0)(iRet=cTag;returniRet;elseif(cSort==1){//點(diǎn)擊在輸入框中,光標(biāo)移至記憶輸入位置i=cTag-1;j=strlen(input[i]);cur_pos.X=pHotArea?>pArea[*piHot?l]丄eft+j;cur_pos.Y=pHotArea->pArea[*piHot-l].Bottom;SetConsoleCursorPosition(gh_std_out,cur_pos);})elseif(cTag==0){/?如果點(diǎn)在非熱點(diǎn)區(qū)域ッGetConsoleCursorlnfo(gh_std_out,&cur);cur.bVisible=FALSE;SetConsoleCursorlnfo(gh_std_out,&cur);/?隱藏光標(biāo)?/}}〃若為按鍵信息elseif(inRec.EventType==KEY_EVENT&&inRec.Event.KeyEvent.bKeyDown)(vkc=inRec.Event.KeyEvent.wVirtualKeyCode;asc=inRec.Event.KeyEvent.uChar.AsciiChar;switch(vkc){case8:/*處理刪除鍵キ/case46:if(cur.dwSize==TRUE);{GetConsoleCursorlnfo(gh_std_out,&cur);if(j>0)(input[i][-j]='\O';putchar('\b');GetConsoleScreenBufferlnfo(gh_std_out,&sc_buf);cur_pos.X=sc_buf.dwCursorPosition.X;cur_pos.Y=sc_buf.dwCursorPosition.Y;FillConsoleOutputCharacter(gh_std_out,'1,cur_pos,&buffer);FillConsoleOutputAttribute(gh_std_out,att,1,cur_pos,&buffer);if((int)input[i][j-l]&0x80)/?漢字的退格處理ッ(input[i][-j]='\O';putchar('\b');
GetConsoleScreenBufferlnfo(gh_std_out/&sc_buf);cur_pos.X=sc_buf.dwCursorPosition.X;cur_pos.Y=sc__buf.dwCursorPosition.Y;cur_pos,cur_pos,FillConsoleOutputCharacter(gh_std_out/' cur_pos,cur_pos,&buffer);FillConsoleOutputAttribute(gh_std_out,att, 1,&buffer);}break;case37:/?處理上、左鍵ッcase38:-*piHot;if(*piHot<1)(*piHot=pHotArea->num;)SetHotPoint(pHotAreaz*piHot);GetConsoleCursorlnfo(gh_std_out/&cur);if(cur.bVisible==TRUE)(=*piHot-l;j=strlen(input[i]);cur_pos.X=pHotArea->pArearpiHot?l].Le代+j;cur_pos.Y=pHotArea->pArea[*piHot-l].Top;SetConsoleCursorPosition(gh_std_out,cur_pos);}break;case13:/?按回車鍵?]if(pHotArea->pSort[*piHot-l]==0){〃若為按鈕GetConsoleCursorlnfo(gh_std_out/&cur);cur.bVisible=FALSE;SetConsoleCursorlnfo(gh_std_outz&cur);/?隱藏光標(biāo)?/iRet=*piHot;returniRet;)case39:/*處理右、下、TAB鍵*/case40:〃與在輸入框中按回車的情況case9:++*piHot;if(*piHot>pHotArea->num)*piHot=1;}SetHotPoint(pHotArea,*piHot);GetConsoleCursorlnfo(gh_std_out,&cur);if(cur.bVisible==TRUE);(i=*piHot-l;j=strlen(input[i]);cur_pos.X=pHotArea->pArea[*piHot-l].Left+j;cur_pos.Y=pHotArea->pArea[*piHot-l].Top;SetConsoleCursorPosition(gh_std_out/cur_pos);}break;case27:/?按ESC鍵?/GetConsoleCursorlnfofgh-std_out,&cur);cur.bVisible=FALSE;SetConsoleCursorlnfo(gh_std__outz&cur);/?隱藏光標(biāo)?/iRet=27;returniRet;case16:break;default:if(pHotArea->pSort[*piHot-l]==1&&asc!=0){//輸入GetConsoleScreenBufferlnfo(gh_std_out/&sc_buf);cur_pos.X=sc_buf.dwCursorPosition.X;cur_pos.Y=sc_buf.dwCursorPosition.Y;if(cur_pos.X<pHotArea->pArea[*piHot-l].Right){//輸入不能越界input[i][j]=asc;putchar(asc);j++;input。皿=2;FillConsoleOutputAttribute(gh_std_out/att,2,cur_posz&buffer);}else(GetConsoleCursorlnfo(gh_std_out,&cur);cur.bVisible=FALSE;SetConsoleCursorlnfo(gh_std_out/&cur);/?隱臧光標(biāo)?/})}//switch}〃按鍵returniRet;/**函數(shù)名稱:SetHotPoint函數(shù)功能:激活熱區(qū)輸入?yún)?shù):pHotArea熱區(qū)的指針iHot 熱區(qū)的序號(hào)輸出參數(shù):返回值:無(wú)/voidSetHotPoint(HOT_AREA*pHotArea,intiHot)(CONSOLE_CURSOR_INFOIpCur;COORDpos={〇,0};WORDattl,att2;inti,width;attl=FOREGROUND_BLUE|FOREGROUND_GREEN|FOREGROUND_RED;/?黑底白字?/att2=BACKGROUND_BLUE|BACKGROUND_GREEN|BACKGROUND_RED|FOREGROUND_BLUE;/?白底藍(lán)字S7for(i=0;i<pHotArea->num;i++){/?將按鈕類熱區(qū)置為白底黑字?/pos.X=pHotArea->pArea[i].Left;pos.Y=pHotArea->pArea[i].Top;width=pHotArea->pArea[i].Right-pHotArea->pArea[i].Left+1;if(pHotArea->pSort[i]==0){/?熱區(qū)是按鈕類?/FillConsoleOutputAttribute(gh_std_out,att2,width,pos,&buffer);}|pos.X=pHotArea->pArea[iHot-l].Left;pos.Y=pHotArea->pArea[iHot-l].Top;width=pHotArea->pArea[iHot-l].Right-pHotArea?>pArea[iHot-l].Left+1;if(pHotArea->pSort[iHot-l]==0){/?被激活熱區(qū)是按鈕類*/GetConsoleCursorlnfo(gh_std_out,&lpCur);IpCur.bVisible=FALSE;SetConsoleCursorlnfo(gh_std_out,&lpCur);/?并隱藏光標(biāo)?/FillConsoleOutputAttribute(gh_std_out,attl,width,pos,&buffer);)elseif(pHotArea->pSort[iHot-l]==1){/?被激活熱區(qū)是文本框類?/SetConsoleCursorPosition(gh_std_out,pos);GetConsoleCursorlnfo(gh_std_out,&lpCur);IpCur.bVisible=TRUE;SetConsoleCursorlnfo(gh_std_out,&lpCur);/?光標(biāo)移至輸入框起始位置ッ)/**函數(shù)名稱:ExeFunction函數(shù)功能:執(zhí)行由主菜單號(hào)和子菜單號(hào)確定的功能函數(shù).輸入?yún)?shù):m主菜單項(xiàng)號(hào)S子菜單項(xiàng)號(hào)輸出參數(shù):無(wú)返回值:BOOL類型,TRUE或FALSE*?調(diào)用說(shuō)明:僅在執(zhí)行函數(shù)ExitSys時(shí),オ可能返回FALSE,其他情況下總是返回TRUE*/BOOLExeFunction(intm,ints)(BOOLbRet=TRUE;/?函數(shù)指針數(shù)組,用來(lái)存放所有功能函數(shù)的入口地址?/BOOL(*pFunction[ga_sub_menu__count[0]+ga_sub_menu_count[l]+ga_sub_menu_count[2]+ga_sub_menu_count[3]+ga_sub_menu_count[4]])(void);inti,loc;/?將功能函數(shù)入口地址存入與功能函數(shù)所在主菜單號(hào)和子菜單號(hào)對(duì)應(yīng)下標(biāo)的數(shù)組元素7pFunction[0]=SaveData;pFunction[l]=BackupData;pFunction[2]=RestoreData;pFunction[3]=ExitSys;pFunction[4]=MaintainCollegelnfo;pFunction[5]=MaintainTeamlnfo;pFunction[6]=MaintainProjectlnfo;pFunction[7]=QueryCollegelnfo;pFunction[8]=QueryTeamlnfo;pFunction[9]=QueryProjectlnfo;pFunction[10]=StatCollegeUsedRate;pFunction[ll]=StatTeamUsedRate;pFunction[12]=StatCategoryUsedRate;pFunction[13]=StatAverageTeacherRate;
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 保險(xiǎn)合規(guī)考試試題及答案
- 大數(shù)據(jù)驅(qū)動(dòng)的職業(yè)性放射病風(fēng)險(xiǎn)預(yù)測(cè)研究-1
- 大數(shù)據(jù)賦能精準(zhǔn)醫(yī)學(xué)人才培養(yǎng)模式
- 大數(shù)據(jù)在慢病健康促進(jìn)中的應(yīng)用
- 導(dǎo)演考試題及答案
- 多維度分層在個(gè)體化手術(shù)中的應(yīng)用
- 2025年大學(xué)大二(商務(wù)策劃)方案撰寫綜合測(cè)試題及答案
- 2025年高職旅游服務(wù)與管理(導(dǎo)游詞撰寫)試題及答案
- 2025年中職(工業(yè)機(jī)器人技術(shù)應(yīng)用)機(jī)器人傳感器應(yīng)用試題及答案
- 2025年高職(環(huán)境監(jiān)測(cè)技術(shù))環(huán)境工程原理實(shí)務(wù)試題及答案
- 吳江三小英語(yǔ)題目及答案
- 2025年事業(yè)單位筆試-河北-河北藥學(xué)(醫(yī)療招聘)歷年參考題庫(kù)含答案解析(5卷套題【單選100題】)
- 集團(tuán)債權(quán)訴訟管理辦法
- 鋼結(jié)構(gòu)施工進(jìn)度計(jì)劃及措施
- 智慧健康養(yǎng)老服務(wù)與管理專業(yè)教學(xué)標(biāo)準(zhǔn)(高等職業(yè)教育專科)2025修訂
- 珠寶首飾售后服務(wù)與保修合同
- 2025年廣東省惠州市惠城區(qū)中考一模英語(yǔ)試題(含答案無(wú)聽(tīng)力原文及音頻)
- 煤礦皮帶輸送機(jī)跑偏原因和處理方法
- 征兵體檢超聲診斷
- 創(chuàng)傷后應(yīng)激障礙的心理護(hù)理
- 醫(yī)療項(xiàng)目年度總結(jié)模板
評(píng)論
0/150
提交評(píng)論