轉載:
http://topic.csdn.net/t/20061102/23/5129585.html自己動手制作
控制臺定位函數
大家一定都用過TC供給大家的光標定位,創建方框等函數,在我們眼里很神秘,現在我們就自己動手來制作。
一. 光標定位
首先我們通過MCDN可以找到這樣一個函數SetConsoleCursorPosition(),這個就是VC++提供的光標的定位函數,它的原形為
BOOL SetConsoleCursorPosition(
HANDLE hConsoleOutput,
COORD dwCursorPosition
);
BOOL :是一種類型(Boolean variable布爾變量),返回‘ 真 ’or‘ 假 ’;
HANDLE hConsoleOutput, 為輸出設備的句柄,和int、char一樣是一種類型
COORD dwCursorPosition,為光標的位置
接下來我們所要做的就是獲得輸出設備的句柄和設置光標的位置。
1. 獲得輸出設備的句柄
要獲得輸出設備的句柄就要用到函數GetStdHandle(),它的原形為:
HANDLE GetStdHandle(
DWORD nStdHandle // input, output, or error device
);
nStdHandle一共有3個值為STD_INPUT_HANDLE 輸入設備句柄, STD_OUTPUT_HANDLE 輸出設備句柄,STD_ERROR_HANDLE 錯誤句柄
所以我們要獲得輸出設備的句柄就要先定義個句柄然后將獲得的輸出設備的句柄賦值給所定義的句柄。如:HANDLE hCon = GetStdHandle(STD_OUTPUT_HANDLE);
2. 設置光標的位置
COORD的原形為:
typedef struct _COORD
{ // coord.
SHORT X; // horizontal coordinate
SHORT Y; // vertical coordinate
} COORD;
Typedef的含義就是把一種類型定義成另一種名字
e.g
typedef int zhengxing;
zhengxing nA; //等同于int nA;
從這里大家可以發現COORD為一個結構體類型,他含有X,Y兩個元素,所以我們就應該先定義一個COORD的結構體變量,然后對其元素進行賦值就可以完成對光標的設置。
這樣一個完整的光標定位函數我們就可以寫出來了。如下:
void goxy(int nX, int nY)
{
HANDLE hCon;//定義一個句柄
hCon = GetStdHandle(STD_OUTPUT_HANDLE); //獲得輸出設備的句柄
COORD setps; //定義結構體變量
setps.X = nX;
setps.Y = nY;
SetConsoleCursorPosition(hCon,setps); //定位
}
再調用時,我們只需輸入他的坐標就可以進行光標的定位了。
二.制作方框
大家現在都可以打印一個任意邊長的方框,只是無法將所打印的方框在屏幕的其他地方打印出來,我們現在有了光標的定位函數,只需在打印每個點的時候將光標定位到你想要的地方,就可以實現制作方框了。下面是我寫的一個制作方框的函數,大家可以參考下:
void frame(int x, int y, int width, int height)
{
for(int nI = 0; nI < height; nI++) //行數
{
for(int nJ = 0; nJ < width*2; nJ += 2) //列數,width*2中文符號占兩位
{
goxy(x + nJ, y + nI); //調用我們前面的函數進行光標的定位
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");
}
}
如果大家還想在方框上打印出標題,只需要在方框打印結束后,調用光標定位,定位到適當的位置進行打印,將兩個函數封裝成一個函數就可以實現了。我們還可以通過函數的重載實現輸入不同的參數打印不同的方框,如方框的顏色,文本的顏色等等;
三.其他的設置
1.文本顏色
函數的原形
BOOL SetConsoleTextAttribute(
HANDLE hConsoleOutput, // 控制臺的句柄
WORD wAttributes //文本和背景的顏色(0--15)
);
e.g
HANDLE hCon = GetStdHandle(STD_OUTPUT_HANDLE);
SetConsoleTextAttribute(hCon, 10);設置成綠色,一共有0--15種顏色
2. 執行清屏命令
這個函數比起書上的用空格來清除方框內容的方法要簡單多了
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); //獲得輸出設備的句柄
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為清除的范圍
四.總結
對于控制臺的設置還有很多,比如控制臺的標題設置等等,在MSDN上都有很詳細的說明。通過以上的介紹大家都可以做出自己的光標定位函數,在自己的設計中應用。別人能寫出來的,我們一樣能做出來,就向我們經常聽到的那樣“沒有做不出來的,只有想不到的”