亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > Java > 正文

文本模式下菜單的實現

2019-09-06 23:33:31
字體:
來源:轉載
供稿:網友

                      

作者:KKnD

   

  近幾天翻出了上學期寫的計算機原理的課設程序,里面的菜單是用TC2.0寫的,雖然很簡陋,可擴充性幾乎沒有,但基本的功能還是都有的?;叵肫鸫笠坏臅r候想寫個菜單抓耳撓腮的窘像,心想對要寫課設需要菜單的同學們還是有一定幫助的。于是,設計思想和源代碼我就公開了。望各位高手不要取笑。

   

  一般用TC寫菜單需要包含conio.h,它提供了gotoxy()textbackground()等一系列有用的函數,至于判斷鍵盤輸入我喜歡使用bios.h里面的bioskey()函數,它可以精確判斷用戶究竟按下的是什么鍵。

   

#include <conio.h>
   #include <bios.h>

   
     菜單邊框就是由幾個基本的字符組成的,這下字符通常被人稱為“制表符”,這些字符無法直接由鍵盤輸入,而是由按住alt鍵,在數字小鍵盤上輸入字符對應的ascii碼,再松開alt鍵,就會出現選定的字符。

   

下表是常用的制表符和對應的ascii碼:

   
                                                                                                                                       
       

         ┌

       
       

         218

       
       

         ┐

       
       

         191

       
       

         ─

       
       

         196

       
       

         │

       
       

         179

       
       

         └

       
       

         192

       
       

         ┘

       
       

         217

       
   

定義常量:

                                                                                                                                                                               
       

         int leftUa=218;

       
//左上角
       

         int righUa=191;

       
//右上角
       

         int leftDa=192;

       
//左下角
       

         int righDa=217;

       
//右下角
       

         int lineHc=196;

       
//橫線
       

         int lineVc=179;

       
//豎線
   

畫菜單沒點顏色也顯得單調,于是定義顏色

   

int     MENUBACKCOLOR=7;//灰色
   int     MENUTEXTCOLOR=0;//黑色

   

菜單項的間距應該固定,所以有

   

int     MENULEFTEDGE=7;
   int MENUDISTANCE=13;

   

行了,可以先畫個主菜單了
 

   

void drawMain()
   {
    gotoxy(1,1);//設定起始點坐標
    textbackground(MENUBACKCOLOR);//背景色設成菜單用背景色
    textcolor(MENUTEXTCOLOR);//前景色設成菜單用前景色
    insline();//將第一行用背景色填充
    cprintf("%c%c%c",lineVc,4,lineVc);//輸出一個裝飾性圖案當圖標

   

 gotoxy(MENULEFTEDGE,1);
    cprintf("%c ML %c",17,16);//菜單項1
    gotoxy(MENULEFTEDGE+MENUDISTANCE,1);
    cprintf("%c AS %c",17,16);//菜單項2
    gotoxy(MENULEFTEDGE+MENUDISTANCE*2,1);
    cprintf("%c HL %c",17,16);//菜單項3
    gotoxy(74,1);
    cprintf("     EXIT ");//“退出”
    textbackground(WINDOWBACKCOLOR);
    textcolor(WINDOWTEXTCOLOR);//恢復顏色設置
   }

   

上面的代碼里面有幾條要注意:
   
   1)輸出字符的位置并不是確定的,可以酌情調試更改,總之要得到自己滿意的效果就多調試
   
   2)開始畫菜單之前要更改顏色,畫完后一定要把顏色恢復回來,否則有時會出現很奇怪的現象
   
   3)文本模式的屏幕被分成80*25格,每格放一個字符,坐標是從(1,1)開始到(80,25)

   

  有了第一個函數,畫出了基本的菜單,現在該考慮畫菜單的選擇了。其實選擇也就是更改背景色和前景色之后,在原字符的位置重新輸出該字符就行了。其中mainIndex是菜單項的索引,用來表示選擇了哪個菜單項時使用的。

   

