国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > 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版的下載倉庫下載。  

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

圖片精選

主站蜘蛛池模板: 霍邱县| 体育| 泽库县| 措勤县| 开封县| 宁阳县| 依安县| 天气| 海原县| 元氏县| 乃东县| 广平县| 翼城县| 景德镇市| 建瓯市| 泗洪县| 富裕县| 道孚县| 通化市| 洛川县| 霍州市| 宾川县| 措勤县| 东山县| 伊通| 体育| 武汉市| 吉水县| 浠水县| 清镇市| 永修县| 镇雄县| 怀宁县| 昭苏县| 西贡区| 安徽省| 曲阳县| 周至县| 饶平县| 南涧| 莫力|