转载:
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上都有很详细的说明。通过以上的介绍大家都可以做出自己的光标定位函数,在自己的设计中应用。别人能写出来的,我们一样能做出来,就向我们经常听到的那样“没有做不出来的,只有想不到的”