void     drawMainSel(int mainIndex)
   {
    char*     mainText;
    int i=8;
    if(mainIndex==3)//到了“EXIT”了,特殊處理
    {
     gotoxy(74,1);
     textbackground(SELBACKCOLOR);
     for(i=0;i<=5;i++)
      cprintf("     ");
     textcolor(SELTEXTCOLOR);
     gotoxy(75,1);
     cprintf("EXIT");
     textbackground(WINDOWBACKCOLOR);
     textcolor(WINDOWTEXTCOLOR);
     return;
    }
    gotoxy(MENULEFTEDGE+MENUDISTANCE*mainIndex,1);//到菜單項所在的坐標
    textbackground(SELBACKCOLOR);//設置顏色為“選擇”
    for(i=0;i<=7;i++)
     cprintf(" ");//清除原來的字符
    textcolor(SELARROWCOLOR);
    gotoxy(MENULEFTEDGE+MENUDISTANCE*mainIndex,1);
    cprintf("%c   %c",4,4);
    textcolor(SELTEXTCOLOR);
    gotoxy(10+MENUDISTANCE*mainIndex,1);
    switch(mainIndex)
    {
     case 0:
      mainText="ML";
      break;
     case 1:
      mainText="AS";
      break;
     case 2:
      mainText="HL";
      break;
    }
    cprintf("%s",mainText);//為什么這么畫呢?實話說:為了好看+偷懶
    textbackground(WINDOWBACKCOLOR);
    textcolor(WINDOWTEXTCOLOR);
   }

   

  選擇項移動了怎么辦呢?需要一個UnSel函數,將字符再畫回去(當然重畫主菜單也可以,就是耗時耗資源),然后將菜單項的索引值改變,再調用Sel函數?;仡^一看,發現我用的也是偷懶的法子,重畫了主菜單。但是這方法只對主菜單可以用,子菜單會有很明顯的閃爍。

   

  上面的代碼畫個菜單項不多的主菜單已經足夠了,可是不夠完美。需要個子菜單的畫法。我想下拉式的子菜單不過是一個方框,里面輸出字符而已,那么一個畫方框的函數就是第一需要了:

   

void     drawDrop(int rowSize,int Rows,int cellX,int cellY)
   {
    int i=1;
    int j=1;
    textbackground(MENUBACKCOLOR);
    textcolor(MENUTEXTCOLOR);

   

 gotoxy(cellX,cellY);
    cprintf("%c",leftUa);//畫左上角
    for(j=1;j<=rowSize;j++)
     cprintf("%c",lineHc);//一行多寬,就畫多長的橫線
    cprintf("%c",righUa);//畫右上角

   

 for(i=1;i<=Rows;i++)
    {
     cellY++;
     gotoxy(cellX,cellY);
     cprintf("%c",lineVc);
     for(j=1;j<=rowSize;j++)
      cprintf(" ");
     cprintf("%c",lineVc);
    }//畫上下邊框之間的部分

   

 cellY++;
    gotoxy(cellX,cellY);
    cprintf("%c",leftDa);
    for(i=1;i<=rowSize;i++)
     cprintf("%c",lineHc);
    cprintf("%c",righDa);//畫下邊框
    textbackground(WINDOWBACKCOLOR);
    textcolor(WINDOWTEXTCOLOR);
   }

   

  有了方框就可以算坐標,然后向里面寫字符了,只是正像前面所說的,子菜單不能沒有一個UnSel函數。可以自己酌情編寫。

   

  畫菜單的函數都寫的差不多了,只缺一個調用這些函數,并且判別菜單選擇的函數,這里首先要有一個死循環,用于接收消息;然后是判斷鍵盤輸入,都按下了那些鍵,按著鍵值來判斷該執行什么功能,當按下回車時尤其重要,這時就要根據菜單索引值來執行程序的功能了,那當然程序不是只畫個菜單就能了事的,只有菜單沒內容,課設是過不去的。廢話少說看下面:

   

