先上效果圖粪狼。
接下來(lái)你將學(xué)習(xí):將光標(biāo)定位于任何位置逞频,以及輸入密碼時(shí)用星號(hào)代替纯衍。
首先我們需要對(duì)控制臺(tái)的窗口有所了解。
默認(rèn)情況下苗胀,屏幕可以輸出300行完整的信息襟诸,但往往一屏只顯示25行,想要看到更多信息就得往下拉進(jìn)度條基协,一行有80列歌亲,這樣就可以得到300*80的矩陣圖。
<!-------預(yù)備知識(shí)完畢--------->
然后我們可以通過調(diào)用函數(shù)gotoxy(int x澜驮,int y)來(lái)把光標(biāo)移動(dòng)到想要的坐標(biāo)位置应结。
遺憾的是,gotoxy函數(shù)是包含在TC版本的conio.h里面的泉唁,(該版本下還有許多函數(shù)可以在控制臺(tái)中畫出圖形如正弦函數(shù)等)。
VS版本的conio.h里面沒有這個(gè)函數(shù)揩慕、亭畜、、迎卤、
沒有沒關(guān)系拴鸵,我們可以自己寫一個(gè)。
首先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); ? ? ?//兩個(gè)參數(shù)分別是指定哪個(gè)窗體蜗搔,什么位置劲藐?
}
是不是很熟悉呢,沒錯(cuò)啦樟凄,又回到我們親愛的HANDLE聘芜,這次新增了一個(gè)COORD類型,這是什么東東缝龄。
COORD是一個(gè)結(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)閥軸俺亮,也就是平時(shí)的直角坐標(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)移動(dòng)到密碼旁邊以便輸入苇倡。
輸入時(shí)以*代替明文富纸。
gotoxy(20,12);
char brr[16];
for(int i=0;i<15;)//此循環(huán)把每一個(gè)輸入的字符依次存到brr數(shù)組中
{
? ?while( ? ?(brr[i++]=_getch()) ? != ? 13 ? ? )//_getch()函數(shù)是包含在conio.h里面,直接讀進(jìn)去一個(gè)字符旨椒,并且不顯示在屏幕上
? ? {cout<<"*";} ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?//回車的ansic值是13
brr[--i]='\0';//輸入結(jié)束時(shí)晓褪,brr中包含了密碼和一個(gè)回車,i指向回車的下一個(gè)位置综慎,這步把回車置為'\0'
break;
}
到此程序基本算是完成了涣仿,當(dāng)然還有輸入時(shí)擔(dān)心數(shù)組越界的問題,這不在本次考慮范圍之內(nèi)示惊。
最后說一下_getch()函數(shù)好港,這個(gè)函數(shù)與getch()函數(shù)差不多,都是讀取輸入流的一個(gè)字符米罚,返回int類型钧汹,區(qū)別在于前者不把它回顯在屏幕上,即時(shí)輸入即時(shí)生效录择,在做小游戲的時(shí)候可以用用拔莱。
<!---------update----------->
現(xiàn)在密碼的輸入都會(huì)先顯示實(shí)際輸入數(shù)據(jù),然后再用星號(hào)代替隘竭。接下來(lái)塘秦,我們來(lái)試試。
基本思路是先輸出原始數(shù)據(jù)动看,等待用戶看到確認(rèn)之后尊剔,然后用'\b'退格鍵刪掉顯示的數(shù)據(jù)并且輸出星號(hào)。
代碼如下
分析一下菱皆,Sleep(X)函數(shù)是Windows.h里面的一個(gè)庫(kù)函數(shù)赋兵,可以讓程序暫停X毫秒。
cout<<"\b"能實(shí)現(xiàn)光標(biāo)向前移動(dòng)一位(但不改變?cè)撐恢玫臄?shù)據(jù))搔预,緊接著在該位置上輸出星號(hào)取代原始數(shù)據(jù)霹期。
注意到變量i的自增的位置也不同了。