轉(zhuǎn)載:
http://topic.csdn.net/t/20061102/23/5129585.html自己動手制作
控制臺定位函數(shù)
大家一定都用過TC供給大家的光標定位,創(chuàng)建方框等函數(shù),在我們眼里很神秘,現(xiàn)在我們就自己動手來制作。
一. 光標定位
首先我們通過MCDN可以找到這樣一個函數(shù)SetConsoleCursorPosition(),這個就是VC++提供的光標的定位函數(shù),它的原形為
BOOL SetConsoleCursorPosition(
HANDLE hConsoleOutput,
COORD dwCursorPosition
);
BOOL :是一種類型(Boolean variable布爾變量),返回‘ 真 ’or‘ 假 ’;
HANDLE hConsoleOutput, 為輸出設(shè)備的句柄,和int、char一樣是一種類型
COORD dwCursorPosition,為光標的位置
接下來我們所要做的就是獲得輸出設(shè)備的句柄和設(shè)置光標的位置。
1. 獲得輸出設(shè)備的句柄
要獲得輸出設(shè)備的句柄就要用到函數(shù)GetStdHandle(),它的原形為:
HANDLE GetStdHandle(
DWORD nStdHandle // input, output, or error device
);
nStdHandle一共有3個值為STD_INPUT_HANDLE 輸入設(shè)備句柄, STD_OUTPUT_HANDLE 輸出設(shè)備句柄,STD_ERROR_HANDLE 錯誤句柄
所以我們要獲得輸出設(shè)備的句柄就要先定義個句柄然后將獲得的輸出設(shè)備的句柄賦值給所定義的句柄。如:HANDLE hCon = GetStdHandle(STD_OUTPUT_HANDLE);
2. 設(shè)置光標的位置
COORD的原形為:
typedef struct _COORD
{ // coord.
SHORT X; // horizontal coordinate
SHORT Y; // vertical coordinate
} COORD;
Typedef的含義就是把一種類型定義成另一種名字
e.g
typedef int zhengxing;
zhengxing nA; //等同于int nA;
從這里大家可以發(fā)現(xiàn)COORD為一個結(jié)構(gòu)體類型,他含有X,Y兩個元素,所以我們就應(yīng)該先定義一個COORD的結(jié)構(gòu)體變量,然后對其元素進行賦值就可以完成對光標的設(shè)置。
這樣一個完整的光標定位函數(shù)我們就可以寫出來了。如下:
void goxy(int nX, int nY)
{
HANDLE hCon;//定義一個句柄
hCon = GetStdHandle(STD_OUTPUT_HANDLE); //獲得輸出設(shè)備的句柄
COORD setps; //定義結(jié)構(gòu)體變量
setps.X = nX;
setps.Y = nY;
SetConsoleCursorPosition(hCon,setps); //定位
}
再調(diào)用時,我們只需輸入他的坐標就可以進行光標的定位了。
二.制作方框
大家現(xiàn)在都可以打印一個任意邊長的方框,只是無法將所打印的方框在屏幕的其他地方打印出來,我們現(xiàn)在有了光標的定位函數(shù),只需在打印每個點的時候?qū)⒐鈽硕ㄎ坏侥阆胍牡胤剑涂梢詫崿F(xiàn)制作方框了。下面是我寫的一個制作方框的函數(shù),大家可以參考下:
void frame(int x, int y, int width, int height)
{
for(int nI = 0; nI < height; nI++) //行數(shù)
{
for(int nJ = 0; nJ < width*2; nJ += 2) //列數(shù),width*2中文符號占兩位
{
goxy(x + nJ, y + nI); //調(diào)用我們前面的函數(shù)進行光標的定位
if(nI == 0 || nJ == width*2 - 2 || nJ == 0 || nI == height - 1) //只打印四個邊
{
if(nI == 0 && nJ == 0 ) //左上的拐角
{
printf("┏");
}
else if(nI == 0 && nJ == width * 2 - 2)
{
printf("┓");//右上的拐角
}
else if(nI == height - 1 && nJ == 0)
{
printf("┗");//左下的拐角
}
else if(nI == height - 1 && nJ == width*2 - 2)
{
printf("┛");//右下的拐角
}
else if(nI == 0 || nI == height - 1)
{
printf("━");
}
else
{
printf("┃");
}
}
}
printf("\n");
}
}
如果大家還想在方框上打印出標題,只需要在方框打印結(jié)束后,調(diào)用光標定位,定位到適當?shù)奈恢眠M行打印,將兩個函數(shù)封裝成一個函數(shù)就可以實現(xiàn)了。我們還可以通過函數(shù)的重載實現(xiàn)輸入不同的參數(shù)打印不同的方框,如方框的顏色,文本的顏色等等;
三.其他的設(shè)置
1.文本顏色
函數(shù)的原形
BOOL SetConsoleTextAttribute(
HANDLE hConsoleOutput, // 控制臺的句柄
WORD wAttributes //文本和背景的顏色(0--15)
);
e.g
HANDLE hCon = GetStdHandle(STD_OUTPUT_HANDLE);
SetConsoleTextAttribute(hCon, 10);設(shè)置成綠色,一共有0--15種顏色
2. 執(zhí)行清屏命令
這個函數(shù)比起書上的用空格來清除方框內(nèi)容的方法要簡單多了
BOOL FillConsoleOutputCharacter(
HANDLE hConsoleOutput, // handle to screen buffer
TCHAR cCharacter, // character to write 要寫入的字符
DWORD nLength, // number of character cells to write to寫入多少個單元
COORD dwWriteCoord, // x- and y-coordinates of first cell 起始的單元
LPDWORD lpNumberOfCharsWritten
// pointer to number of cells written to
);
e.g
DWORD nBytesWrite;
CONSOLE_SCREEN_BUFFER_INFO ConInfo; //定義一個控制臺的信息變量
HANDLE hCon = GetStdHandle(STD_OUTPUT_HANDLE); //獲得輸出設(shè)備的句柄
GetConsoleScreenBufferInfo(hCon, & ConInfo);//獲得控制臺的信息
CurPos.X = ConInfo.srWindow.Left; //屏幕最左邊的X坐標
CurPos.Y = ConInfo.srWindow.Top; //屏幕最上邊的Y坐標
FillConsoleOutputCharacter(hCon, 0x20, ConInfo.dwSize.X*ConInfo.dwSize.Y, CurPos, & nBytesWrite);
0x20為空格,為16進制的ASC碼值,ConInfo.dwSize.X*ConInfo.dwSize.Y為清除的范圍
四.總結(jié)
對于控制臺的設(shè)置還有很多,比如控制臺的標題設(shè)置等等,在MSDN上都有很詳細的說明。通過以上的介紹大家都可以做出自己的光標定位函數(shù),在自己的設(shè)計中應(yīng)用。別人能寫出來的,我們一樣能做出來,就向我們經(jīng)常聽到的那樣“沒有做不出來的,只有想不到的”