目录
- 前言
- 1. 句柄 HANDLE
- 2. 控制台API结构体
- 2.1 坐标结构 COORD
- 2.2 光标信息结构 CONSOLE_CURSOR_INFO
- 2.3 控制台屏幕缓冲区信息结构 CONSOLE_SCREEN_BUFFER_INFO
- 3. 控制台API函数
- 3.1 获取句柄 GetStdHandle
- 3.2 获取光标信息 GetConsoleCursorInfo
- 3.3 设置光标信息SetConsoleCursorInfo
- 3.4 设置光标位置 SetConsoleCursorPosition
- 3.5 获取屏幕缓冲区的信息 GetConsoleScreenBufferInfo
- 3.6 设置文本属性 SetConsoleTextAttribute
- 3.7 设置标题 SetConsoleTitle
前言
了解控制台API函数,首先得了解 句柄 HANDL 和 控制台API 结构体 。
1. 句柄 HANDLE
HANDLE 翻译为 手柄、把手。用在windows开发中,很形象。当抓住(获得)了一个设备的HANDLE(句柄) ,那么就基本可以控制这个设备了。
HANDLE 是一个无类型指针变量,那就是内存地址。在WinNT.h中定义
typedef void *HANDLE;
这里大概知道HANDLE的作用就行了,具体的可以查看句柄的百度百科
2. 控制台API结构体
这里只介绍本文中用到的结构体
2.1 坐标结构 COORD
定义 :定义控制台屏幕缓冲区中字符单元的坐标。 坐标系 (0,0) 的原点位于缓冲区的顶部左侧单元格。
typedef struct _COORD {
SHORT X; //水平坐标或列值。 单位取决于函数调用。
SHORT Y; //垂直坐标或行值。 单位取决于函数调用。
} COORD, *PCOORD;
2.2 光标信息结构 CONSOLE_CURSOR_INFO
typedef struct _CONSOLE_CURSOR_INFO {
DWORD dwSize; //光标的大小
BOOL bVisible; //光标是否可以
} CONSOLE_CURSOR_INFO, *PCONSOLE_CURSOR_INFO;
2.3 控制台屏幕缓冲区信息结构 CONSOLE_SCREEN_BUFFER_INFO
typedef struct _CONSOLE_SCREEN_BUFFER_INFO {
COORD dwSize; //控制台屏幕缓冲区大小 ,这里区别于窗体大小,屏幕缓冲区包括滚动条拉动后能看到的区域
COORD dwCursorPosition; //屏幕中光标的坐标
WORD wAttributes; //字符的属性(其实就是颜色代码,默认值为07,即黑色背景,白色字体)。 WORD是 unsigned short 类型。在32位系统中为16位长度,62位系统中未 32位
SMALL_RECT srWindow; //包含显示窗口左上角和右下角的控制台屏幕坐标的 SMALL_RECT 结构
COORD dwMaximumWindowSize; //包含控制台窗口的最大大小(以字符列和行为单位),给定当前屏幕缓冲区的大小和字体以及屏幕大小
} CONSOLE_SCREEN_BUFFER_INFO;
这个结构体的变量可以通过GetConsoleScreenBufferInfo函数获取,详情见3.5章节。
3. 控制台API函数
3.1 获取句柄 GetStdHandle
说明 : 检索指定标准设备的句柄(标准输入、标准输出或标准错误),
原型 :
HANDLE WINAPI GetStdHandle(_In_ DWORD nStdHandl);
返回值 :标准设备的句柄(即标准设备的在内存的映射地址)
参数:nStdHandle是DWORD类型的值,一共就三种
值 | 实际值 | 含义 |
---|---|---|
STD_INPUT_HANDLE | -10 | 标准输入设备,通常就是键盘 |
STD_OUTPUT_HANDLE | -11 | 标准输出设备 ,通常就是窗体、屏幕等 |
STD_ERROR_HANDLE | -12 | 标准错误设备,通常就是窗体、屏幕等 |
调用 :
HANDLE handle_output = GetStdHandle(STD_OUTPUT_HANDLE);// 这就获取了console窗体的句柄,此时对handle_output操作,就是对窗体的操作
3.2 获取光标信息 GetConsoleCursorInfo
说明 :获取光标信息
原型 :
BOOL WINAPI GetConsoleCursorInfo(
HANDLE hConsoleOutput, //窗体句柄
PCONSOLE_CURSOR_INFO lpConsoleCursorInfo //光标信息指针,获取到的光标信息就存放在这个指针中
);
3.3 设置光标信息SetConsoleCursorInfo
说明 :设置光标的大小和可见性
原型 :
BOOL WINAPI SetConsoleCursorInfo(
HANDLE hConsoleOutput, // 窗体的句柄
const CONSOLE_CURSOR_INFO *lpConsoleCursorInfo //光标的结构信息
);
示例:
#include <stdio.h>
#include <Windows.h>
#include <conio.h>
int main()
{
HANDLE handle_out = GetStdHandle(STD_OUTPUT_HANDLE); //获得标准输出设备句柄
CONSOLE_CURSOR_INFO cci; //定义光标信息结构体
GetConsoleCursorInfo(handle_out, &cci); //获得当前光标信息
printf("当前光标大小为%d:\n",cci.dwSize);
printf("四秒后设置光标大小为1:\n");
Sleep(4*1000);
cci.dwSize = 1; //设置光标尺寸为1
SetConsoleCursorInfo(handle_out, &cci);
printf("四秒后设置光标大小为50:\n");
Sleep(4*1000);
cci.dwSize = 50; //设置光标尺寸为50
SetConsoleCursorInfo(handle_out, &cci);
printf("四秒后设置光标大小为100:\n");
Sleep(4*1000);
cci.dwSize = 100; //设置光标尺寸为100
SetConsoleCursorInfo(handle_out, &cci);
printf("四秒后光标消失...");
Sleep(4*1000);
cci.bVisible = 0; //设置光标为不可见
SetConsoleCursorInfo(handle_out, &cci);
getchar();
return 0;
}
## 设置
3.4 设置光标位置 SetConsoleCursorPosition
说明 :设置光标在窗体的位置。
有了这个函数,就不必一行一行的输出了,可以自由的定位到窗体的任何位置。这个函数在开发控制台小游戏时,总是会用到。
原型:
BOOL WINAPI SetConsoleCursorPosition(
HANDLE hConsoleOutput, //窗体句柄
COORD dwCursorPosition //设置的光标坐标
);
示例:
#include <stdio.h>
#include <Windows.h>
#include <conio.h>
/*设置光标位置*/
void SetConsoleCursorPositionTest(int x, int y)
{
COORD pos = {x, y};/* x是横坐标 y是纵坐标 */
HANDLE handle_output = GetStdHandle(STD_OUTPUT_HANDLE);
SetConsoleCursorPosition(handle_output,pos); /* 设置控制台光标坐标(设备句柄, 光标坐标) */
printf("光标到这里了");
}
int main()
{
SetConsoleCursorPositionTest(23, 2);
getchar();
return 0;
}
测试结果 :
3.5 获取屏幕缓冲区的信息 GetConsoleScreenBufferInfo
说明:获取屏幕缓冲区的信息
区别于窗体,屏幕缓冲区,包括滚动条拉动能看到的区域
原型 :
BOOL WINAPI GetConsoleScreenBufferInfo(
HANDLE hConsoleOutput, //控制台句柄
PCONSOLE_SCREEN_BUFFER_INFO lpConsoleScreenBufferInfo //屏幕缓冲区信息指针
);
示例:
#include <stdio.h>
#include <Windows.h>
#include <conio.h>
//测试 获取控制台屏幕缓冲区信息GetConsoleScreenBufferInfo()函数
void GetConsoleScreenBufferInfoTest ()
{
CONSOLE_SCREEN_BUFFER_INFO scr;
HANDLE handle_output = GetStdHandle(STD_OUTPUT_HANDLE); /* 获取标准输出句柄 */
GetConsoleScreenBufferInfo(handle_output, &scr);
printf("\n当前光标坐标:x=%d y=%d\n\n", scr.dwCursorPosition.X, scr.dwCursorPosition.Y);
printf("窗体最大:宽=%d,高=%d\n\n",scr.dwMaximumWindowSize.X, scr.dwMaximumWindowSize.Y);
printf("屏幕缓冲区: 宽=%d 高=%d\n\n",scr.dwSize.X, scr.dwSize.Y);//这里的高的值很大,因为我们肉眼见到的只是窗体的高,
//不是屏幕缓冲区的高,拉动滚动条能够看到的区域才是
printf("窗体左上角坐标: x=%d y=%d\n\n", scr.srWindow.Left,scr.srWindow.Top);
printf("窗体右下角坐标: x=%d y=%d\n\n", scr.srWindow.Right,scr.srWindow.Bottom );
printf("字符属性:%d\n",scr.wAttributes); //字符的属性(颜色代码)
}
int main()
{
GetConsoleScreenBufferInfoTest ();
getchar();
return 0;
}
示例结果:
3.6 设置文本属性 SetConsoleTextAttribute
说明: 设置控制台文本属性(颜色),可以设置前景色FOREGROUND(文本颜色)和背景色BACKGROUND。有了这个控制台 就不在是黑底白字了,那么单调了。
原型 :
BOOL WINAPI SetConsoleTextAttribute(
_In_ HANDLE hConsoleOutput, //控制台句柄
_In_ WORD wAttributes //无符号短整型的颜色码
);
c语言只有16种颜色,颜色码如下:
0=黑色 8=灰色
1=蓝色 9=淡蓝色
2=绿色 10=淡绿色 0xa
3=湖蓝色 11=淡浅绿色 0xb
4=红色 12=淡红色 0xc
5=紫色 13=淡紫色 0xd
6=黄色 14=淡黄色 0xe
7=白色 15=亮白色 0xf
第二个参数 wAttributes(颜色属性)使用方式有三种:
a. 使用十六进制方式
因为wAttributes是WORD类型(unsigned short)所以为16位,如0x16。其中高阶位为背景色
低阶位为前景色(字体颜色)
SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), 0x16);//这里的0x16中的1代表蓝色背景色,6代表金色前景色)
可以参照以下的16进制颜色对照表
b. 使用10进制方式
SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), 26);
3. 使用宏定义方式
SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), BACKGROUND_GREEN|FOREGROUND_BLUE);//使用绿色背景色和蓝色前景色
常用的宏定义的如下:
#define FOREGROUND_BLUE 0x0001 // text color contains blue.
#define FOREGROUND_GREEN 0x0002 // text color contains green.
#define FOREGROUND_RED 0x0004 // text color contains red.
#define FOREGROUND_INTENSITY 0x0008 // text color is intensified.
#define BACKGROUND_BLUE 0x0010 // background color contains blue.
#define BACKGROUND_GREEN 0x0020 // background color contains green.
#define BACKGROUND_RED 0x0040 // background color contains red.
#define BACKGROUND_INTENSITY 0x0080 // background color is intensified.
#define COMMON_LVB_LEADING_BYTE 0x0100 // Leading Byte of DBCS
#define COMMON_LVB_TRAILING_BYTE 0x0200 // Trailing Byte of DBCS
#define COMMON_LVB_GRID_HORIZONTAL 0x0400 // DBCS: Grid attribute: top horizontal.
#define COMMON_LVB_GRID_LVERTICAL 0x0800 // DBCS: Grid attribute: left vertical.
#define COMMON_LVB_GRID_RVERTICAL 0x1000 // DBCS: Grid attribute: right vertical.
#define COMMON_LVB_REVERSE_VIDEO 0x4000 // DBCS: Reverse fore/back ground attribute.
#define COMMON_LVB_UNDERSCORE 0x8000 // DBCS: Underscore.
基础色
以COMMON开头的宏变量,只有在64位系统下才能生效。因为64位系统,WORD是32位的。
示例:
#include <stdio.h>
#include <Windows.h>
#include <conio.h>
//设置控制台文本属性(颜色)
void SetConsoleTextAttributeTest()
{
HANDLE handle_output = GetStdHandle(STD_OUTPUT_HANDLE); /* 获取标准输出句柄 */
SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), 0x16);//这里的0x16中的1代表蓝色背景色,6代表金色前景色)
printf("\n方式1,十六进制方式: SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), 0x16) \n");
SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), 26);
printf("\n方式2,十进制方式: SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), 26); \n");
SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), BACKGROUND_GREEN|FOREGROUND_RED);
printf("\n方式3,宏定义方式: SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), BACKGROUND_GREEN|FOREGROUND_RED)");
SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), FOREGROUND_RED);
printf("\n\n我是红色字体");
}
int main()
{
GetConsoleScreenBufferInfoTest ();
getchar();
return 0;
}
3.7 设置标题 SetConsoleTitle
说明 :设置当前控制台窗口的标题。
原型:
BOOL WINAPI SetConsoleTitle(
_In_ LPCTSTR lpConsoleTitle
);
示例:
#include <stdio.h>
#include <Windows.h>
#include <conio.h>
//设置控制台文本属性(颜色)
void SetConsoleTitleTest()
{
HANDLE handle_output = GetStdHandle(STD_OUTPUT_HANDLE); /* 获取标准输出句柄 */
SetConsoleTitle("控制台API练习V1.0");
}
int main()
{
GetConsoleScreenBufferInfoTest (); //使用的是3.6章节的测试
SetConsoleTitleTest();
getchar();
return 0;
}