先上效果圖。
接下來你將學(xué)習(xí):將光標(biāo)定位于任何位置,以及輸入密碼時用星號代替。
首先我們需要對控制臺的窗口有所了解。
默認(rèn)情況下,屏幕可以輸出300行完整的信息,但往往一屏只顯示25行,想要看到更多信息就得往下拉進(jìn)度條,一行有80列,這樣就可以得到300*80的矩陣圖。
<!-------預(yù)備知識完畢--------->
然后我們可以通過調(diào)用函數(shù)gotoxy(int x,int y)來把光標(biāo)移動到想要的坐標(biāo)位置。
遺憾的是,gotoxy函數(shù)是包含在TC版本的conio.h里面的,(該版本下還有許多函數(shù)可以在控制臺中畫出圖形如正弦函數(shù)等)。
VS版本的conio.h里面沒有這個函數(shù)、、、、
沒有沒關(guān)系,我們可以自己寫一個。
首先include<windows.h>
void gotoxy(int x, int y)
{
COORD pos = {x,y}; ? ? ? ? ? ? ? ? //設(shè)置光標(biāo)位置
HANDLE hOut = GetStdHandle(STD_OUTPUT_HANDLE); ? ?// 獲取標(biāo)準(zhǔn)輸出設(shè)備句柄
SetConsoleCursorPosition(hOut, pos); ? ? ?//兩個參數(shù)分別是指定哪個窗體,什么位置?
}
是不是很熟悉呢,沒錯啦,又回到我們親愛的HANDLE,這次新增了一個COORD類型,這是什么東東。
COORD是一個結(jié)構(gòu)體。
typedef struct _COORD{
SHORT ?X;
SHORT ?Y;
}COORD;
//X:橫坐標(biāo);
//Y:縱坐標(biāo)。
微軟最喜歡typedef了,基本上大寫的都是經(jīng)過typedef的,就像INVALID_HANDLE_VALUE事實(shí)上就是-1 ? ?@_@
這里補(bǔ)充說明一下,建立的坐標(biāo)系是以左上角為原點(diǎn),以水平方向?yàn)閤軸,以垂直方向?yàn)閥軸,也就是平時的直角坐標(biāo)系的第四象限。
這樣函數(shù)就寫好了,調(diào)用調(diào)用調(diào)用。
system("title login");
system("color 0A");
gotoxy(3,8);
cout<<"華南理工大學(xué)教務(wù)管理系統(tǒng)\n";
gotoxy(10,10);
cout<<"用戶名 :";
gotoxy(10,12);
cout<<"密 ?碼 :";
打印完這些以后,把光標(biāo)回到用戶名右邊以便輸入。
gotoxy(20,10);
char arr[16];
cin>>arr;
用戶輸入以后,把光標(biāo)移動到密碼旁邊以便輸入。
輸入時以*代替明文。
gotoxy(20,12);
char brr[16];
for(int i=0;i<15;)//此循環(huán)把每一個輸入的字符依次存到brr數(shù)組中
{
? ?while( ? ?(brr[i++]=_getch()) ? != ? 13 ? ? )//_getch()函數(shù)是包含在conio.h里面,直接讀進(jìn)去一個字符,并且不顯示在屏幕上
? ? {cout<<"*";} ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?//回車的ansic值是13
brr[--i]='\0';//輸入結(jié)束時,brr中包含了密碼和一個回車,i指向回車的下一個位置,這步把回車置為'\0'
break;
}
到此程序基本算是完成了,當(dāng)然還有輸入時擔(dān)心數(shù)組越界的問題,這不在本次考慮范圍之內(nèi)。
最后說一下_getch()函數(shù),這個函數(shù)與getch()函數(shù)差不多,都是讀取輸入流的一個字符,返回int類型,區(qū)別在于前者不把它回顯在屏幕上,即時輸入即時生效,在做小游戲的時候可以用用。
<!---------update----------->
現(xiàn)在密碼的輸入都會先顯示實(shí)際輸入數(shù)據(jù),然后再用星號代替。接下來,我們來試試。
基本思路是先輸出原始數(shù)據(jù),等待用戶看到確認(rèn)之后,然后用'\b'退格鍵刪掉顯示的數(shù)據(jù)并且輸出星號。
代碼如下
分析一下,Sleep(X)函數(shù)是Windows.h里面的一個庫函數(shù),可以讓程序暫停X毫秒。
cout<<"\b"能實(shí)現(xiàn)光標(biāo)向前移動一位(但不改變該位置的數(shù)據(jù)),緊接著在該位置上輸出星號取代原始數(shù)據(jù)。
注意到變量i的自增的位置也不同了。