┌ | 218 | ┐ | 191 |
─ | 196 | │ | 179 |
└ | 192 | ┘ | 217 |
定義常量:
int leftUa=218; | //左上角 |
int righUa=191; | //右上角 |
int leftDa=192; | //左下角 |
int righDa=217; | //右下角 |
int lineHc=196; | //橫線 |
int lineVc=179; | //豎線 |
畫菜單沒點(diǎn)顏色也顯得單調(diào),于是定義顏色
int MENUBACKCOLOR=7;//灰色
int MENUTEXTCOLOR=0;//黑色
菜單項(xiàng)的間距應(yīng)該固定,所以有
int MENULEFTEDGE=7;
int MENUDISTANCE=13;
行了,可以先畫個(gè)主菜單了
void drawMain()
{
gotoxy(1,1);//設(shè)定起始點(diǎn)坐標(biāo)
textbackground(MENUBACKCOLOR);//背景色設(shè)成菜單用背景色
textcolor(MENUTEXTCOLOR);//前景色設(shè)成菜單用前景色
insline();//將第一行用背景色填充
cprintf("%c%c%c",lineVc,4,lineVc);//輸出一個(gè)裝飾性圖案當(dāng)圖標(biāo)
gotoxy(MENULEFTEDGE,1);
cprintf("%c ML %c",17,16);//菜單項(xiàng)1
gotoxy(MENULEFTEDGE+MENUDISTANCE,1);
cprintf("%c AS %c",17,16);//菜單項(xiàng)2
gotoxy(MENULEFTEDGE+MENUDISTANCE*2,1);
cprintf("%c HL %c",17,16);//菜單項(xiàng)3
gotoxy(74,1);
cprintf(" EXIT ");//“退出”
textbackground(WINDOWBACKCOLOR);
textcolor(WINDOWTEXTCOLOR);//恢復(fù)顏色設(shè)置
}
上面的代碼里面有幾條要注意:
1)輸出字符的位置并不是確定的,可以酌情調(diào)試更改,總之要得到自己滿意的效果就多調(diào)試
2)開始畫菜單之前要更改顏色,畫完后一定要把顏色恢復(fù)回來,否則有時(shí)會(huì)出現(xiàn)很奇怪的現(xiàn)象
3)文本模式的屏幕被分成80*25格,每格放一個(gè)字符,坐標(biāo)是從(1,1)開始到(80,25)
有了第一個(gè)函數(shù),畫出了基本的菜單,現(xiàn)在該考慮畫菜單的選擇了。其實(shí)選擇也就是更改背景色和前景色之后,在原字符的位置重新輸出該字符就行了。其中mainIndex是菜單項(xiàng)的索引,用來表示選擇了哪個(gè)菜單項(xiàng)時(shí)使用的。
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);//到菜單項(xiàng)所在的坐標(biāo)
textbackground(SELBACKCOLOR);//設(shè)置顏色為“選擇”
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);//為什么這么畫呢?實(shí)話說:為了好看+偷懶
textbackground(WINDOWBACKCOLOR);
textcolor(WINDOWTEXTCOLOR);
}
選擇項(xiàng)移動(dòng)了怎么辦呢?需要一個(gè)UnSel函數(shù),將字符再畫回去(當(dāng)然重畫主菜單也可以,就是耗時(shí)耗資源),然后將菜單項(xiàng)的索引值改變,再調(diào)用Sel函數(shù)?;仡^一看,發(fā)現(xiàn)我用的也是偷懶的法子,重畫了主菜單。但是這方法只對主菜單可以用,子菜單會(huì)有很明顯的閃爍。
上面的代碼畫個(gè)菜單項(xiàng)不多的主菜單已經(jīng)足夠了,可是不夠完美。需要個(gè)子菜單的畫法。我想下拉式的子菜單不過是一個(gè)方框,里面輸出字符而已,那么一個(gè)畫方框的函數(shù)就是第一需要了:
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);
}
有了方框就可以算坐標(biāo),然后向里面寫字符了,只是正像前面所說的,子菜單不能沒有一個(gè)UnSel函數(shù)。可以自己酌情編寫。
畫菜單的函數(shù)都寫的差不多了,只缺一個(gè)調(diào)用這些函數(shù),并且判別菜單選擇的函數(shù),這里首先要有一個(gè)死循環(huán),用于接收消息;然后是判斷鍵盤輸入,都按下了那些鍵,按著鍵值來判斷該執(zhí)行什么功能,當(dāng)按下回車時(shí)尤其重要,這時(shí)就要根據(jù)菜單索引值來執(zhí)行程序的功能了,那當(dāng)然程序不是只畫個(gè)菜單就能了事的,只有菜單沒內(nèi)容,課設(shè)是過不去的。廢話少說看下面:
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是一個(gè)變量,它標(biāo)志著子菜單的狀態(tài)是已經(jīng)展開還是收著不動(dòng),不過沒什么大用,純是好看。上面的函數(shù)只是一小部分,本身函數(shù)太長,貼不下...
我自己的菜單里還有其他一些華而不實(shí)的東西,而且就是為了課設(shè)而專門作的,所以內(nèi)容和形式很雜亂,設(shè)計(jì)思想我覺得差不多就是這些了,重要的還是這些思想嘛。好了,話說得差不多了,想要源代碼的話請點(diǎn)擊此處或去Turbo C版的下載倉庫下載。
新聞熱點(diǎn)
疑難解答
圖片精選