TC字符界面-菜单程序【原创】
生活随笔
收集整理的這篇文章主要介紹了
TC字符界面-菜单程序【原创】
小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
TC字符界面-菜單程序【原創(chuàng)】 2008/03/06 22:58 /*本程序代碼屬本人原創(chuàng),未經(jīng)允許不得轉(zhuǎn)載,謝謝合作
作者:HungryAnt
發(fā)布時間:2008-3-6
*/
/*快捷鍵功能沒有提供,因?yàn)槌绦蛴懈髯缘目旖萱I*/
#include<stdio.h>
#include<conio.h>
#include<string.h>
#include<bios.h>
/*bios_key*/
#define LEFT 0x4B00
#define RIGHT 0x4D00
#define UP??? 0x4800
#define DOWN 0x5000
#define ENTER 0x1c0d
#define ALT?? 0x1100
#define ESC?? 0x011B
#define F1??? 0x3B00
#define M 3
#define MAX 20
#define B0 4
#define B1 5
#define B2 6
/*B0,B1等必須小于M*/
char *mmenu[M];/*主菜單指針數(shù)組*/
char *bmenu_0[B0];/*分菜單0指針數(shù)組*/
char *bmenu_1[B1];/*分菜單1指針數(shù)組*/
char *bmenu_2[B2];/*分菜單2指針數(shù)組*/
void MenuItem(char *menu[],int max,char *pm,...){/*菜單項(xiàng) 可變參數(shù)*/
??? int i=0;
??? char **ppm=±/*ppm為指向指針的指針*/
??? while(i<max){/*將傳進(jìn)來的字符串地址全部存入指針數(shù)組中*/
??????? menu[i]=*ppm;
??????? /*ppm=sizeof(pm)/sizeof(ppm);*/
??????? ppm++;/*ppm和pm所占字節(jié)數(shù)都是2,這樣就得到了pm后一個指向字符串的指針地址*/
??????? i++;
??? }
}
void MainMenuPaint(int choose){/*主菜單繪制*/
??? int i=0,x=1,len;
??? int bg=LIGHTGRAY,text=BLACK,h=RED;/*灰底,黑字,紅(表示ALT+快捷鍵)*/
??? char t[2];
??? window(1,1,80,1);/*主菜單欄*/
??? textattr((bg<<4)+text);
??? clrscr();
??? while(i<M){/*顯示各項(xiàng)名稱*/
??????? cprintf(" %s ",mmenu[i]);/*主菜單各項(xiàng)左右各一個空格*/
??????? i++;
??? }
??? i=0;
??? while(i<M){/*標(biāo)上快捷鍵鍵位和當(dāng)前選擇項(xiàng)加黑*/
??????? if(i==choose){
??????????? len=x+strlen(mmenu[i])+2;
??????????? for(;x<len;x++){
??????????????? gettext(x,1,x,1,t);
??????????????? t[1]=(0<<4)+15;/*黑底白字*/
??????????????? puttext(x,1,x,1,t);
??????????? }
??????????? i++;
??????? }
??????? else{
??????????? x++;
??????????? gettext(x,1,x,1,t);
??????????? t[1]=(bg<<4)+RED;
??????????? puttext(x,1,x,1,t);
??????????? x+=strlen(mmenu[i]);
??????????? x++;
??????????? i++;
??????? }
??? }
}
void BMenuPaint(char *menu[],int lx,int mx,int my,int bchoose){/*分菜單繪制*/
??? int bg=LIGHTGRAY,text=BLACK;/*顏色設(shè)置*/
??? int i,j;
??? char t[2];
??? window(lx,2,lx+mx-1,my+1+1);/*創(chuàng)建窗口*/
??? textattr((bg<<4)+text);
??? clrscr();
??? gotoxy(1,1);/*相對于當(dāng)前窗口*/
??? for(j=0;j<mx;j++)putch(196);
??? i=0;
??? while(i<my){
??????? gotoxy(1,i+2);
??????? printf(" %s ",menu[i]);
??????? i++;
??? }
??? i=bchoose;
??? for(j=0;j<mx;j++){
??????? gettext(lx+j,i+3,lx+j,i+3,t);
??????? t[1]=(BLACK<<4)+WHITE;
??????? puttext(lx+j,i+3,lx+j,i+3,t);
??? }
}
int BMenuChoose(int choose){/*分菜單選擇,并繪制*/
??? char *menu[MAX];
??? char *pt;/*儲存被分菜單暫時覆蓋部分的內(nèi)容*/
??? int my=0,lx,mx=0,bchoose=0,i,l,key;
??? switch(choose){/*@@@@@@@@@@@@@@添加分菜單需要在此處添加相應(yīng)代碼*/
??? case 0:/*分窗口0*/
??????? my=B0;/*此處用來設(shè)置分窗口共多少項(xiàng),B0為預(yù)處理*/
??????? for(i=0;i<B0;i++)menu[i]=bmenu_0[i];/*將bmenu_0指針數(shù)組所有指向的地址傳給menu指針數(shù)組*/
??????? lx=1;/*mx表示分菜單窗口左側(cè)x坐標(biāo)*/
??????? break;
??? case 1:/*分窗口1*/
??????? my=B1;
??????? for(i=0;i<B1;i++)menu[i]=bmenu_1[i];
??????? lx=1+strlen(mmenu[0])+2;
??????? break;
??? case 2:/*分窗口2*/
??????? my=B2;
??????? for(i=0;i<B2;i++)menu[i]=bmenu_2[i];
??????? lx=1+strlen(mmenu[0])+2;
??????? lx+=strlen(mmenu[1])+2;
??????? break;
??? }
??? i=0;
??? while(i<my){/*使mx為大小為最長字符串的長度*/
??????? l=strlen(menu[i]);
??????? if(mx<l)mx=l;
??????? i++;
??? }
??? mx+=2;/*是項(xiàng)目左右各一個空格*/
??? /*儲存被分菜單暫時覆蓋部分的內(nèi)容*/
??? pt=(char *)malloc(mx*(my+1)*2);/*my+1用意在于本菜單顯示時會多一行橫線*/
??? gettext(lx,2,lx+mx-1,(my+1)+1,pt);
??? BMenuPaint(menu,lx,mx,my,bchoose);
??? while(1){
??????? if(bioskey(1)){
??????????? key=bioskey(0);
??????????? switch(key){
??????????? case DOWN:
??????????????? bchoose=(bchoose<my-1)?bchoose+1:0;
??????????????? BMenuPaint(menu,lx,mx,my,bchoose);
??????????????? break;
??????????? case UP:
??????????????? bchoose=(bchoose>0)?bchoose-1:my-1;
??????????????? BMenuPaint(menu,lx,mx,my,bchoose);
??????????????? break;
??????????? case RIGHT:
??????????? case LEFT:
??????????????? free(pt);
??????????????? puttext(lx,2,lx+mx-1,(my+1)+1,pt);/*覆蓋區(qū)域復(fù)原*/
??????????????? return key;/*返回kay值*/
??????????? case ENTER:
??????????? case ESC:
??????????????? free(pt);
??????????????? puttext(lx,2,lx+mx-1,(my+1)+1,pt);/*覆蓋區(qū)域復(fù)原*/
??????????????? return;
??????????? }
??????? }
??? }
}
void ChooseMainMenu(int choose){/*主菜單選擇*/
??? int key=0,at=0;
??? MainMenuPaint(0);/*菜單項(xiàng)選擇自動設(shè)為0*/
??? key=BMenuChoose(0);
??? if(key==RIGHT || key==LEFT)at=1;
??? else at=0;
??? while(1){
??????? if(bioskey(1) || at){/*at為自動,此用意是讓切換分菜單切換加快*/
??????????? if(at!=1)key=bioskey(0);
??????????? switch(key){
??????????? case RIGHT:
??????????????? choose=(choose<M-1)?choose+1:0;
??????????????? MainMenuPaint(choose);
??????????????? key=BMenuChoose(choose);/*分菜單選擇調(diào)用*/
??????????????? /*返回值賦給key,是用來方便從*/
??????????????? if(key==RIGHT || key==LEFT)at=1;
??????????????? else at=0;
??????????????? break;
??????????? case LEFT:
??????????????? choose=(choose>0)?choose-1:M-1;
??????????????? MainMenuPaint(choose);
??????????????? key=BMenuChoose(choose);/*分菜單選擇調(diào)用*/
??????????????? if(key==RIGHT || key==LEFT)at=1;
??????????????? else at=0;
??????????????? break;
??????????? case ENTER:
??????????? case ESC:return;
??????????? }
??????? }
??? }
}
int main(){
??? int key,i;
??? MenuItem(mmenu,M,"HungryAnt","Author","Help");/*主菜單*/
??? /*用可變參數(shù)就是怎么爽,但字符串?dāng)?shù)量需要和M值相等,不能太多,僅支持一行顯示*/
??? MainMenuPaint(-1);/*菜單項(xiàng)選擇*/
??? MenuItem(bmenu_0,B0,"HungryAnt","I really","love you!!!","Good bye!");/*分菜單*/
??? MenuItem(bmenu_1,B1,"HungryAnt","abcdffff","1223312","567","HHHH");
??? MenuItem(bmenu_2,B2,"H","I","l","G","G","Good bye!");
??? window(1,2,80,25);
??? textattr((BLUE<<4)+WHITE);
??? clrscr();
??? /*for(i=0;i<B1;i++){
??????? printf(" %s /n",bmenu_1[i]);
??? }
??? getch(); */
??? cprintf("Press F1 to the Main Menu...");
??? while(1){
??????? if(bioskey(1)){
??????????? key=bioskey(0);
??????????? switch(key){
??????????? case F1:
??????????????? ChooseMainMenu(0);/*主菜單選擇,先設(shè)為0*/
??????????????? exit(1);
??????????? }
??????? }
??? }
??? getch();
}?
作者:HungryAnt
發(fā)布時間:2008-3-6
*/
/*快捷鍵功能沒有提供,因?yàn)槌绦蛴懈髯缘目旖萱I*/
#include<stdio.h>
#include<conio.h>
#include<string.h>
#include<bios.h>
/*bios_key*/
#define LEFT 0x4B00
#define RIGHT 0x4D00
#define UP??? 0x4800
#define DOWN 0x5000
#define ENTER 0x1c0d
#define ALT?? 0x1100
#define ESC?? 0x011B
#define F1??? 0x3B00
#define M 3
#define MAX 20
#define B0 4
#define B1 5
#define B2 6
/*B0,B1等必須小于M*/
char *mmenu[M];/*主菜單指針數(shù)組*/
char *bmenu_0[B0];/*分菜單0指針數(shù)組*/
char *bmenu_1[B1];/*分菜單1指針數(shù)組*/
char *bmenu_2[B2];/*分菜單2指針數(shù)組*/
void MenuItem(char *menu[],int max,char *pm,...){/*菜單項(xiàng) 可變參數(shù)*/
??? int i=0;
??? char **ppm=±/*ppm為指向指針的指針*/
??? while(i<max){/*將傳進(jìn)來的字符串地址全部存入指針數(shù)組中*/
??????? menu[i]=*ppm;
??????? /*ppm=sizeof(pm)/sizeof(ppm);*/
??????? ppm++;/*ppm和pm所占字節(jié)數(shù)都是2,這樣就得到了pm后一個指向字符串的指針地址*/
??????? i++;
??? }
}
void MainMenuPaint(int choose){/*主菜單繪制*/
??? int i=0,x=1,len;
??? int bg=LIGHTGRAY,text=BLACK,h=RED;/*灰底,黑字,紅(表示ALT+快捷鍵)*/
??? char t[2];
??? window(1,1,80,1);/*主菜單欄*/
??? textattr((bg<<4)+text);
??? clrscr();
??? while(i<M){/*顯示各項(xiàng)名稱*/
??????? cprintf(" %s ",mmenu[i]);/*主菜單各項(xiàng)左右各一個空格*/
??????? i++;
??? }
??? i=0;
??? while(i<M){/*標(biāo)上快捷鍵鍵位和當(dāng)前選擇項(xiàng)加黑*/
??????? if(i==choose){
??????????? len=x+strlen(mmenu[i])+2;
??????????? for(;x<len;x++){
??????????????? gettext(x,1,x,1,t);
??????????????? t[1]=(0<<4)+15;/*黑底白字*/
??????????????? puttext(x,1,x,1,t);
??????????? }
??????????? i++;
??????? }
??????? else{
??????????? x++;
??????????? gettext(x,1,x,1,t);
??????????? t[1]=(bg<<4)+RED;
??????????? puttext(x,1,x,1,t);
??????????? x+=strlen(mmenu[i]);
??????????? x++;
??????????? i++;
??????? }
??? }
}
void BMenuPaint(char *menu[],int lx,int mx,int my,int bchoose){/*分菜單繪制*/
??? int bg=LIGHTGRAY,text=BLACK;/*顏色設(shè)置*/
??? int i,j;
??? char t[2];
??? window(lx,2,lx+mx-1,my+1+1);/*創(chuàng)建窗口*/
??? textattr((bg<<4)+text);
??? clrscr();
??? gotoxy(1,1);/*相對于當(dāng)前窗口*/
??? for(j=0;j<mx;j++)putch(196);
??? i=0;
??? while(i<my){
??????? gotoxy(1,i+2);
??????? printf(" %s ",menu[i]);
??????? i++;
??? }
??? i=bchoose;
??? for(j=0;j<mx;j++){
??????? gettext(lx+j,i+3,lx+j,i+3,t);
??????? t[1]=(BLACK<<4)+WHITE;
??????? puttext(lx+j,i+3,lx+j,i+3,t);
??? }
}
int BMenuChoose(int choose){/*分菜單選擇,并繪制*/
??? char *menu[MAX];
??? char *pt;/*儲存被分菜單暫時覆蓋部分的內(nèi)容*/
??? int my=0,lx,mx=0,bchoose=0,i,l,key;
??? switch(choose){/*@@@@@@@@@@@@@@添加分菜單需要在此處添加相應(yīng)代碼*/
??? case 0:/*分窗口0*/
??????? my=B0;/*此處用來設(shè)置分窗口共多少項(xiàng),B0為預(yù)處理*/
??????? for(i=0;i<B0;i++)menu[i]=bmenu_0[i];/*將bmenu_0指針數(shù)組所有指向的地址傳給menu指針數(shù)組*/
??????? lx=1;/*mx表示分菜單窗口左側(cè)x坐標(biāo)*/
??????? break;
??? case 1:/*分窗口1*/
??????? my=B1;
??????? for(i=0;i<B1;i++)menu[i]=bmenu_1[i];
??????? lx=1+strlen(mmenu[0])+2;
??????? break;
??? case 2:/*分窗口2*/
??????? my=B2;
??????? for(i=0;i<B2;i++)menu[i]=bmenu_2[i];
??????? lx=1+strlen(mmenu[0])+2;
??????? lx+=strlen(mmenu[1])+2;
??????? break;
??? }
??? i=0;
??? while(i<my){/*使mx為大小為最長字符串的長度*/
??????? l=strlen(menu[i]);
??????? if(mx<l)mx=l;
??????? i++;
??? }
??? mx+=2;/*是項(xiàng)目左右各一個空格*/
??? /*儲存被分菜單暫時覆蓋部分的內(nèi)容*/
??? pt=(char *)malloc(mx*(my+1)*2);/*my+1用意在于本菜單顯示時會多一行橫線*/
??? gettext(lx,2,lx+mx-1,(my+1)+1,pt);
??? BMenuPaint(menu,lx,mx,my,bchoose);
??? while(1){
??????? if(bioskey(1)){
??????????? key=bioskey(0);
??????????? switch(key){
??????????? case DOWN:
??????????????? bchoose=(bchoose<my-1)?bchoose+1:0;
??????????????? BMenuPaint(menu,lx,mx,my,bchoose);
??????????????? break;
??????????? case UP:
??????????????? bchoose=(bchoose>0)?bchoose-1:my-1;
??????????????? BMenuPaint(menu,lx,mx,my,bchoose);
??????????????? break;
??????????? case RIGHT:
??????????? case LEFT:
??????????????? free(pt);
??????????????? puttext(lx,2,lx+mx-1,(my+1)+1,pt);/*覆蓋區(qū)域復(fù)原*/
??????????????? return key;/*返回kay值*/
??????????? case ENTER:
??????????? case ESC:
??????????????? free(pt);
??????????????? puttext(lx,2,lx+mx-1,(my+1)+1,pt);/*覆蓋區(qū)域復(fù)原*/
??????????????? return;
??????????? }
??????? }
??? }
}
void ChooseMainMenu(int choose){/*主菜單選擇*/
??? int key=0,at=0;
??? MainMenuPaint(0);/*菜單項(xiàng)選擇自動設(shè)為0*/
??? key=BMenuChoose(0);
??? if(key==RIGHT || key==LEFT)at=1;
??? else at=0;
??? while(1){
??????? if(bioskey(1) || at){/*at為自動,此用意是讓切換分菜單切換加快*/
??????????? if(at!=1)key=bioskey(0);
??????????? switch(key){
??????????? case RIGHT:
??????????????? choose=(choose<M-1)?choose+1:0;
??????????????? MainMenuPaint(choose);
??????????????? key=BMenuChoose(choose);/*分菜單選擇調(diào)用*/
??????????????? /*返回值賦給key,是用來方便從*/
??????????????? if(key==RIGHT || key==LEFT)at=1;
??????????????? else at=0;
??????????????? break;
??????????? case LEFT:
??????????????? choose=(choose>0)?choose-1:M-1;
??????????????? MainMenuPaint(choose);
??????????????? key=BMenuChoose(choose);/*分菜單選擇調(diào)用*/
??????????????? if(key==RIGHT || key==LEFT)at=1;
??????????????? else at=0;
??????????????? break;
??????????? case ENTER:
??????????? case ESC:return;
??????????? }
??????? }
??? }
}
int main(){
??? int key,i;
??? MenuItem(mmenu,M,"HungryAnt","Author","Help");/*主菜單*/
??? /*用可變參數(shù)就是怎么爽,但字符串?dāng)?shù)量需要和M值相等,不能太多,僅支持一行顯示*/
??? MainMenuPaint(-1);/*菜單項(xiàng)選擇*/
??? MenuItem(bmenu_0,B0,"HungryAnt","I really","love you!!!","Good bye!");/*分菜單*/
??? MenuItem(bmenu_1,B1,"HungryAnt","abcdffff","1223312","567","HHHH");
??? MenuItem(bmenu_2,B2,"H","I","l","G","G","Good bye!");
??? window(1,2,80,25);
??? textattr((BLUE<<4)+WHITE);
??? clrscr();
??? /*for(i=0;i<B1;i++){
??????? printf(" %s /n",bmenu_1[i]);
??? }
??? getch(); */
??? cprintf("Press F1 to the Main Menu...");
??? while(1){
??????? if(bioskey(1)){
??????????? key=bioskey(0);
??????????? switch(key){
??????????? case F1:
??????????????? ChooseMainMenu(0);/*主菜單選擇,先設(shè)為0*/
??????????????? exit(1);
??????????? }
??????? }
??? }
??? getch();
}?
轉(zhuǎn)載于:https://www.cnblogs.com/gods/archive/2008/03/26/3887673.html
總結(jié)
以上是生活随笔為你收集整理的TC字符界面-菜单程序【原创】的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: SAP项目文档 清单 考核标准
- 下一篇: 什么是SEO策略呢