赞
踩
了解控制台API函数,首先得了解 句柄 HANDL 和 控制台API 结构体 。
HANDLE 翻译为 手柄、把手。用在windows开发中,很形象。当抓住(获得)了一个设备的HANDLE(句柄) ,那么就基本可以控制这个设备了。
HANDLE 是一个无类型指针变量,那就是内存地址。在WinNT.h中定义
typedef void *HANDLE;
这里大概知道HANDLE的作用就行了,具体的可以查看句柄的百度百科
这里只介绍本文中用到的结构体
定义 :定义控制台屏幕缓冲区中字符单元的坐标。 坐标系 (0,0) 的原点位于缓冲区的顶部左侧单元格。
typedef struct _COORD {
SHORT X; //水平坐标或列值。 单位取决于函数调用。
SHORT Y; //垂直坐标或行值。 单位取决于函数调用。
} COORD, *PCOORD;
typedef struct _CONSOLE_CURSOR_INFO {
DWORD dwSize; //光标的大小
BOOL bVisible; //光标是否可以
} CONSOLE_CURSOR_INFO, *PCONSOLE_CURSOR_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章节。
说明 : 检索指定标准设备的句柄(标准输入、标准输出或标准错误),
原型 :
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操作,就是对窗体的操作
说明 :获取光标信息
原型 :
BOOL WINAPI GetConsoleCursorInfo(
HANDLE hConsoleOutput, //窗体句柄
PCONSOLE_CURSOR_INFO lpConsoleCursorInfo //光标信息指针,获取到的光标信息就存放在这个指针中
);
说明 :设置光标的大小和可见性
原型 :
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; }
## 设置
说明 :设置光标在窗体的位置。
有了这个函数,就不必一行一行的输出了,可以自由的定位到窗体的任何位置。这个函数在开发控制台小游戏时,总是会用到。
原型:
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; }
测试结果 :
说明:获取屏幕缓冲区的信息
区别于窗体,屏幕缓冲区,包括滚动条拉动能看到的区域
原型 :
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; }
示例结果:
说明: 设置控制台文本属性(颜色),可以设置前景色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; }
说明 :设置当前控制台窗口的标题。
原型:
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; }
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。