int i=0;//接受輸入的鍵值用
   int j=0;//主菜單索引
   int k=0;//子菜單索引
   clrscr();
   drawMain();
   drawClear();
   drawMainSel(j);//菜單初始化
   while(1)
   {
    i=bioskey(0);//等待鍵盤輸入
    switch(i)
    {
     case     19712://用戶按下“左箭頭”
      j++;
      if(j==4)     j=0;
      drawMain();
      drawClear();
      drawMainSel(j);
      if(MENUSHOWN==TRUE)
      {
       k=0;
       drawSub(j);
       drawSubSel(j,k);
      }
      break;
   ...
   ...
   ...

   

  MENUSHOWN是一個變量,它標志著子菜單的狀態是已經展開還是收著不動,不過沒什么大用,純是好看。上面的函數只是一小部分,本身函數太長,貼不下...

   

  我自己的菜單里還有其他一些華而不實的東西,而且就是為了課設而專門作的,所以內容和形式很雜亂,設計思想我覺得差不多就是這些了,重要的還是這些思想嘛。好了,話說得差不多了,想要源代碼的話請點擊此處或去Turbo     C版的下載倉庫下載。  

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表

圖片精選

亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
久久精品亚洲国产| 欧美成人合集magnet| 国产欧美欧洲在线观看| 亚洲欧美国产日韩天堂区| 亚洲一区二区三区四区在线播放| 欧美性xxxx在线播放| 国产成人aa精品一区在线播放| 粗暴蹂躏中文一区二区三区| 狠狠综合久久av一区二区小说| 亚洲国产成人一区| 亚洲欧美色图片| 亚洲国内精品在线| 日韩在线激情视频| 日韩免费精品视频| 日本乱人伦a精品| 91在线观看免费观看| 国产精品成人观看视频国产奇米| 国产精品高清在线| 精品国产一区久久久| 91美女片黄在线观| 亚洲人成亚洲人成在线观看| 亚洲成人av资源网| 91日韩在线视频| 色香阁99久久精品久久久| 国产精品视频成人| 欧洲亚洲免费在线| 成人一区二区电影| 亚洲欧美在线免费观看| 亚洲国内精品视频| 日韩av免费在线观看| 亚洲精品国产综合区久久久久久久| 欧美一级bbbbb性bbbb喷潮片| 精品久久久久久亚洲精品| 日韩视频亚洲视频| 亚洲欧美在线一区二区| 国产精品永久免费观看| 2025国产精品视频| www.日韩视频| 欧美不卡视频一区发布| 91日韩在线视频| 欧美综合在线观看| 在线看欧美日韩| 亚洲欧美在线第一页| 久久影院免费观看| 亚洲精品videossex少妇| 欧美裸体男粗大视频在线观看| 久久视频在线直播| 久久久999成人| 92国产精品视频| 国产一区二区三区日韩欧美| 少妇高潮久久久久久潘金莲| 国产精品大陆在线观看| 国产欧美精品一区二区| 情事1991在线| 亚洲综合色av| 91在线观看免费网站| 欧美国产日韩一区二区| 91精品国产综合久久男男| 91精品久久久久久久久青青| 国产成人啪精品视频免费网| 亚洲国产精品成人va在线观看| 国产视频亚洲视频| 欧美成人免费视频| 91成人国产在线观看| 在线播放精品一区二区三区| 久久亚洲春色中文字幕| 555www成人网| 色先锋资源久久综合5566| 亚洲一区二区三区在线视频| 亚洲免费中文字幕| 一二美女精品欧洲| 91精品国产高清| 中文在线资源观看视频网站免费不卡| 激情久久av一区av二区av三区| 亚洲丝袜一区在线| 久久人人爽人人爽人人片亚洲| 国产91精品青草社区| 国产精品狠色婷| 久久色在线播放| 992tv成人免费影院| 一区二区三区精品99久久| 色偷偷91综合久久噜噜| 国产精品久久久久久久一区探花| 亚洲精品在线91| 一区二区福利视频| 精品性高朝久久久久久久| 6080yy精品一区二区三区| 欧美激情a∨在线视频播放| 国产中文字幕91| 欧美日韩另类在线| 日韩免费中文字幕| 欧美日韩xxxxx| 国产精品女主播| 日韩成人av在线播放| 热久久免费视频精品| 国产精品爽爽ⅴa在线观看| 久久久久久久久久久久av| 欧美精品videosex性欧美| 精品久久香蕉国产线看观看亚洲| 精品视频一区在线视频| 午夜精品久久17c| 欧美一级大片在线观看| 久久天天躁狠狠躁夜夜躁2014| 欧美性xxxxxx| 国产噜噜噜噜久久久久久久久| 久久精品91久久香蕉加勒比| 中文欧美在线视频| 精品久久久久久久大神国产| 亚洲欧洲xxxx| 永久555www成人免费| 国产精品福利久久久| 国产91成人video| 久久免费视频网| 亚洲激情成人网| 91精品久久久久久久久青青| 久久这里有精品视频| 色香阁99久久精品久久久| 亚洲精品av在线| 亚洲а∨天堂久久精品9966| 91精品国产高清久久久久久| 亚洲视频自拍偷拍| 欧美另类第一页| 国产精品丝袜视频| 欧美老女人www| 国产精品久久97| 狠狠色狠色综合曰曰| 最近中文字幕mv在线一区二区三区四区| 亚洲电影免费在线观看| 亚洲精品美女在线| 精品无人国产偷自产在线| 日韩国产精品一区| 性欧美xxxx视频在线观看| 色悠悠国产精品| 日韩av片电影专区| 久久免费视频网| 中文字幕一区二区精品| 久久精品国产精品| 国产精品三级久久久久久电影| 亚洲国产天堂久久国产91| 久久久噜噜噜久久久| 亚洲国产精品网站| 性色av一区二区三区红粉影视| 国产精品永久免费| 91精品国产免费久久久久久| 欧美精品在线第一页| 国产欧美精品在线| 国产精品96久久久久久又黄又硬| 一区二区三区精品99久久| 主播福利视频一区| 日韩暖暖在线视频| 色午夜这里只有精品| 久久久久久亚洲精品不卡| 国产精品va在线播放我和闺蜜| 欧美精品手机在线| 亚洲一区二区三区毛片| 精品国产一区二区三区久久久| 国产一区二区香蕉| 欧美亚州一区二区三区| 日日狠狠久久偷偷四色综合免费| 成人激情免费在线| 国产免费久久av| 57pao精品| 96精品视频在线| 亚洲国产成人在线播放|